Sie sind auf Seite 1von 71

Seminrio Linux Embarcado 2011

Linux from Scratch com Buildroot


Sergio Prado Agosto/2011

Quem sou eu?

Mais de 14 anos de experincia em desenvolvimento de software para sistemas embarcados, em diversas arquiteturas de CPU (ARM, PPC, MIPS, x86, 68K), atuando em projetos com Linux embarcado e sistemas de tempo real. Scio da Embedded Labworks, onde atuo com consultoria e desenvolvimento de sistemas embarcados. Blog pessoal sobre Linux e Sistemas Embarcados em www.sergioprado.org.

Introduo

No blog: Sergio, eu estava comeando a estudar Linux embarcado, mas apareceu uma dvida, onde fica o main()?

Introduo

Linux e a revoluo do software livre

Liberdade Inovao

Comunidade

Colaborao

Flexibilidade

Introduo

Milhares de aplicaes de cdigo aberto disponveis!

Sugesto de Leitura: The Cathedral & The Bazaar Eric S. Raymond

Introduo

Criou-se uma situao onde temos centenas de milhares de pequenas solues procurando por um grande problema...

Introduo

E ento, para resolver os nossos grandes problemas, comeamos a usar Linux em dispositivos embarcados...

O desafio: integrar tudo isso

O desafio: integrar tudo isso

u-boot.bin

uImage

rootfs.jffs2

O desafio: integrar tudo isso

Soluo 1: Usar uma distribuio pronta

Debian, por exemplo, esta disponvel para diversas arquiteturas como x86, ARM, MIPS e PPC. Mas, e se no suportar sua plataforma? Mas, e se voc precisar customizar? Falta flexibilidade!

O desafio: integrar tudo isso

Soluo 2: Fazer tudo na unha

Fai fundo! E boa sorte! http://www.linuxfromscratch.org/

S no esquece de colocar uns 3 meses a mais no planejamento do seu projeto...

O desafio: integrar tudo isso

Soluo 3: Usar um sistema de build (buildsystem) Em 50 minutos, voc consegue gerar um sistema Linux completo!

O Sistema de Build

Atividades principais (pode depender da ferramenta)


Compilar e gerar o toolchain. Compilar e gerar a imagem do bootloader. Compilar e gerar a imagem do kernel. Compilar bibliotecas e aplicaes, resolver dependncias e gerar o sistema de arquivos (rootfs).

Conhecendo o Buildroot

http://www.buildroot.net

Desenvolvido pelos mantenedores da uClibc, e ficou durante um bom tempo sem nenhum mantenedor. Desde 2009, a partir da verso 2009.02, liberado a cada 3 meses.

Conhecendo o Buildroot
Implementa um sistema automtico de build atravs de um conjunto de Makefiles:

Gera o toolchain. Gera a imagem do bootloader. Gera a imagem do kernel. Compila bibliotecas e aplicaes. Gera o rootfs.

Nosso projeto
Emulando Atari com Linux embarcado

O kit mini2440
FriendlyARM mini2440

ARM920T 400MHz 64MB RAM At 1G de Flash NAND USB, Ethernet, LCD Serial, E2PROM, etc

Nosso projeto
Dividiremos em 3 etapas:

1a. etapa: Sistema bsico com Linux embarcado. 2a. etapa: Adicionar o emulador Stella e suas dependncias. 3a. etapa: Ajustes no sistema de arquivos.

Iniciando com o Buildroot


Requisitos

Toolchain (ARM, uClibc). Bootloader para a mini2440. Kernel para a mini2440. Rootfs com o emulador Stella.
No boot, iniciar automaticamente o emulador. Emulador configurado de fbrica (joystick, ler ROMs do carto SD, etc).

1a. fase: Buildroot bsico

Baixar e descompactar o Buildroot em um diretrio de desenvolvimento:


$wgethttp://buildroot.uclibc.org/downloads/buildroot2011.02.tar.bz2 $tarjxfvbuildroot2011.02.tar.bz2 $cdbuildroot2011.02/

1a. fase: Buildroot bsico


Estrutura bsica de diretrios

1a. fase: Buildroot bsico


Como configurar e compilar? $makemenuconfig $make

Parecido com o kernel do Linux. Pode-se usar tambm make xconfig ou make gconfig para configurar. Configurao salva em um arquivo .config no diretrio principal.

1a. fase: Buildroot bsico

1a. fase: Configurando a CPU


O que iremos configurar aqui?

Informaremos ao buildroot que iremos compilar para uma CPU de arquitetura ARM920T.

1a. fase: Configurando a CPU

1a. fase: Configurando a CPU

1a. fase: Toolchain


O que iremos configurar aqui?

Escolher a verso da biblioteca do sistema (o buildroot s suporta a uClibc). Escolher a verso do GCC. Escolher a verso e o local dos headers do kernel.

1a. fase: Toolchain


1 2

1a. fase: Toolchain

1a. fase: Toolchain

1a. fase: Toolchain

1a. fase: Bootloader


O que iremos configurar aqui?

