Mini2440 – Linux from scratch com Buildroot
- por Sergio Prado
O Buildroot é um dos mais usados sistemas de build para sistemas embarcados. Com ele podemos gerar todo o toolchain de cross-compilação para determinada arquitetura, compilar o kernel e gerar o rootfs.
Então vamos lá, mãos à obra!
PREPARANDO O BUILDROOT
O primeiro passo é baixar o buildroot na página do projeto aqui e descompactá-lo em um diretório qualquer na sua máquina.
Você vai precisar também do kernel para a mini2440. O kernel disponível na página de downloads do projeto não irá funcionar, porque o JFFS2 não esta habilitado por padrão, e também porque são necessárias algumas alterações no driver da MTD para ele funcionar com o U-boot.
Entre no diretório principal do buildroot, crie uma pasta chamada “dl” e copie o kernel para lá.
CONFIGURANDO O BUILDROOT
Agora vamos configurar o buildroot para gerar corretamente o toolchain e as imagens do kernel e do rootfs para a mini2440. No diretório principal do buildroot, execute o comando “make menuconfig”, e configure de acordo com as opções abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Target Architecture [*] arm Target Architecture Variant [*] arm920t Target ABI: [*] EABI Toolchain Kernel Headers (X) Local Linux snapshot Target Filesystem options [*] jffs2 root filesystem Flash type (X) NAND flash with 2kB page and 128kB erase Kernel [*] Linux Kernel Kernel version (X) Same as toolchain kernel headers Defconfig name mini2440 |
Você pode ainda selecionar os pacotes que quiser na opção “Package Selection for the target”, e o resto manter como padrão. Após configurar, salvar e sair.
COMPILANDO O BUILDROOT
Para compilar basta executar o comando “make”. Prepare-se porque o processo é bem demorado. O buildroot irá baixar e compilar todos os pacotes necessários para gerar o toolchain, depois compilar o kernel e gerar o rootfs.
Na minha máquina tive um problema ao compilar o toolchain, onde a função getline() do arquivo “output/toolchain/linux-2.6/scripts/unifdef.c” estava conflitando com outra função getline() da glibc instalada na minha máquina. Alterando getline() para getLine() no arquivo “output/toolchain/linux-2.6/scripts/unifdef.c” resolveu o problema.
Toda a compilação é feita dentro do diretório “output”, e os seguintes diretórios são criados lá dentro:
- build: onde o kernel e os pacotes do rootfs são compilados;
- host: ferramentas para cross-compilar os pacotes;
- images: imagens geradas do kernel e do rootfs;
- staging: toolchain gerado;
- stamps: diretório de controle do buildroot;
- target: estrutura de diretórios e arquivos do rootfs final;
- toolchain: onde o toolchain foi compilado.
CORRIGINDO A CONFIGURAÇÃO DA CONSOLE
Após a compilação, as imagens já estarão prontas para serem carregadas na mini2440, mas antes precisamos corrigir a configuração da console. Edite o arquivo “output/target/etc/inittab”, comente a linha com “ttyS0” e insira outra linha com “ttySAC0”, conforme abaixo:
#ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100 # GENERIC_SERIAL ttySAC0::respawn:/sbin/getty -L ttySAC0 115200 vt100 # GENERIC_SERIAL |
Compile novamente com o comando “make”. As imagens finais do kernel (uImage) e do rootfs (rootfs.jffs2) estarão em “output/images”.
GRAVANDO A IMAGEM
O processo de gravação da imagem é o mesmo que usamos para o Emdebian neste post aqui. Preste atenção apenas nos tamanhos dos arquivos no momento da execução dos comandos de gravação na flash.
Agora temos um Linux enxuto, com boot bem rápido (5 segundos para aparecer a console), e que podemos usar como base para estudos ou mesmo projetos comerciais.
Um abraço!
Sergio Prado