Introduction: Gerando Boot Image Com SPI Habilitado Para Dragonboard 410c

About: Frederico Martins Pedroso Junior - Embedded Software Engineer.

O objetivo desse tutorial é disponibilizar os passos necessários para habilitar comunicação SPI no sistema operacional Linux Linaro baseado em Debian (Versão 17.04.1) e plataforma de desenvolvimento Dragonboard 410c.

Step 1: Pré Requisitos

Os pré requisitos são:

Ambiente de desenvolvimento (Host):

Plataforma de desenvolvimento (Target):

Step 2: Cross Compile

Cross compile é um método utilizado para gerar executáveis de software para diferentes arquiteturas de computadores. É usado quando o ambiente de desenvolvimento (Host) tem arquitetura diferente do alvo (Dragonboard 410c).

Neste caso, estamos usando um computador/notebook x64 como Host para compilar e gerar os arquivos necessários para arquitetura ARM e posteriormente configurar na Dragonboard 410c.

Download GCC Linaro Cross Compile (Versão 6.3.1):

wget -c http://releases.linaro.org/components/toolchain/binaries/6.3-2017.02/aarch64-linux-gnu/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu.tar.xz

Definindo um diretório para o Toolchain (Cross Compile):

tar -xJf gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu.tar.xz -C /opt/

Step 3: Git Clone Do Kernel

Clone do Kernel usado no sistema operacional Linux Linaro 17.04.1

Obtendo o Kernel:

git clone -n http://git.linaro.org/landing-teams/working/qualcomm/kernel.git
cd kernel
git checkout -b kernel-17.04.1 debian-qcom-dragonboard410c-17.04.1

Step 4: Adicionando Suporte SPI No Device Tree (DTB)

Considerando que estamos no diretório do Kernel, seguem os passos para adicionar suporte SPI no Device Tree do sistema.

Abra o arquivo (apq8016-sbc.dtsi)

vi arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi

Procure as linhas:

spi@78b7000 {
/* On High speed expansion */
      label = "HS-SPI1";
      status = "okay";
};


spi@78b9000 {
/* On Low speed expansion */
       label = "LS-SPI0";
       status = "okay";
};

Substitua por:

spi@78b7000 {
/* On High speed expansion */
      label = "HS-SPI1";
      status = "okay";
      spidev@0 {
            compatible = "spidev";
            spi-max-frequency = <50000000>;
            reg = <0>;
       };
};


spi@78b9000 {
/* On Low speed expansion */
      label = "LS-SPI0";
      status = "okay";
      spidev@0 {
            compatible = "spidev";
            spi-max-frequency = <50000000>;
            reg = <0>;
      };
};

Pronto! Salve o arquivo apq8016-sbc.dtsi

Step 5: Build Device Tree (DTB)

Definindo algumas variáveis:

export ARCH=arm64
export CROSS_COMPILE=/opt/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-

Gerando o device tree (DTB):

make defconfig distro.config
make -j4 Image dtbs KERNELRELEASE=4.9.30-linaro-lt-qcom

Step 6: Build Boot Image

Antes de seguir os próximos passos, certifique-se que o pacote device-tree-compiler esteja instalado corretamente. Caso esteja usando Debian/Ubuntu como Host, você pode instalar da seguinte forma:

sudo apt-get install device-tree-compiler

Considerando que estamos no diretório raiz do Kernel:

  • O dtbTool irá processar o DTBs gerados para criar uma tabela:
git clone git://codeaurora.org/quic/kernel/skales
./skales/dtbTool -o dt.img -s 2048 arch/arm64/boot/dts/qcom/
  • Para criar a imagem de boot também precisa do ramdisk image:
wget http://builds.96boards.org/releases/dragonboard410c/linaro/debian/17.04.1/initrd.img-4.9.30-linaro-lt-qcom
  • E por fim, usamos o mkbootimg para processar todos arquivos necessários e criar a imagem de inicialização:
./skales/mkbootimg --kernel arch/arm64/boot/Image \
--ramdisk initrd.img-4.9.30-linaro-lt-qcom \ --output boot-db410c.img \ --dt dt.img \ --pagesize 2048 \ --base 0x80000000 \ --cmdline "root=/dev/disk/by-partlabel/rootfs rw rootwait console=ttyMSM0,115200n8"

Pronto! Feito isso temos o boot-db410c.img gerado.

Step 7: Testando a Interface SPI

Teste a interface SPI e verifique está funcionando corretamente.