Baixar e preparar o U-boot. Selecionar no Buildroot o bootloader U-Boot. Configurar informaes de compilao do U-boot.

1a. fase: Bootloader


Baixar e preparar o U-Boot
$gitclonegit://repo.or.cz/ubootopenmoko/mini2440.git $tarcjfvuboot.tar.bz2mini2440 $cpuboot.tar.bz2<buildroot>/dl

1a. fase: Bootloader

1a. fase: Bootloader


2 1

1a. fase: Kernel


O que iremos configurar aqui?

Habilitar a gerao do kernel. Configurar a verso do kernel. Configurar o nome do arquivo de config do kernel. Configurar o formato da imagem a ser gerada. Baixar os fontes do kernel da mini2440.

1a. fase: Kernel


1 2

1a. fase: Kernel

Baixar o kernel da mini2440 (linux-2.6.tar.bz2) e copiar para a pasta dl/ do buildroot.


Baixar diretamente o tarball: http://www.sergioprado.org/wp-content/plugins/download-monitor/download.php?id=4 Baixar o repositrio git e gerar o tarball: https://github.com/sergioprado/Mini2440-Kernel

1a. fase: Rootfs


O que iremos configurar aqui?

Por enquanto, vamos manter habilitados os pacotes padro. Habilitar gerao do formato ext2 (facilita testes via NFS). Habilitar gerao do formato jffs2 e configurar informaes da memria flash.

1a. fase: Rootfs

1a. fase: Rootfs

1a. fase: Compilando

Salvar, sair e compilar: $make

E vai tomar um cafezinho!

1a. fase: 40 minutos depois


$lsloutput/ total32 drwxrxrx33spradosprado40962011050923:42build drwxrxrx4spradosprado40962011050923:41host drwxrxrx2spradosprado40962011050923:42images lrwxrwxrwx1spradosprado1242011073011:04staging drwxrxrx2spradosprado40962011050923:18stamps drwxrxrx17spradosprado40962011050923:19target drwxrxrx10spradosprado40962011050923:11toolchain

1a. fase: ~45 minutos depois

$lsloutput/images/ total37340 rwrr1spradosprado157726722011080410:45rootfs.ext2 rwrr1spradosprado72066322011080410:47rootfs.jffs2 rwrr1spradosprado129331202011080410:47rootfs.tar rwxrxrx1spradosprado2489322011080410:33uboot.bin rwrr1spradosprado20682762011080410:44uImage

1a. fase: Gravando imagens


Os procedimentos para gravar as imagens geradas dependem do seu hardware. Para o kit FriendlyARM mini2440, seguir este artigo: http://www.sergioprado.org/2010/08/30/mini2440linux-com-u-boot-e-emdebian/

2a. fase: Adicionando o Stella


O que iremos fazer aqui?

Configurar o Buildroot com os pr-requisitos do Stella:


Linux 2.6 (OK!). Toolchain com GNU C++ (precisamos habilitar). SDL V1.2.10 ou maior (precisamos habilitar).

Adicionar o pacote do Stella no Buildroot.

2a. fase: Habilitando suporte C++

2a. fase: Habilitando suporte SDL


1

2a. fase: Adicionando pacote Stella

Objetivo: uma opo para habilitar o Stela dever estar disponvel em:
PackageSelectionforthetarget> Games> [*]stella

2a. fase: Adicionando pacote Stella

A configurao dos pacotes suportados pelo Buildroot ficam no diretrio packages, portanto criaremos um novo diretrio para o Stela em:
$mkdirppackages/games/stella

2a. fase: Adicionando pacote Stella

Dentro deste diretrio precisamos ter pelo menos estes arquivos:


Config.in: Informaes do pacote stella.mk: Instrues para compilao

Alm destes, podemos criar arquivos que podero ser usados na compilao, como Makefiles e arquivos de patch.

2a. fase: Adicionando pacote Stella

#packages/games/stella/Config.in configBR2_PACKAGE_STELLA bool"stella" dependsonBR2_PACKAGE_SDL&&BR2_PACKAGE_LIBPNG help AmultiplataformAtari2600VCSemulator. http://stella.sourceforge.net/

2a. fase: Adicionando pacote Stella


############################################################# # #packages/games/stella/stella.mk # ############################################################# STELLA_VERSION:=3.2.2 STELLA_SOURCE:=stella$(STELLA_VERSION)src.tar.gz STELLA_SITE:=http://downloads.sourceforge.net/project/stella/stella/ (STELLA_VERSION)/ STELLA_INSTALL_STAGING=YES STELLA_DEPENDENCIES=sdlsdl_imagesdl_soundzliblibpng STELLA_PKG_DIR:=../../../package/games/stella defineSTELLA_CONFIGURE_CMDS (cd$(@D);./configuredisablegldisabledebuggerdisablewindowed CXX="$(TARGET_CXX)"CXXFLAGS="$(TARGET_CXXFLAGS)") cp$(@D)/$(STELLA_PKG_DIR)/config.mak$(@D) patchp1d$(@D)<$(@D)/$(STELLA_PKG_DIR)/video_dialog.patch endef defineSTELLA_BUILD_CMDS $(MAKE)STAGING_DIR=$(STAGING_DIR)C$(@D)CXX="$(TARGET_CXX)"CXXFLAGS="$ (TARGET_CXXFLAGS)"LD="$(TARGET_CXX)"all endef ... ...

