Selecionar modo de boot por GPIO na Raspberry Pi 3

Se você tem um Raspberry Pi 3B e quer fazer boot por USB, uma das opções é gravar o OTP (“One Time Programmable”). Se fizer alguma modificação no OTP, tendo em vista o significado do acrônimo, está claro que é irreversível. Bem, por qual razão alguém quereria selecionar o modo de boot por GPIO no Raspberry? – Pra tudo há uma razão. Explico.

Boot pela USB na Raspberry Pi 3B modificando o OTP

Tenho um Raspberry Pi 3B que precisava de refrigeração, devido ao calor que tem feito esses dias, e não poderia expô-lo a riscos por causa da temperatura, uma vez que o utilizo para diversos fins, inclusive trabalho. Só que ao colocá-lo em um case cometi a estupidez de não remover o cartão de memória previamente e consequentemente o destruí. Na ausência de um novo cartão, parti para o óbvio; boot pela USB. Só que o boot pela USB não estava habilitado. “Sem problemas” – pensei. Bastaria gravar o OTP para habilitar o boot na USB. Para isso, basta editar o arquivo /boot/config.txt do sistema contido em um cartão micro SD (em um computador com Linux, claro) e adicionar a linha:

program_usb_boot_mode=1

Para tal, peguei o cartão de outro Raspberry, apenas para fazer essa gravação. Após o boot, basta desligar o sistema e iniciar o boot pela USB. Já fiz esse procedimento em outra Raspberry e funcionou, mas por alguma razão, não funcionou nessa. Tudo estaria perdido? – Claro que não. Havia ainda uma possibilidade um pouco mais radical. Lembre-se: Não há como reverter o processo.

Selecionar modo de boot por GPIO na Raspberry 3B

Existe uma outra opção extremamente radical (do meu ponto de vista pessoal), que é fazer a seleção do boot através de pinos de GPIO. Isso é interessante por exemplo quando se tem as duas possiblidades conectadas ao Raspberry, sendo que o micro SD é prioritário. Se a Raspberry estiver em um ambiente fechado, uma chave exposta poderia definir a prioridade de boot.

No meu caso, a gravação da OTP não surtiu efeito (será que já havia sido gravada com 0?), então restara apenas essa possibilidade. O ponto mais negativo é que os GPIO do 22 ao 26 se tornariam inutilizáveis, uma vez que reconfigurados para esse propósito de boot. Se fizer essa modificação, o Raspberry não fará mais boot de modo algum se não for colocado o respectivo pino de GPIO em pullup.

Para tal, edite o mesmo arquivo /boot/config.txt e adicione a linha:

program_gpio_bootmode=1

Não use o banco 2 por nada. Nada.

A tabela a seguir foi tirada da documentação. Após fazer o boot com o cartão micro SD, desligue o sistema e não se esqueça de remover a linha acima do arquivo config.txt. A partir de então, coloque um jumper do 3v3 ao pino correspondente ao GPIO22 para boot pelo SD ou GPIO26 para boot pela USB. Se não colocar o jumper, não haverá boot de modo algum. Use um resistor de 5k no jumper. Eu não usei nada, esses jumpers são uma piada, tem uma resistência alta e para teste não haveria problemas. Posteriormente coloquei um jumper, mas eu não tinha um de 5k, então coloquei um de 330Ohms. Também funcionou, então já tem mais resistência que apenas o jumper.

Bank 1Bank 2boot type
2239SD0
2340SD1
2441NAND (no Linux support at present)
2542SPI (no Linux support at present)
2643USB

Nesse artigo você tem as referências dos GPIO.

Selecionar modo de boot por GPIO na Raspberry 3A+

Nesse caso, o pinout muda um pouco:

Bank 1Bank 2boot type
2037SD0
2138SD1
2239NAND (no Linux support at present)
2340SPI (no Linux support at present)
2441USB device
2542USB host – mass storage device
2643USB host – ethernet

Esse foi um tutorial simples só para o caso de alguém passar pelo mesmo problema. Espero que venha a ser útil para alguém, mas é igual tatoo; não tem volta.