quarta-feira, 15 de abril de 2015

Como dar boot somente por USB host no Raspberry Pi A+ ou Modelo A


No post MicroSD falso em 5 gramas de frustração eu havia mencionado a possibilidade de boot via usb no Raspberry Pi Modelo A. Na época o Raspberry pi Compute Module que deve ter sido o principal motivo para a criação do código atual, não havia sido lançado.

Como dito no passado, não é possível dar boot direto via mass storage, somente no modo host ligado diretamente a um PC, portanto boot via pendrive não é possível. No Raspberry Pi módulo esse sistema de boot é utilizado para gravação na flash eMMC quando não há nenhum sistema.
 
Os modelos onde é possível a utilização desse modo são o Raspberry Pi Compute Module, Modelo A e A+. Possivelmente um futuro modelo 2 A baseado no Raspberry Pi 2 B deve ser compatível.

Caso precise desse recurso é bom saber que talvez seja necessário alterar a imagem customizada apresentada abaixo para suas necessidades.

Ao inicializar, o Raspberry Pi procura primeiramente o sistema no armazenamento (cartão SD ou eMMC), quando não é encontrado, após alguns segundos, a porta USB começa a se comportar como modo host e quando ligada em um PC será detectada dessa forma nos logs do dmesg:

usb 5-3: new full-speed USB device number 2 using ohci-pci
usb 5-3: New USB device found, idVendor=0a5c, idProduct=2763
usb 5-3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 5-3: Product: BCM2708 Boot
usb 5-3: Manufacturer: Broadcom

Caso execute o comando lsusb aparecerá como:

ID 0a5c:2763 Broadcom Corp.

Para ligação será necessário um cabo usb A macho-macho. No meu caso eu construí um cabo utilizando duas pontas, se for o caso, somente será necessário a ligação dos fios DATA+,DATA- e GND. Tenha em mente que alguns cabos, principalmente os de baixa qualidade, nem sempre obedecem as cores dos fios, portanto verifique os contatos. Caso queira um cabo pronto, você pode comprar cabos ou adaptadores como esses.

Para realização do boot via usb, será necessário utilizar um aplicativo chamado rpiboot que fará o trabalho de upload. Será necessário a instalação da libusb, caso esteja em um sistema baseado em debian basta seguir os passos abaixo (se for outro basta instalar a libusb com seu sistema de pacotes ou compilar manualmente).

$ git clone --depth=1 https://github.com/raspberrypi/tools 
$ cd tools/usbboot 
$ sudo apt-get install libusb-1.0-0-dev 
$ make 
$ sudo make install 

Será necessário também a criação de uma imagem customizada. O exemplo do git da ferramenta utiliza o buildroot para sua criação. No git do usbboot que foi clonado virá incluso também um patch para o buildroot que iremos utilizar.

Antes da compilação, remova qualquer flag de compilação caso tenha adicionado alguma, CFLAGS, CPPFLAGS, CXXFLAGS e retire o "." do PATH caso houver.

$ git clone git://git.buildroot.net/buildroot 
$ cd buildroot 
$ patch -p1 < ../tools/usbboot/buildroot.patch 
$ make raspberrypi_defconfig 
$ make 

A compilação demorará um bom tempo pois será baixado diversos programas auxiliares, como por exemplo o gcc para compilação cruzada.

Caso apareça o seguinte erro:

>>>   Executing post-image script board/raspberrypi/usb_test/post_build.sh
/bin/bash: board/raspberrypi/usb_test/post_build.sh: Permissão negada
make: ** [target-post-image] Erro 126

Basta alterar a permissão do arquivo e dar make novamente:

$ chmod +x board/raspberrypi/usb_test/post_build.sh
$ make

Ao término, uma imagem será criada.

Conecte o cabo usb no Raspberry Pi (sem cartão sd e desligado) e PC. Ligue a fonte do Raspberry Pi, aguarde alguns segundos e execute o rpiboot com o caminho (ajuste se preciso o caminho da pasta buildroot) da imagem:

$ sudo rpiboot -b ./buildroot/output/images/fatimage 

Se tudo estiver correto, a seguinte mensagem deve ser retornada:

Waiting for BCM2835 ...
Found serial = 0: writing file ./usbbootcode.bin
Waiting for BCM2835 ...
Failed to claim interface
Found serial = 1: writing file ./buildroot.elf

Caso precise se comunicar com a placa, é possível criar uma comunicação via serial de diversos modos.

A utilidade desse recurso no Raspberry Pi Modelo A e A+ certamente será específica, mas que não deixa de ser útil e interessante.

Referência: https://github.com/raspberrypi/tools/tree/master/usbboot

Nenhum comentário:

Postar um comentário