2a. fase: Adicionando pacote Stella

#vipackages/Config.in ... menu"Games" source"package/games/gnuchess/Config.in" source"package/games/prboom/Config.in" source"package/games/doomwad/Config.in" source"package/games/stella/Config.in" endmenu ...

2a. fase: Adicionando pacote Stella

2a. fase: Recompilando

Compile novamente: $make

E vai tomar outro cafezinho!

3a. fase: Ajustes finais


O que iremos fazer aqui?

Script para configurar e iniciar automaticamente o emulador no boot.

3a. fase: Adicionando arquivos no rootfs


$lsloutput/target total60 drwxrxrx2spradosprado40962011022817:54bin drwxrxrx3spradosprado40962011022817:54dev drwxrxrx5spradosprado40962011042319:48etc drwxrxrx2spradosprado40962011022817:54home drwxrxrx2spradosprado40962011022817:54lib drwxrxrx2spradosprado40962011022817:54mnt drwxrxrx2spradosprado40962011022817:54opt drwxrxrx2spradosprado40962011022817:54proc drwxrxrx3spradosprado40962011050922:50root drwxrxrx2spradosprado40962011022817:54sbin drwxrxrx4spradosprado40962011050322:38stella drwxrxrx2spradosprado40962011022817:54sys drwxrxrx2spradosprado40962011022817:54tmp drwxrxrx5spradosprado40962011042319:38usr drwxrxrx3spradosprado40962011022817:54var

3a. fase: Script de boot - S90Stella


... initStellaEnvironment(){ initTSLib initFrameBuffer initSound initJoystick initConfig } case"$1"in start) echo"Startingstella..." initStellaEnvironment stella& ;; stop) echo"Stoppingstella..." killallstella ;; restart|reload) "$0"stop "$0"start ;; *) echo$"Usage:$0{start|stop|restart}" exit1 ;; esac

3a. fase: Ajustes finais

Copiar o script de boot para o rootfs:


$cpS90Stellaoutput/target/etc/init.d/

IMPORTANTE: Se quiser manter o arquivo depois de um make clean, adicionar ao esqueleto do rootfs:
$cpS90Stellafs/skeleton/etc/init.d/

3a. fase: Uma pedra no meio do caminho

Problema 1: O vdeo no renderizava em modo paisagem (320x240). Depois de dias debugando o driver do display, a biblioteca SDL e a aplicao Stella...
$exportSDL_VIDEO_FBCON_ROTATION=CW

Soluo:

3a. fase: Uma pedra no meio do caminho

Problema 2: Ao rotacionar o display, o touchscreen parou de funcionar. Soluo: Alterao da biblioteca SDL.

3a. fase: Uma pedra no meio do caminho


staticvoidhandle_tslib(_THIS) { structts_samplesample; intbutton; +intbutton,aux; while(ts_read(ts_dev,&sample,1)>0){ button=(sample.pressure>0)?1:0; button<<=2;/*mustreportitasbutton3*/ +aux=240sample.x; +sample.x=sample.y; +sample.y=aux; FB_vgamousecallback(button,0,sample.x, sample.y); } return; }

3a. fase: Uma pedra no meio do caminho

Problema 3: Som s funcionou com a biblioteca ALSA habilitada. Soluo: Habilitar a biblioteca ALSA no Buildroot.
PackageSelectionforthetarget Audioandvideolibrariesandapplications [*]alsalib

3a. fase: Uma pedra no meio do caminho

Problema 4: Uso do direcional do joystick causava segmentation fault na aplicao. Soluo: Habilitar a interface de joysticks no kernel.
DeviceDrivers Inputdevicesupport [*]Joystickinterface [*]Joysticks/Gamepads [*]ClassicPCanalogjoysticksandgamepads

3a. fase: Outras dicas

Configurar o busybox: $makebusyboxmenuconfig Configurar a uClibc: $makeuclibcmenuconfig Configurar o kernel: $makelinuxmenuconfig

3a. fase: Outras dicas

Para recompilar um pacote, no diretrio de build do pacote, remover os arquivos .stamp.


$lsoutput/build/linux2.6/.stamp_* .stamp_compiled .stamp_configured .stamp_downloaded .stamp_installed .stamp_extracted .stamp_patched

3a. fase: No fim, um pouco de diverso!

3a. fase: Se voc quiser contribuir...

Pgina do projeto no github:


https://github.com/sergioprado/Mini2440AtariSystem

Sinta-se livre para fazer um fork e contribuir!

Dvidas?

Seminrio Linux Embarcado

Obrigado!

Sergio Prado Twitter @sergioprado sergio.prado@embeddedlabworks.com http://www.sergioprado.org

Das könnte Ihnen auch gefallen