É 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):

rpi

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:

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:

Raspberrypi
Raspberrypi

Agora você pode criar as suas aplicações e adicionar pacotes a partir de uma distribuição enxuta e leve.

Para aprender mais

Embedded Linux Build Systems

Desvendando Yocto Project – Primeiros passos

Raspberry pi + Qt5 + Yocto

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!