Tutorial de Compilação do AOSP e Inclusão de Driver na Raspberry Pi - theedwilk/JoystickRaspberry-HandsOn-DevTitans GitHub Wiki

📖 Sobre o Projeto

Este tutorial faz parte do projeto Joystick Raspberry – DevTITANS Hands-On, e tem como objetivo demonstrar o processo de compilação do Android Open Source Project (AOSP) com a inclusão de um driver personalizado (NESJoy) para a Raspberry Pi 4.

Através deste guia, você aprenderá a:

  • Baixar e configurar o AOSP da Raspberry Pi.

  • Compilar o AOSP com um driver customizado.

  • Gerar e gravar uma imagem Android pronta para execução no dispositivo.

1. Baixando o AOSP da Raspberry

Fonte

  • Link: Raspberry Vanilla AOSP Manifest
  • Branch: android-16.0
  • Bruno Solimões

Passos

  • Criar uma nova pasta para o aosp da raspberry:
$ mkdir aosp-raspberry 
$ cd aosp-raspberry
  • Instalar os pacotes necessários:
$ sudo apt-get install dosfstools e2fsprogs fdisk kpartx mtools rsync
  • Inicializar o repositório:
$ repo init -u https://android.googlesource.com/platform/manifest -b android-16.0.0_r1
$ curl -o .repo/local_manifests/manifest_brcm_rpi.xml -L https://raw.githubusercontent.com/raspberry-vanilla/android_local_manifest/android-16.0/manifest_brcm_rpi.xml --create-dirs
  • Sincronize o repositório
$ repo sync

2. Criando a Imagem

  • Configure o ambiente de compilação
$ . build/envsetup.sh
  • Selecione o dispositivo ( rpi4 ) e crie o destino (interface do usuário do tablet)
$ lunch aosp_rpi4-bp2a-userdebug
  • Compile o AOSP
$ make bootimage systemimage vendorimage -j$(nproc)
  • Gere uma imagem flashável para o dispositivo ( rpi4)
$ ./rpi4-mkimg.sh

3. Compilando o Kernel do Android

  • Baixando o kernel
$ cd ~
$ mkdir kernel-aosprasp
$ cd kernel-aosprasp
$ repo init --depth=1 -u https://android.googlesource.com/kernel/manifest -b common-android16-6.12
$ repo sync --force-sync --no-clone-bundle --no-tags -j$(nproc)
  • Configure os recursos para compilação do kernel
$ tools/bazel build --defconfig_fragment=common/arch/arm64/configs/gki_defconfig
  • Compile o kernel
$ time tools/bazel run //common-modules/virtual-device:virtual_device_aarch64_dist

4. Gerando o arquivo .ko do drive

  • Crie a pasta do driver
$ cd ~
$ cd /kernel-aosprasp/common-modules/virtual-device
$ mkdir nesjoy

Copie o arquivo joy_driver_module.c para dentro dessa pasta.

  • Inclua ele como dependência na compilação do kernel:
$ cd ..
$ code BUILD.bazel
  • Dentro do BUILD.bazel coloque os seguintes códigos:
filegroup( 
    name = "virtual_device_x86_64_common_sources", 
    srcs = [ 
        ":common_sources", 
        "//common:kernel_x86_64_sources", 
    ], 
) 
 
filegroup( 
    name = "nesjoy", 
    srcs = [ 
        ":nesjoy/joy_driver_module.c" 
    ], 
) 
 
ddk_headers( 
    name = "common_headers", 
    hdrs = glob(["uapi/**/*.h"]), 
    includes = ["."], 
    linux_includes = ["uapi"], 
) … 
… 
ddk_module( 
    name = "aarch64/vkms", 
    srcs = [":vkms_sources"], 
    out = "vkms.ko", 
    kernel_build = ":virtual_device_aarch64", 
    deps = [":common_headers"], 
) 
 
ddk_module( 
    name = "aarch64/nesjoy", 
    srcs = [":nesjoy"], 
    out = "nesjoy.ko", 
    kernel_build = ":virtual_device_aarch64", 
    deps = [":common_headers"], 
) 
 
kernel_module_group( 
    name = "virtual_device_aarch64_external_modules", 
    srcs = [... 
 
… 
kernel_module_group( 
    name = "virtual_device_aarch64_external_modules", 
    srcs = [ 
        ":aarch64/goldfish_drivers/goldfish_address_space", 
        ":aarch64/goldfish_drivers/goldfish_pipe", 
        ":aarch64/goldfish_drivers/goldfish_sync", 
        ":aarch64/v4l2loopback", 
        ":aarch64/vkms", 
        ":aarch64/nesjoy", 
        
"//common-modules/virtio-media/driver:aarch64/virtio-media", 
    ], 
) 
… 

Salve.

5. Compilando o Kernel com o Novo Driver

$ cd ~/kernel-aosprasp
$ time tools/bazel run //common-modules/virtual-device:virtual_device_aarch64_dist
  • Copie o arquivo .ko gerado
$ cp out/virtual-device_aarch64/dist/nesjoy_drive_modulo.ko ~/aosp-raspberry/kernel/nesjoy_drive_modulo

6. Criando o Android.bp do Driver

  • Crie o arquivo: $ code Android.bp

Cole o código:

prebuilt_etc {
    name: "nesjoy.ko",
    src: "nesjoy.ko",
    sub_dir: "lib/modules",
    filename_from_src: true,
    installable: true,
    vendor: true,
}

7. Recompilando o AOSP com o Driver

$ cd ~/aosp-raspberry 
$ . build/envsetup.sh
$ lunch aosp_rpi4-bp2a-userdebug
$ make bootimage systemimage vendorimage -j$(nproc)
$ ./rpi4-mkimg.sh

8. Gravando a Imagem na Raspberry

  • Para gravar a imagem gerada pode usar o gravador oficial da Raspberry, o raspberry image.

Use o Raspberry Pi Imager oficial.

  1. Escolha “Use custom image”.
  2. Localize a imagem gerada em: ~/aosp-raspberry/out/target/product/rpi4
  3. Com o nome: RaspberryVanillaAOSPxx-xxxxxxxx-rpi4.img
  4. Selecione o dispositivo SD e grave.
  5. Insira o cartão SD na Raspberry Pi e ligue-a.