มีวิธีการบูตโทรศัพท์ Android * จากไดรฟ์ USB ที่ขับเคลื่อนด้วยบัสหรือไม่? ถ้าเป็นเช่นนั้นอะไรคือขั้นตอนในการบรรลุเป้าหมายนี้?
* ตัวอย่างหนึ่งที่มีฟังก์ชั่น USB OTG
** เช่นแฟลชไดรฟ์
มีวิธีการบูตโทรศัพท์ Android * จากไดรฟ์ USB ที่ขับเคลื่อนด้วยบัสหรือไม่? ถ้าเป็นเช่นนั้นอะไรคือขั้นตอนในการบรรลุเป้าหมายนี้?
* ตัวอย่างหนึ่งที่มีฟังก์ชั่น USB OTG
** เช่นแฟลชไดรฟ์
คำตอบ:
โปรดอธิบายว่าเป้าหมายที่กำหนดไว้คืออะไรและเพราะเหตุใด
โทรศัพท์ Android นั้นมี boot-loader ของตัวเองและไม่สามารถแทนที่ด้วยวิธีการอื่นได้
มันไม่เหมือนกับ BIOS ของพีซีที่คุณสามารถสลับลำดับการบูตเพื่อบู๊ตจากอุปกรณ์บางอย่างเช่น Network PXE, USB, HDD หลัก / รอง
หลังจากความคิดเห็นด้านล่างและในความสัมพันธ์กับคำถามของ OP
มีวิธีใดบ้างที่จะบูตโทรศัพท์ Android (เช่นที่มีฟังก์ชั่น USB OTG) ผ่านทางไดรฟ์ USB ที่ขับเคลื่อนด้วยบัส
บูตทั่วไปโหลดเดอร์ (* ซึ่งอยู่บนชิปเซ็ต) ไม่มีความรู้เกี่ยวกับ USB ฯลฯ เนื่องจาก lk (Little Kernel) มีความกังวลเกี่ยวกับการดักจับการกดแป้นพิมพ์เพื่อให้โหลดโซ่เข้าสู่การกู้คืนหรือบูตโดยตรงในสภาพแวดล้อม Android (เมื่อกดปุ่ม Vol + Down ในอินสแตนซ์นี้) - ในโค้ดหลอก ( นี่คือจากบริบท / กว้างยาวของ lk และที่อยู่หน่วยความจำที่เกี่ยวข้องกับวิธีการอ่านพาร์ติชั่นนั้นยากที่จะเขียนลงใน lk นี้ รู้วิธีประมวลผลตรรกะ! )
เคอร์เนล lk เป็นมาตรฐานโดยพฤตินัยโดย Qualcomm MSM สำหรับชิปเซ็ต (Snapdragon) และนำไปใช้โดยผู้ผลิตเช่น Sony, Motorola, LG, Samsung และสามารถพบได้ในแหล่ง AOSP bootable/bootloader
ภายใต้
หาก ( กดปุ่มลดระดับเสียงหรือไม่ ) จากนั้น
/recovery
พาร์ติชั่นไปยังที่อยู่เฉพาะในหน่วยความจำและข้ามไปที่มันและเริ่มต้นการดำเนินการในการนำสภาพแวดล้อมการกู้คืนอื่น
/system
พาร์ติชั่นไปยังที่อยู่เฉพาะในหน่วยความจำและข้ามไปที่มันและเริ่มการทำงานเพื่อนำสภาพแวดล้อมของ Android ขึ้นมาจบถ้า
ในฐานะที่เป็นเมล็ดภายใน lk ถูก จำกัด สวยพิจารณาว่าภาพไบนารีของเคอร์เนลถูกเผาลงในชิปและดังนั้นการปรับเปลี่ยนวิธีการของมันไม่มี และนอกจากนี้ยังควรจะกล่าวว่า lk มีfastboot
โปรโตคอลในการเตรียมการกระพริบ/boot
, /recovery
, /system
และ/data
พาร์ทิชัน มีสองลำดับในการบูต, การบูตหลักและการบูตรองตามที่:
/boot
หรือ/recovery
หมายเหตุด้านข้าง: Samsung ชื่นชอบ PBL / SBL (ซึ่งเป็น Primary Boot Loader และ Secondary Boot Loader ตามลำดับ) ในศัพท์แสงของพวกเขาเมื่อพูดถึงการดัดแปลง สิ่งที่เกี่ยวกับซัมซุงคือในมือถือบางรุ่น PBL และ SBL อาจถูกเข้ารหัส (Samsung Wave GT-S8500 เป็นตัวอย่างหนึ่งที่ทำให้การย้าย Android ไปเป็นเรื่องที่แทบจะเป็นไปไม่ได้เพราะ DRM อยู่ในบูตโหลดเดอร์ซึ่งเป็นฝันร้าย เพื่อจัดการและทำให้การดัดแปลงเป็นเรื่องยากมากอย่างไรก็ตามมันเป็นการทำงานผ่านการใช้ประโยชน์จากรหัส FOTA!)
นี่คือเหตุผลที่ไม่มีสิ่งอำนวยความสะดวกพิเศษเช่นฟังก์ชั่น OTG หรือสิ่งอื่นใดเช่นการสื่อสารแบบอนุกรมการอ่านจาก SDCard กราฟิก ฯลฯ เนื่องจากจะทำให้เคอร์เนล lk ใหญ่กว่าที่ตั้งใจไว้ กล่าวอีกนัยหนึ่งมันเป็นขนาดที่เล็กที่สุดที่เป็นไปได้ของเคอร์เนลที่ถูกกำหนดให้ทำโค้ดหลอกข้างต้นเกิดขึ้น
นอกจากนี้ยังมีวิธีการมองมันอีกนี้และนี้จะขึ้นอยู่กับรุ่น Android - ฟังก์ชั่น USB OTG อย่างเต็มที่นำขึ้นภายในสภาพแวดล้อมของ Android คือเมื่อปรากฏหน้าจอที่บ้านคุ้นเคยแล้วการทำงานของ OTG ถูกเปิดใช้งาน น่าเสียดายที่ไม่ใช่ในกรณีที่มองจากมุมมองของแอลเค
หากคุณสงสัยนี่คือรายการของ Qualcommที่ด้านบน lk ซึ่งเป็นส่วนหนึ่งของแหล่ง C ขนาดเล็กที่มีชุดประกอบ ARM และพบได้ในแหล่ง AOSP ของ Jellybeanbootable/bootloader/legacy/usbloader/main.c
int boot_linux_from_flash(void)
{
boot_img_hdr *hdr = (void*) raw_header;
unsigned n;
ptentry *p;
unsigned offset = 0;
const char *cmdline;
if((p = flash_find_ptn("boot")) == 0) {
cprintf("NO BOOT PARTITION\n");
return -1;
}
if(flash_read(p, offset, raw_header, 2048)) {
cprintf("CANNOT READ BOOT IMAGE HEADER\n");
return -1;
}
offset += 2048;
if(memcmp(hdr->magic, BOOT_MAGIC, BOOT_MAGIC_SIZE)) {
cprintf("INVALID BOOT IMAGE HEADER\n");
return -1;
}
n = (hdr->kernel_size + (FLASH_PAGE_SIZE - 1)) & (~(FLASH_PAGE_SIZE - 1));
if(flash_read(p, offset, (void*) hdr->kernel_addr, n)) {
cprintf("CANNOT READ KERNEL IMAGE\n");
return -1;
}
offset += n;
n = (hdr->ramdisk_size + (FLASH_PAGE_SIZE - 1)) & (~(FLASH_PAGE_SIZE - 1));
if(flash_read(p, offset, (void*) hdr->ramdisk_addr, n)) {
cprintf("CANNOT READ RAMDISK IMAGE\n");
return -1;
}
offset += n;
dprintf("\nkernel @ %x (%d bytes)\n", hdr->kernel_addr, hdr->kernel_size);
dprintf("ramdisk @ %x (%d bytes)\n\n\n", hdr->ramdisk_addr, hdr->ramdisk_size);
if(hdr->cmdline[0]) {
cmdline = (char*) hdr->cmdline;
} else {
cmdline = board_cmdline();
if(cmdline == 0) {
cmdline = "mem=50M console=null";
}
}
cprintf("cmdline = '%s'\n", cmdline);
cprintf("\nBooting Linux\n");
create_atags(ADDR_TAGS, cmdline,
hdr->ramdisk_addr, hdr->ramdisk_size);
boot_linux(hdr->kernel_addr);
return 0;
}
มันเป็นไปได้ในแง่หนึ่งอย่างไรก็ตาม ด้วยข้อ จำกัด ที่กล่าวถึงในคำตอบของ @ t0mm13b มันสมเหตุสมผลแล้วที่ boot loader (lk) ที่กล่าวถึงนั้นไม่สามารถทำสิ่งนี้ได้ ดังนั้นเราจึงทำการบูตเคอร์เนลที่กำหนดเองจากfastboot
(สำหรับการทดสอบ) ซึ่งบูทใด ๆ จะเปิดใช้งานฟังก์ชั่น OTG และเมื่อพบเคอร์เนลที่ถูกต้องบนอุปกรณ์ OTG ที่เชื่อมต่ออยู่ สิ่งนี้อาจรวมอยู่ในการกู้คืนแบบกำหนดเองที่ทันสมัยเช่น TWRP ซึ่งมีทั้ง OTG และ (ในบางกรณี) การสนับสนุน MultiROM
สิ่งนี้ถูกใช้เพื่อบูต Ubuntu บนแท็บเล็ต Nexus 9 โดยใช้วิธีการ:
fastboot boot <otg_chainloader_kernel>
<otg_chainloader_kernel>
บู๊ตและเปิดใช้งาน OTG และรอให้อุปกรณ์ OTG เชื่อมต่อ<otg_chainloader_kernel>
ตรวจจับลินุกซ์เคอร์เนลที่ถูกต้องบนอุปกรณ์ OTG และส่งการควบคุมไปยังมันหลังจากทำการสับมันเข้าไปในหน่วยความจำตอนนี้ถ้าคุณต้องการคุณสามารถบูตอิมเมจ Android ROM ที่ใช้งานร่วมกันได้ในลักษณะที่คล้ายกัน แต่จำไว้ว่าต้องเชื่อมต่อไดรฟ์ OTG กับอุปกรณ์จนกว่าคุณจะตัดสินใจกลับไปที่ OS ดั้งเดิม (เนื่องจากแอปทั้งหมดจะโหลด จากและข้อมูลทั้งหมดจะถูกเขียนไปยังแฟลชไดรฟ์ USB เว้นแต่ว่า Android ROM ทั้งหมดสามารถกำหนดค่าเป็น ramdisk (เคยได้ยิน Puppy Linux?) ซึ่งให้ความจุหน่วยความจำปัจจุบันของอุปกรณ์ Android ทั่วไปและขนาดของ ROM เองไม่สามารถใช้งานได้ในปัจจุบัน) สิ่งนี้จะช่วยยับยั้งการชาร์จขณะที่บู๊ตไปยัง OTG OS ได้เช่นกันบนอุปกรณ์ส่วนใหญ่ที่มีพอร์ตข้อมูล / เครื่องชาร์จแบบครบวงจร
แหล่งที่มา: กลุ่มย่อยXDA-Developers Nexus 9
fastboot
s ทั้งหมด kexec-hardboot
แพทช์สำหรับเคอร์เนลที่ใช้โดย TWRP MultiROM เป็นพื้นOTG-Chainloader-Kernel
ฉันพูดคุยเกี่ยวกับ
มันเป็นไปได้และฉันทำมันบน acer iconia แท็บเล็ตของฉัน !!!!
เชื่อมต่อแฟลชไดรฟ์กับพีซีของคุณและฟอร์แมตเป็น fat32 ใช้รูฟัสเพื่อพอร์ต iso / dd ไปยังแฟลชไดรฟ์ของคุณ
เชื่อมต่อเข้ากับ otg และเข้าสู่โทรศัพท์ / แท็บเล็ตของคุณ .. กดปุ่มเปิด / ปิดค้างไว้และแตะระดับเสียงลงหากไม่บูตให้ลองกดปุ่มเปิด / ปิดค้างไว้แล้วแตะระดับเสียงขึ้น
จากนั้นใช้ปุ่มปรับระดับเสียงไปยัง UDisk (แบรนด์แฟลชไดรฟ์ของคุณ) หรือ SATA; UDISK (ไม่จำเป็นต้องเป็นแบรนด์ usb ของคุณ, สามารถพูดได้ว่าที่จัดเก็บข้อมูล usb) และคลิกปุ่มเปิด / ปิดเพื่อยืนยัน
ดีฉันมีปัญหากับการบูทเข้าสู่เมนูดังนั้นฉันจึงพยายามหลีกเลี่ยงเคอร์เนลในการบู๊ตและหยุดแอนดรอยด์ในการบูต
ฉันคิดว่ามันเป็นแบบนี้: ฉันเชื่อมต่อกับพีซีแล้วลบสิ่งที่น่าเชื่อถือทั้งหมดออกจากแท็บเล็ต แต่คัดลอกโฟลเดอร์ Android
เคอร์เนลถูกลบและหลังจากบูตเชื่อมต่อกลับไปยังพีซีที่มีฮับ usb
หวังว่าฉันจะช่วย :)