É bem provável que você já tenha ouvido falar da Raspberrypi. Juntamente com a Beaglebone Black, essas placas são consideradas como mini-pcs e estão sendo largamente adotadas pela comunidade open-source e têm viabilizado diversos projetos por conta de seu baixo preço, USD35 e USD45, respectivamente.
Vejamos algumas características do hardware da Rpi Modelo B (a partir de 15/10/12):
- SoC: Broadcom BCM2835 (CPU + GPU)
- CPU: 700 MHz ARM11 ARM1176JZF-S
- GPU: Broadcom VideoCore IV,OpenGL ES 2.0,OpenVG 1080p30 H.264 high-profile encode/decode
- Memória (SDRAM)iB: 512 MiB
- USB 2.0: 2 portas
- Saída de Video: Composite video | Composite RCA, HDMI
- Saída de Audio: TRS connector | 3.5 mm jack, HDMI
- Armazenamento: Secure Digital | SD / MMC / SDIO card slot
- Interface de rede: 10/100 Ethernet RJ45
- Periféricos de comunicação: GPIO, SPI, I²C, I²S, UART
A comunidade desenvolveu o Raspbian, que é o Debian modificado para rodar na Raspberrypi. Porém esta distribuição é para uso de propósito geral e dependendo da aplicação/produto que se queira desenvolver com a Rpi, o processamento e consumo de memória e energia podem ficar comprometidos. Portanto é mais recomendado que se construa uma distribuição Linux customizada afim de atender a esses requisitos.
Vamos apresentar uma maneira rápida e simples de como gerar uma distribuição Linux embarcado com o Yocto Project para a Raspberrypi. Se você ainda não conhece o Yocto, sugiro que leia o artigo do Henrique Beaglebone Black + Yocto, onde ele faz uma introdução sobre ele.
Preparando o Host
O Yocto Project suporta oficialmente as seguintes distribuições GNU/Linux como ambiente de construção:
- Ubuntu 12.04, 13.10 e 14.04
- Fedora 19 e 20
- CentOS 6.4 e 6.5
- Debian 7.0, 7.1, 7.2, 7.3 e 7.4
- openSUSE 12.2, 12.3 e 13.1
Para que ele execute no Host alguns pacotes necessitam ser instalados.
Ubuntu e Debian:
sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib \
build-essential chrpath libsdl1.2-dev xterm
Fedora:
sudo yum install gawk make wget tar bzip2 gzip python unzip perl patch \
diffutils diffstat git cpp gcc gcc-c++ glibc-devel texinfo chrpath \
ccache perl-Data-Dumper perl-Text-ParseWords perl-Thread-Queue SDL-devel xterm
openSUSE:
sudo zypper install python gcc gcc-c++ git chrpath make wget python-xml \
diffstat texinfo python-curses patch libSDL-devel xterm
CentOS:
sudo yum install gawk make wget tar bzip2 gzip python unzip perl patch \
diffutils diffstat git cpp gcc gcc-c++ glibc-devel texinfo chrpath SDL-devel xterm
Montando o Ambiente de construção
Vamos criar os diretórios e baixar os fontes necessários:
mkdir -p ~/yocto/dl cd ~/yocto git clone git://git.yoctoproject.org/poky poky-dora cd poky-dora git checkout dora git clone git://git.yoctoproject.org/meta-raspberrypi cd meta-raspberrypi git checkout dora
Note que estamos usando a versão “dora” do Yocto Project.
Agora vamos configurar o ambiente para gerarmos os artefatos de software:
cd ~/yocto . poky-dora/oe-init-build-env build-dora
Adicione a linha abaixo no arquivo ~/yocto/build-dora/conf/bblayers.conf para a variável BBLAYERS:
${TOPDIR}/../poky-dora/meta-raspberrypi \
Modifique e adicione as seguintes variáveis no arquivo ~/yocto/build-dora/conf/local.conf
#MACHINE ??= "qemux86"
MACHINE ?= "raspberrypi"
DL_DIR ?= "${TOPDIR}/../dl"
PACKAGE_CLASSES ?= "package_ipk"
IMAGE_INSTALL_append = " kernel-modules"
Note que configuramos nossa machine como sendo raspberrypi, mudamos o diretório de download para podermos reutilizar os fontes baixados em outros projetos, usaremos o gerenciador de pacotes ipk (ele é mais indicado para sistemas embarcados porque não exige muitos recursos para funcionar) e vamos instalar na imagem todos os módulos do kernel gerados.
Se você já fez o tutorial do Henrique ou tutorial: “Desenvolvendo um Kiosk Interativo para a Beaglebone Black com Yocto”, você pode simplesmente atualizar a sua cópia local do repositório do yocto (git pull origin dora), adicionar o repositório da meta-raspberrypi (git clone git://git.yoctoproject.org/meta-raspberrypi) e modificar os arquivos bblayers.conf e local.conf como descrito anteriormente.
Veja que para adicionar o suporte a Raspberrypi ao Yocto tivemos que adicionar o layer meta-raspberrypi. Esse layer possui as receitas necessárias para construir o kernel para a Raspberrypi, baixar o bootloader proprietário da Broadcom, configurar a quantidade de memória destinada a GPU do processador e construir algumas libs e aplicativos exclusivos para a Rpi. Devido a estas características dizemos que o layer meta-raspberrypi é um layer de BSP (Board Support Package). Mais detalhes podem ser encontrados no arquivo ~/yocto/poky-dora/meta-raspberrypi/README.
Gerando a imagem
Depois de ter o ambiente de construção configurado vamos gerar uma imagem, sem bibliotecas e aplicativos gráficos:
cd ~/yocto . poky-dora/oe-init-build-env build-dora bitbake rpi-basic-image
Se você quiser gerar uma imagem com suporte a interface gráfica rode o seguinte comando:
cd ~/yocto . poky-dora/oe-init-build-env build-dora bitbake core-image-sato
Gravando a imagem
O Yocto gerou a imagem do SDcard que está disponível em: ~/build-dora/tmp/deploy/eglibc/images/raspberrypi/ . De posse desse arquivo podemos gravá-lo no SDcard.
Insira o SDcard card no computador PC ou notebook (sistema host) e descubra qual o device node criado pelo sistema operacional. Tente um dos seguintes comandos:
dmesg sudo fdisk -l
Caso, por exemplo, o device node criado seja /dev/sdb, use os seguintes comandos para gravar a imagem no SDcard:
sudo umount /dev/sdb* # Use o comando abaixo para gravar a imagem sem interface grafica sudo dd if=~/yocto/build-dora/tmp/deploy/images/raspberrypi/rpi-basic-image-raspberrypi.rpi-sdimg of=/dev/sdb ; sync # Use o comando abaixo para gravar a imagem com interface grafica sudo dd if=~/yocto/build-dora/tmp/deploy/images/raspberrypi/core-image-sato-raspberrypi.rpi-sdimg of=/dev/sdb ; sync
Testando a imagem
Conecte o o cabo serial na Rpi de acordo com essas instruções e energize a placa.
Para a imagem básica, sem interface gráfica, teremos o seguinte log do boot do sistema:
[ 0.000000] Booting Linux on physical CPU 0 [ 0.000000] Initializing cgroup subsys cpu [ 0.000000] Linux version 3.6.11 (dsueiro@dsueiro-N46VM) (gcc version 4.8.1 (GCC) ) #1 PREEMPT Thu Feb 6 17:29:39 BRST 2014 [ 0.000000] CPU: ARMv6-compatible processor [410fb767] revision 7 (ARMv7), cr=00c5387d [ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache [ 0.000000] Machine: BCM2708 [ 0.000000] cma: CMA: reserved 16 MiB at 1b000000 [ 0.000000] Memory policy: ECC disabled, Data cache writeback [ 0.000000] On node 0 totalpages: 114688 [ 0.000000] free_area_init_node: node 0, pgdat c05599bc, node_mem_map c0604000 [ 0.000000] Normal zone: 896 pages used for memmap [ 0.000000] Normal zone: 0 pages reserved [ 0.000000] Normal zone: 113792 pages, LIFO batch:31 [ 0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768 [ 0.000000] pcpu-alloc: [0] 0 [ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 113792 [ 0.000000] Kernel command line: dma.dmachans=0x7f35 bcm2708_fb.fbwidth=656 bcm2708_fb.fbheight=416 bcm2708.boardrev=0xf bcm2708.serial=0x83ag [ 0.000000] PID hash table entries: 2048 (order: 1, 8192 bytes) [ 0.000000] Dentry cache hash table entries: 65536 (order: 6, 262144 bytes) [ 0.000000] Inode-cache hash table entries: 32768 (order: 5, 131072 bytes) [ 0.000000] Memory: 448MB = 448MB total [ 0.000000] Memory: 432140k/432140k available, 26612k reserved, 0K highmem [ 0.000000] Virtual kernel memory layout: [ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB) [ 0.000000] fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB) [ 0.000000] vmalloc : 0xdc800000 - 0xff000000 ( 552 MB) [ 0.000000] lowmem : 0xc0000000 - 0xdc000000 ( 448 MB) [ 0.000000] modules : 0xbf000000 - 0xc0000000 ( 16 MB) [ 0.000000] .text : 0xc0008000 - 0xc0503594 (5102 kB) [ 0.000000] .init : 0xc0504000 - 0xc0525128 ( 133 kB) [ 0.000000] .data : 0xc0526000 - 0xc055a408 ( 210 kB) [ 0.000000] .bss : 0xc055a42c - 0xc0603578 ( 677 kB) [ 0.000000] NR_IRQS:330 [ 0.000000] sched_clock: 32 bits at 1000kHz, resolution 1000ns, wraps every 4294967ms [ 0.000000] Console: colour dummy device 80x30 [ 0.000241] Calibrating delay loop... 697.95 BogoMIPS (lpj=3489792) [ 0.060109] pid_max: default: 32768 minimum: 301 [ 0.060417] Mount-cache hash table entries: 512 [ 0.061161] Initializing cgroup subsys cpuacct [ 0.061186] Initializing cgroup subsys devices [ 0.061200] Initializing cgroup subsys freezer [ 0.061209] Initializing cgroup subsys blkio [ 0.061279] CPU: Testing write buffer coherency: ok [ 0.061586] hw perfevents: enabled with v6 PMU driver, 3 counters available [ 0.061696] Setting up static identity map for 0x3bb1e8 - 0x3bb244 [ 0.063236] devtmpfs: initialized [ 0.073371] NET: Registered protocol family 16 [ 0.079714] DMA: preallocated 4096 KiB pool for atomic coherent allocations [ 0.080877] bcm2708.uart_clock = 0 [ 0.082296] hw-breakpoint: found 6 breakpoint and 1 watchpoint registers. [ 0.082313] hw-breakpoint: maximum watchpoint size is 4 bytes. [ 0.082326] mailbox: Broadcom VideoCore Mailbox driver [ 0.082396] bcm2708_vcio: mailbox at f200b880 [ 0.082468] bcm_power: Broadcom power driver [ 0.082482] bcm_power_open() -> 0 [ 0.082491] bcm_power_request(0, 8) [ 0.583161] bcm_mailbox_read -> 00000080, 0 [ 0.583175] bcm_power_request -> 0 [ 0.583184] Serial: AMBA PL011 UART driver [ 0.583304] dev:f1: ttyAMA0 at MMIO 0x20201000 (irq = 83) is a PL011 rev3 [ 0.929243] console [ttyAMA0] enabled [ 0.952476] bio: create slab <bio-0> at 0 [ 0.957348] SCSI subsystem initialized [ 0.961395] usbcore: registered new interface driver usbfs [ 0.966942] usbcore: registered new interface driver hub [ 0.972501] usbcore: registered new device driver usb [ 0.978808] Switching to clocksource stc [ 0.983018] FS-Cache: Loaded [ 0.986135] CacheFiles: Loaded [ 1.001294] NET: Registered protocol family 2 [ 1.006531] TCP established hash table entries: 16384 (order: 5, 131072 bytes) [ 1.014247] TCP bind hash table entries: 16384 (order: 4, 65536 bytes) [ 1.021103] TCP: Hash tables configured (established 16384 bind 16384) [ 1.027680] TCP: reno registered [ 1.030912] UDP hash table entries: 256 (order: 0, 4096 bytes) [ 1.036782] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes) [ 1.043341] NET: Registered protocol family 1 [ 1.048185] RPC: Registered named UNIX socket transport module. [ 1.054192] RPC: Registered udp transport module. [ 1.058891] RPC: Registered tcp transport module. [ 1.063613] RPC: Registered tcp NFSv4.1 backchannel transport module. [ 1.070674] bcm2708_dma: DMA manager at f2007000 [ 1.075425] bcm2708_gpio: bcm2708_gpio_probe c0533dd8 [ 1.080853] vc-mem: phys_addr:0x00000000 mem_base=0x1ec00000 mem_size:0x20000000(512 MiB) [ 1.089953] audit: initializing netlink socket (disabled) [ 1.095513] type=2000 audit(0.960:1): initialized [ 1.218294] VFS: Disk quotas dquot_6.5.2 [ 1.222290] Dquot-cache hash table entries: 1024 (order 0, 4096 bytes) [ 1.229321] FS-Cache: Netfs 'nfs' registered for caching [ 1.235028] NFS: Registering the id_resolver key type [ 1.240178] Key type id_resolver registered [ 1.244453] Key type id_legacy registered [ 1.248792] msgmni has been set to 876 [ 1.254340] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 252) [ 1.262021] io scheduler noop registered [ 1.266039] io scheduler deadline registered [ 1.270326] io scheduler cfq registered (default) [ 1.296393] Console: switching to colour frame buffer device 82x26 [ 1.387053] kgdb: Registered I/O driver kgdboc. [ 1.392227] vc-cma: Videocore CMA driver [ 1.396217] vc-cma: vc_cma_base = 0x00000000 [ 1.400913] vc-cma: vc_cma_size = 0x00000000 (0 MiB) [ 1.406326] vc-cma: vc_cma_initial = 0x00000000 (0 MiB) [ 1.420642] brd: module loaded [ 1.428647] loop: module loaded [ 1.432126] vchiq: vchiq_init_state: slot_zero = 0xdb000000, is_master = 0 [ 1.439917] Loading iSCSI transport class v2.0-870. [ 1.445782] usbcore: registered new interface driver smsc95xx [ 1.451726] dwc_otg: version 3.00a 10-AUG-2012 (platform bus) [ 1.662702] Core Release: 2.80a [ 1.665923] Setting default values for core params [ 1.670741] Finished setting default values for core params [ 1.881454] Using Buffer DMA mode [ 1.884802] Periodic Transfer Interrupt Enhancement - disabled [ 1.890626] Multiprocessor Interrupt Enhancement - disabled [ 1.896212] OTG VER PARAM: 0, OTG VER FLAG: 0 [ 1.900564] Dedicated Tx FIFOs mode [ 1.905052] dwc_otg: Microframe scheduler enabled [ 1.910155] dwc_otg bcm2708_usb: DWC OTG Controller [ 1.915136] dwc_otg bcm2708_usb: new USB bus registered, assigned bus number 1 [ 1.922398] dwc_otg bcm2708_usb: irq 32, io mem 0x00000000 [ 1.927964] Init: Port Power? op_state=1 [ 1.931878] Init: Power Port (0) [ 1.935217] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002 [ 1.942001] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1 [ 1.949246] usb usb1: Product: DWC OTG Controller [ 1.953973] usb usb1: Manufacturer: Linux 3.6.11 dwc_otg_hcd [ 1.959626] usb usb1: SerialNumber: bcm2708_usb [ 1.964952] hub 1-0:1.0: USB hub found [ 1.968727] hub 1-0:1.0: 1 port detected [ 1.973023] dwc_otg: FIQ enabled [ 1.976248] dwc_otg: NAK holdoff enabled [ 1.980158] dwc_otg: FIQ split fix enabled [ 1.984289] Module dwc_common_port init [ 1.988333] Initializing USB Mass Storage driver... [ 1.993481] usbcore: registered new interface driver usb-storage [ 1.999479] USB Mass Storage support registered. [ 2.004261] usbcore: registered new interface driver libusual [ 2.010265] mousedev: PS/2 mouse device common for all mice [ 2.016547] bcm2835-cpufreq: min=700000 max=700000 cur=700000 [ 2.022393] bcm2835-cpufreq: switching to governor powersave [ 2.028089] bcm2835-cpufreq: switching to governor powersave [ 2.033780] cpuidle: using governor ladder [ 2.037890] cpuidle: using governor menu [ 2.041867] sdhci: Secure Digital Host Controller Interface driver [ 2.048067] sdhci: Copyright(c) Pierre Ossman [ 2.052500] sdhci: Enable low-latency mode [ 2.103072] mmc0: SDHCI controller on BCM2708_Arasan [platform] using platform's DMA [ 2.110860] mmc0: BCM2708 SDHC host at 0x20300000 DMA 2 IRQ 77 [ 2.116913] sdhci-pltfm: SDHCI platform and OF driver helper [ 2.128221] usbcore: registered new interface driver usbhid [ 2.135964] usbhid: USB HID core driver [ 2.142549] TCP: cubic registered [ 2.148037] Initializing XFRM netlink socket [ 2.154455] NET: Registered protocol family 17 [ 2.161191] Key type dns_resolver registered [ 2.165711] Indeed it is in host mode hprt0 = 00021501 [ 2.174508] VFP support v0.3: implementor 41 architecture 1 part 20 variant b rev 5 [ 2.193633] registered taskstats version 1 [ 2.201220] Waiting for root device /dev/mmcblk0p2... [ 2.210113] mmc0: new high speed SDHC card at address 0002 [ 2.223612] mmcblk0: mmc0:0002 00000 3.81 GiB [ 2.234015] mmcblk0: p1 p2 [ 2.343178] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null) [ 2.351333] VFS: Mounted root (ext4 filesystem) on device 179:2. [ 2.358222] devtmpfs: mounted [ 2.361639] Freeing init memory: 132K [ 2.382956] usb 1-1: new high-speed USB device number 2 using dwc_otg [ 2.389567] Indeed it is in host mode hprt0 = 00001101 [ 2.593621] usb 1-1: New USB device found, idVendor=0424, idProduct=9512 [ 2.600346] usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0 [ 2.623528] hub 1-1:1.0: USB hub found [ 2.629252] hub 1-1:1.0: 3 ports detected [ 2.923165] usb 1-1.1: new high-speed USB device number 3 using dwc_otg [ 3.043549] usb 1-1.1: New USB device found, idVendor=0424, idProduct=ec00 [ 3.050433] usb 1-1.1: New USB device strings: Mfr=0, Product=0, SerialNumber=0 [ 3.076047] smsc95xx v1.0.4 [ 3.147877] smsc95xx 1-1.1:1.0: eth0: register 'smsc95xx' at usb-bcm2708_usb-1.1, smsc95xx USB 2.0 Ethernet, b8:27:eb:a3:29:2b [ 3.215162] udevd[73]: starting version 182 [ 4.182086] EXT4-fs (mmcblk0p2): re-mounted. Opts: data=ordered [ 14.550215] NET: Registered protocol family 10 [ 14.556726] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
Para imagem com interface gráfica (core-image-sato) teremos as seguintes telas pela conexão HDMI:
Agora você pode criar as suas aplicações e adicionar pacotes a partir de uma distribuição enxuta e leve.
Para aprender mais
Desvendando Yocto Project – Primeiros passos
Onde Comprar
Você pode conferir o preço da Raspberry Pi Modelo B e acessórios na loja virtual FILIPEFLOP: Arduino e Componentes Eletrônicos. Acesse!


