Esclareça qual é o objetivo pretendido e por quê?
Os telefones Android têm seus próprios gerenciadores de inicialização e não podem ser substituídos por outros meios.
Não é como o BIOS de um PC, onde você pode alternar a ordem de inicialização para inicializar a partir de determinados dispositivos, como Network PXE, USB, HDD principal / secundário.
Editar:
Após os comentários abaixo e em relação à pergunta do OP
Existe alguma maneira de inicializar um telefone Android (por exemplo, um com funcionalidade USB OTG.) Por meio de uma unidade USB alimentada por barramento
O gerenciador de inicialização genérico (* que reside no conjunto de chips) não tem conhecimento de USB etc., pois o lk (Little Kernel) está mais preocupado em capturar pressionamentos de teclas para carregar em cadeia a recuperação ou inicializar diretamente no ambiente Android (Ao pressionar a tecla Vol + Down nesta instância) - no pseudo-código ( isto é do contexto / aspecto do lk, e também, os endereços de memória relativos à leitura das partições são codificados nesse lk, portanto saber como processar a lógica! )
O kernel lk é o padrão de fato da Qualcomm para chipsets MSM (Snapdragon) e adotado por fabricantes como Sony, Motorola, LG, Samsung e pode ser encontrado na fonte AOSP em bootable/bootloader
.
se ( A tecla Diminuir volume está pressionada? ), então
- carregar o kernel em cadeia da
/recovery
partição para um endereço específico na memória e pular para ele e iniciar a execução, criando o ambiente de recuperação
outro
- carregue o kernel em cadeia da
/system
partição para um endereço específico na memória e pule para ele e inicie a execução para exibir o ambiente Android.
fim se.
Como o kernel do lk é bastante limitado, considerando que a imagem binária do kernel é gravada no chip e, portanto, não há como modificá-lo . E também deve ser mencionado que lk contém o fastboot
protocolo em preparação para piscando /boot
, /recovery
, /system
e /data
partições. Existem duas seqüências para inicializar, inicialização primária e inicialização secundária, pois são:
- Inicialização primária -> lk (dependendo do resultado da lógica)
- Vá para Inicialização secundária ->
/boot
ou/recovery
Nota lateral: A Samsung gosta do PBL / SBL (que é o carregador de inicialização primário e o carregador de inicialização secundário, respectivamente) em seus jargões quando se trata de modificação. O problema da Samsung é que, em alguns aparelhos, o PBL e o SBL podem ser criptografados (o Samsung Wave GT-S8500 é um exemplo, em que a transferência do Android para ele era quase impossível de fazer por causa do DRM dentro dos gerenciadores de inicialização, que era um pesadelo para lidar com e fez modding-lo extremamente difícil, no entanto, é uma espécie de trabalhar através de um exploit no código FOTA!)
É por isso que não existem recursos extras, como a funcionalidade OTG ou qualquer outra coisa, como comunicações seriais, leitura de SDCard, gráficos etc., pois isso tornaria o kernel lk maior do que o pretendido. Em outras palavras, é o menor tamanho possível de kernel designado para fazer exatamente o pseudo-código acima.
Além disso, uma outra maneira de olhar para ele é isso, e isso depende da versão Android - o USB funcionalidade OTG está totalmente trouxe até dentro do ambiente Android, ou seja, quando o aparece na tela inicial familiares, em seguida, a funcionalidade do OTG está habilitado. Infelizmente não é o caso quando se olha para ele da perspectiva de lk.
Se você estiver curioso, aqui está a entrada da Qualcomm no lk acima, que faz parte da pequena fonte C que possui o assembly ARM incluído e encontrado na fonte AOSP da JellyBean embootable/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;
}