Banana Pi BPI-M2S Amlogic A311D AI开发板快速使用说明

789 阅读6分钟

准备

  1. 准备一根usb转串口线,一个5V/3A适配器type-c电源。串口线用于console调试,type-c线用于android镜像下载和ADB调试。
  2. 准备一张至少8GB的SD卡,用于linux开发,android仅支持emmc启动。
  3. SOC rom 第一个启动介质是 emmc,因此如果 emmc 可启动且任何镜像都可启动,则主板无法从 SD 卡启动,更多信息请参阅主板启动顺序。
  4. 只有 A311D 变体板有摄像头、mipi 面板和 npu 支持。

安卓

准备

  1. 下载并安装AML USB 刻录工具,用于通过 type-c 下载 Android 镜像,仅支持 Windows。
  2. 下载最新的android镜像,并确认md5校验和正确。

使用 USB 刻录工具安装映像

  1. 打开USB_Burning_Tool.exe,选择菜单File→Import image,选择android镜像文件aml_upgrade_package.img。

    m2s_android_install_1.png

  2. 按住开发板上的 USB 按钮,将 type-c USB 电缆插入 PC 或如果已连接电源适配器,请按 RST 按钮,大约两秒钟后,松​​开按钮,开发板将被正确识别。

    m2s_android_install_3.png

    m2s_android_install_2.png

  3. 点击下载工具的开始按钮,等待升级完成。

    m2s_android_install_4.png

  4. 烧录成功后,拔掉type-c USB并连接电源适配器即可启动。

    m2s_android_install_5.png

  5. 单击“停止”按钮取消升级过程并关闭 USB 刻录工具。

使用 Aml Flash 工具安装映像

Aml-flash-tool是一款适用于 Amlogic android 的 Linux 平台开源镜像 flash util。

$ ./flash-tool.sh --img=/path/to/aml_upgrade_package.img --parts=all --wipe --soc=g12a --reset=y

复制

m5_linux_flash.png

构建 Android 源代码

  1. 获取Android 9.0源代码

    git clone https://github.com/BPI-SINOVOIP/BPI-A311D-Android9
    

    复制

    或者您可以从百度盘(pincode:8888)GoogleDrive获取源代码tar存档

  2. 构建Android 9.0源码
    请阅读源码README.md

Android DTB 覆盖

Bananapi M2S DTBO idx 值表,发布镜像中默认 idx 值为 0。

Bananapi M2S DTBO idx值表
idx值设备树覆盖描述
0android_p_overlay默认dtbo,没用
1wifi_bt_rtl8822cs启用 bpi rtl8822cs wifi/bt 模块
2i2c1启用 i2c 1
3i2c2启用 i2c 2
4sdio启用sdio
5串口1启用 2 引脚 UART 1
6uart1_cts_rts启用4针UART 1
7串口2启用 2 引脚 UART 2
8hifi_pcm5122启用 i2s pcm5122 HiFi DAC

如何应用新的 dtbo

  1. 通过 sysfs 的 ADB 命令

    root@dangku-desktop:/tmp# adb root
    restarting adbd as root
    root@dangku-desktop:/tmp# adb remount
    remount succeeded
    root@dangku-desktop:/tmp# adb shell
    bananapi_m2s:/ # echo dtbo > /sys/class/unifykeys/name
    bananapi_m2s:/ # echo "1" > /sys/class/unifykeys/write
    bananapi_m2s:/ # reboot
    

    复制

  2. 通过 sysfs 的 Uart 控制台命令

    console:/ $
    console:/ $ su
    console:/ # echo dtbo > /sys/class/unifykeys/name
    [  115.702781@0] unifykey: name_store() 1302, name dtbo, 4
    [  115.702856@0] unifykey: name_store() 1311
    console:/ #
    console:/ # echo "1" > /sys/class/unifykeys/write
    [  129.262659@0] unifykey: write_store()  is a string
    [  129.262733@0] unifykey: dtbo, 1, 1
    [  129.265312@0] unifykey: amlkey_write 393
    [  129.292347@1] emmc_key_write:149, write ok
    console:/ #
    console:/ # reboot
    

    复制

  3. 设置应用程序(待办事项)

    检查启动uart调试消息并确认实际加载了哪个dtbo,这里“1”表示设置idx=1以应用wifi_bt_rtl8822cs dtbo。

    load dtb from 0x1000000 ......
          Amlogic multi-dtb tool
          Single dtb detected
    find 2 dtbos
    dtbos to be applied: 1
    Apply dtbo 1
    

    复制

    Unifykeys 存储在特定的 emmc 部分中,在 USB_Burning_Tool 中选择的“正常擦除”不会在下次更新时擦除此数据,如果您希望在映像下载后应用默认的 dtbo idx,则必须选择“擦除全部”。

    m2s_android_erase_all.png

使用特定的 DTBO 默认值构建 Android 映像。

  1. 默认内置覆盖层在 device/bananapi/bananapi_m2s/Kernel.mk 中定义,您可以在此处添加新的覆盖层 dtbo。

    DTBO_DEVICETREE := android_p_overlay wifi_bt_rtl8822cs i2c1 i2c2 sdio uart1 uart1_cts_rts uart2 hifi_pcm5122
    

    复制

  2. 默认应用 DTBO idx 在 device/bananapi/bananapi_m2s/BoardConfig.mk 中定义,您可以更改 idx 值来设置默认应用哪个覆盖 dtbo。

    BOARD_KERNEL_CMDLINE += androidboot.dtbo_idx=0
    

    复制

  3. DTS 文件位于 common/arch/arm64/boot/dts/amlogic/overlay/bananapi_m2s/
    更多关于 android 设备树覆盖的信息,请参考google android 官方网站

安装 OpenGapps

  1. 从OpenGapps下载安装包,Android版本镜像是arm/android 9.0变体。

    opengapps.png

  2. 下载device_id.apk

  3. 将 OpenGapp 包复制到 udisk 或 sdcard 根目录。

  4. 在udisk或sdcard根目录下创建一个名为factory_update_param.aml的txt文件,其中包含以下android恢复参数内容,并将文件名替换为实际下载的包。
    优盘:

    --wipe_cache
    --update_package=/udisk/open_gapps-arm-9.0-pico-20210327.zip
    

    复制

    SD卡:

    --wipe_cache
    --update_package=/sdcard/open_gapps-arm-9.0-pico-20210327.zip
    

    复制

  5. 将 udisk 或 sdcard 插入开发板并开机。

  6. OpenGapps 安装并认证。

    YouTube 视频:youtu.be/fXOKmWfpqF8

    您也可以在bilibili上观看该视频

开关Mipi面板

默认的android发布镜像只支持一个mipi面板,因为硬件在启动时没有检测不同面板的逻辑,所以默认启用[800x1280 bpi面板],但你可以在设置→面板输出中更改为默认[1200x1920 bpi面板]

m2s_panel_switch.png

面板旋转

两个 10" mipi 面板都是纵向硬件显示,因此默认的 android 发布图像是纵向模式,但您可以通过两种方式将其旋转到 90/180/270。

  1. 设置中的UI旋转→显示→屏幕旋转

    m2s-旋转.png

  2. SurfaceFlinger旋转,需要修改android源码并构建

    更改默认的 sf 旋转属性

    diff --git a/device/bananapi/bananapi_m2s/bananapi_m2s.mk b/device/bananapi/bananapi_m2s/bananapi_m2s.mk
    index 1f51703..d592a44 100644
    --- a/device/bananapi/bananapi_m2s/bananapi_m2s.mk
    +++ b/device/bananapi/bananapi_m2s/bananapi_m2s.mk
    @@ -579,6 +579,6 @@ PRODUCT_PROPERTY_OVERRIDES += \
     else
     PRODUCT_PROPERTY_OVERRIDES += \
         ro.sf.lcd_density=213 \
     -    ro.sf.primary_display_orientation=0
    +    ro.sf.primary_display_orientation=90
     endif
    

    复制

    更改 dts 中的触摸面板旋转

    diff --git a/common/arch/arm64/boot/dts/amlogic/bananapi_m2s.dts b/common/arch/arm64/boot/dts/amlogic/bananapi_m2s.dts
     index 4a698b0..3d41b63 100755
     --- a/common/arch/arm64/boot/dts/amlogic/bananapi_m2s.dts
     +++ b/common/arch/arm64/boot/dts/amlogic/bananapi_m2s.dts
     @@ -876,8 +876,8 @@
                     reg = <0x5d>;
                     reset-gpio = <&gpio GPIOA_6 GPIO_ACTIVE_HIGH>;
                     irq-gpio = <&gpio GPIOA_5 GPIO_ACTIVE_HIGH>;
     -               rotation = <4>; /* sf_rotation 0 */
     -               //rotation = <0>; /* sf_rotation 90*/
    +               //rotation = <4>; /* sf_rotation 0 */
    +               rotation = <0>; /* sf_rotation 90*/
                     //rotation = <5>; /* sf_rotation 180 */
                     //rotation = <3>; /* sf_rotation 270 */
    

    复制

自定义 Android 启动徽标

Android bootloader 限制 boot logo fb 显示大小默认为 1080p60hz/1920x1080,并且 android kernel dtb 分区表将 boot logo 分区大小默认限制为 16MB。

  1. 准备一个16位bmp文件,命名为boot-logo.bmp

  2. 将bmp文件压缩为boot-logo.bmp.gz

    $ gzip boot-logo.bmp
    

    复制

  3. 下载m2s_android_bootlogo_tool.zip

  4. 提取此工具

    $ unzip m2s_android_bootlogo_tool.zip
    $ cd m2s_android_bootlogo_tool/
    $ ls -l logo/
    -rwxr--r-- 1 dangku dangku 525054 Sep 25 16:54 bootup.bmp
    -rwxr--r-- 1 dangku dangku 525054 Sep 25 16:54 bootup_secondary.bmp
    -rwxr--r-- 1 dangku dangku    184 May 19  2020 upgrade_bar.bmp
    -rwxr--r-- 1 dangku dangku 180072 May 19  2020 upgrade_error.bmp
    -rwxr--r-- 1 dangku dangku 180072 May 19  2020 upgrade_fail.bmp
    -rwxr--r-- 1 dangku dangku 180072 May 19  2020 upgrade_logo.bmp
    -rwxr--r-- 1 dangku dangku 180072 May 19  2020 upgrade_success.bmp
    -rwxr--r-- 1 dangku dangku    184 May 19  2020 upgrade_unfocus.bmp
    -rwxr--r-- 1 dangku dangku 180072 May 19  2020 upgrade_upgrading.bmp
    

    复制

  5. 复制 boot-logo.bmp.gz

    $ cp boot-logo.bmp.gz logo/bootup.bmp
    $ cp boot-logo.bmp.gz logo/bootup_secondary.bmp
    

    复制

  6. 使用img pack工具创建目标logo.img,m2s_android_bootlogo_tool的二进制文件和相关库从/out/host/linux-x86复制

    $ ./logo_img_packer -r logo logo.img
    

    复制

  7. 带有 fastboot 的 Flash 启动徽标

    $ adb root
    $ adb remount
    $ adb reboot fastboot
    

    复制

    等待几秒,检查fastboot是否连接

    $ fastboot device
    1234567890      fastboot
    $ fastboot flashing unlock_critical
    $ fastboot flashing unlock
    $ fastboot flash logo logo.img
    $ fastboot reboot
    

    复制

Linux

准备

  1. Linux 镜像支持 SDcard 或 EMMC 启动。

  2. 建议使用A1级卡,至少8GB。

  3. 如果您想从 SD 卡启动,请确保可启动 EMMC 已格式化

  4. 如果您想从 EMMC 启动并使用 Sdcard 作为存储,请确保 SD 卡已格式化且没有 Linux 映像。

  5. 在您的 Linux PC 上安装 bpi-tools(如果使用其他工具刷新映像,请忽略此步骤)。如果您无法访问此 URL 或出现任何其他安装问题,请转至bpi-tools源代码库,手动下载并安装此工具。

    $ apt-get install pv
    $ curl -sL https://github.com/BPI-SINOVOIP/bpi-tools/raw/master/bpi-tools | sudo -E bash
    

    复制

  6. 下载Linux最新的Linux Image,并确认md5校验和正确。

  7. 默认登录名:pi/bananapi 或 root/bananapi

  8. wiki 指南仅适用于 Bananapi 4.9 bsp ubuntu/debian 映像。

将映像安装到 SD 卡

在 Windows、Linux 和 MacOS 上使用 Balena Etcher 安装映像。

Balena Etcher是 Balena 的一款开源 GUI 闪存工具,可将操作系统映像闪存到 SD 卡或 USB 驱动器。

单击“Flash from file”以选择图像。单击“选择目标”以选择 USB 设备。点击“闪光!” 开始燃烧。

蚀刻机.jpg

在 Windows、Linux 和 MacOS 上使用 Balena Cli 安装映像。

Balena CLI是 balenaCloud 或 openBalena 的命令行界面。它可用于刷新 linux 映像。从balena-io下载安装程序或独立包并将其正确安装到您的 PC,然后您可以使用 balena 的“ local flash ”命令选项将 Linux 映像刷新到 sdcard 或 USB 驱动器。

$ sudo balena local flash path/to/xxx-bpi-m2s-xxx.img.zip
$ sudo balena local flash path/to/xxx-bpi-m2s-xxx.img.zip --drive /dev/disk2
$ sudo balena local flash path/to/xxx-bpi-m2s-xxx.img.zip --drive /dev/disk2 --yes

复制

在 Linux 上使用 dd 命令安装镜像

如果自动安装,则安装 SD 卡设备 /dev/sdX 分区。实际上 bpi-copy 和这个 dd 命令是一样的。

$ sudo apt-get install pv unzip
$ sudo unzip -p xxx-bpi-m2s-xxx.img.zip | pv | dd of=/dev/sdX bs=10M status=noxfer

复制

在 Linux 上使用 bpi-tools 安装映像

将SD卡插入Linux PC并运行

$ sudo apt-get install pv unzip
$ sudo bpi-copy xxx-bpi-m2s-xxx.img.zip /dev/sdX

复制

将映像安装到 eMMC

  1. 准备一张带有 Linux 镜像的 SD 卡,并用此 SD 卡启动板。

  2. 将 Linux 镜像复制到 udisk,将 udisk 插入主板并安装。

  3. 有两种方法可以将 Linux 映像安装到主板上。

    • 使用 dd 命令安装,如果自动安装则卸载 mmcblk0p1 和 mmcblk0p2 分区。实际上 bpi-copy 和这个 dd 命令是一样的。

      $ sudo apt-get install pv unzip
      $ sudo unzip -p xxx-bpi-m2s-xxx.img.zip | pv | dd of=/dev/mmcblk0 bs=10M status=noxfer
      

      复制

    • 使用 bpi-tools 命令在 udisk 中安装 linux 映像

      $ sudo apt-get install pv unzip
      $ sudo bpi-copy xxx-bpi-m2s-xxx.img.zip /dev/mmcblk0
      

      复制

  4. 下载完成后,安全关闭电源并弹出 SD 卡。

构建 Linux 源代码

  1. 获取Linux bsp源代码

    $  git clone https://github.com/BPI-SINOVOIP/BPI-M2S-bsp
    

    复制

  2. 构建bsp源码
    请阅读源码README.md

  3. 如果您想分别构建uboot和内核,请仅下载u-boot内核,从BPI-M2S-bsp获取工具链、启动脚本和其他配置文件

DTB 叠加

  1. DTB 覆盖用于 40pin gpios 多功能配置并安装在 vfat 引导分区中,您可以使用 mount 命令检查挂载点。

    root@bananapi:~# ls /boot/overlays/
    custom_ir.dtbo      pwm_b-backlight.dtbo  spi0.dtbo
    ds3231.dtbo         pwm_c-beeper.dtbo     uart1_cts_rts.dtbo
    hifi_pcm5102a.dtbo  pwm_cd-c.dtbo         uart1.dtbo
    hifi_pcm5122.dtbo   pwm_cd.dtbo           uart2.dtbo
    i2c1.dtbo           pwm_ef.dtbo           waveshare_tft24_lcd.dtbo
    i2c2.dtbo           pwm_ef-f.dtbo         waveshare_tft35c_lcd.dtbo
    pwm_ab.dtbo         sdio.dtbo             waveshare_tft35c_rtp.dtbo
    

    复制

  2. 更新 vfat /boot/env.txt 中的覆盖环境以启用您想要的功能。

    # Device Tree Overlays
    #   uart1           -- Enable UART1 (uart_A, GPIO Header PIN8 & PIN10)
    #   pwm_c           -- Enable PWM_C (GPIO Header PIN7)
    #   i2c2            -- Enable i2c2 (GPIO Header PIN3 & PIN5)
    #   spi0            -- Enable SPI0 (GPIO Header PIN19 & PIN21 & PIN23 & PIN24)
    overlays="i2c2 spi0 uart1"
    

    复制

  3. 必须重新启动板才能加载覆盖 dtb。

启用相机

linux版本镜像默认是关闭摄像头的,按照如下配置,可以自行开启。

  1. 更新/boot/env.txt 中的dtb 覆盖环境以启用相机 dtbo。

    overlays="os08a10"
    

    复制

  2. 将摄像头模块添加到/etc/modules

    iv009_isp_iq
    iv009_isp_lens
    iv009_isp_sensor
    iv009_isp
    

    复制

  3. 创建相机模块选项并将其添加到 /etc/modprobe.d/os08a10.conf

    #choose camera calibration parameters
    options iv009_isp_iq cali_name=0
    #choose isp register sequence
    options iv009_isp_sensor isp_seq_num=0
    

    复制

  4. 启用相机 isp systemd 服务

    $ sudo systemctl enable camera_isp_3a_server.service
    

    复制

    重启后摄像头设备为/dev/video0。

开关Mipi面板

默认的 linux 版本镜像仅支持一种 mipi 面板,因为硬件在启动时没有检测不同面板的逻辑,因此默认启用 800x1280 bpi 面板,但您可以在 /boot/lcd_env.txt 中更改为默认 [1200x1920 bpi 面板]

# Mipi panel type
#    Symbol    | Resolution
# ----------------------+-------------
#    "lcd_0"   | 10" 800x1280 panel
#    "lcd_1"   | 10" 1200x1920 panel
panel_type=lcd_0

复制

**注意:Linux 上不支持双显,所以使用 mipi 时请断开 HDMI 线。

面板旋转

两个 10" mipi 面板都是纵向硬件显示,因此默认发布图像是纵向模式,但您可以将其旋转到 90/180/270。
对于桌面图像,创建 xorg 配置文件 /usr/share/X11/xorg .conf.d/10-fbdev-rotate.conf 内容:

Section "Device"
    Identifier "Configured Video Device"
    # Rotate off
#   Option "Rotate" "off"
    # Rotate Right / clockwise, 90 degrees
    Option "Rotate" "CW"
    # Rotate upside down, 180 degrees
#   Option "Rotate" "UD"
    # Rotate counter clockwise, 270 degrees
#   Option "Rotate" "CCW"

EndSection

Section "InputClass"
    Identifier "Coordinate Transformation Matrix"
    MatchIsTouchscreen "on"
    MatchProduct "goodix-ts"
    MatchDevicePath "/dev/input/event0"
    MatchDriver "libinput"
    # Rotate Right / clockwise, 90 degrees
    Option "CalibrationMatrix" "0 1 0 -1 0 1 0 0 1"
    # Rotate upside down, 180 degrees
#   Option "CalibrationMatrix" "-1 0 1 0 -1 1 0 0 1"
    # otate counter clockwise, 270 degrees
#   Option "CalibrationMatrix" "0 -1 1 1 0 0 0 0 1"

EndSection

复制

对于服务器图像,您可以通过两种方式更改帧缓冲区旋转:

  1. Sysfs 动态变化。

    echo 0 > /sys/class/graphics/fbcon/rotate    //origin 0 degree
    echo 1 > /sys/class/graphics/fbcon/rotate    //90 degree
    echo 2 > /sys/class/graphics/fbcon/rotate    //180 degree
    echo 3 > /sys/class/graphics/fbcon/rotate    //270 degree
    

    复制

  2. 引导配置更改。
    更改 /boot/env.txt 中的 fb_rotate 环境

    # Framebuffer Rotate
    # 0 - origin 0 degree
    # 1 - 90 degree
    # 2 - 180 degree
    # 3 - 270 degree
    fb_rotate=0
    

    复制

接线Pi

**注意:此 WiringPi 仅支持将 40pin gpio 设置为输出、输入、pwm 或软件 pwm,对于 i2c、spi 等 io 功能,您必须在 boot.ini 中启用 dtb 覆盖
  1. 构建并安装wiringPi,对于debian,必须在构建之前安装sudo

    $ sudo apt-get update
    $ sudo apt-get install build-essential git
    $ git clone https://github.com/Dangku/amlogic-wiringPi
    $ cd amlogic-wiringPi
    $ chmod a+x build
    $ sudo ./build
    

    复制

  2. 运行 gpio readall 显示所有 40 针状态。

    m2s_wiringpi.png

  3. BPI GPIO 扩展板和amlogic-wiringPi/示例
    中的示例 blinkall,闪烁所有引脚接头gpios,无扩展板。
    lcd-bpi,BPI LCD 1602 显示模块示例。
    52pi-bpi,BPI OLED 显示模块示例。
    matled-bpi,BPI RGB LED 矩阵扩展模块示例。
    berryclip-bpi,BPI BerryClip 模块

Raspberry Pi GPIO

构建并安装,对于 debian,必须在构建之前安装 sudo

$ sudo apt-get update
$ sudo apt-get install build-essential python3 python3-pip python3-dev python3-setuptools git
$ git clone https://github.com/Dangku/RPi.GPIO-Amlogic.git
$ cd RPi.GPIO-Amlogic
$ sudo python3 setup.py clean --all
$ sudo python3 setup.py install

复制

创建并安装wheel包

$ sudo python3 setup.py bdist_wheel
$ sudo pip3 install dist/RPi.GPIO-XXX.whl

复制

直接从git源码安装,无需开发

$ sudo pip3 install git+https://github.com/Dangku/RPi.GPIO-Amlogic.git

复制

如果该软件包已安装,则应在安装新软件包之前将其卸载,或者使用 --force-reinstall 选项安装新软件包。

WiringPi2-Python

构建并安装,对于 debian,必须在构建之前安装 sudo

$ sudo apt-get update
$ sudo apt-get install build-essential python3 python3-dev python3-setuptools swig git
$ git clone --recursive  https://github.com/Dangku/WiringPi2-Python-Amlogic.git
$ cd WiringPi2-Python-Amlogic
$ sudo python3 setup.py install

复制

亮度示例

Luma.examples默认使用 GPIO.BCM gpio 模式,因此您应该将 40pin 接头引脚映射到 bcm gpio 编号并正确连接硬件。

  1. 构建并安装 RPi.GPIO 使用 python3 而不是 python 构建bananapi m2s RPi.GPIO,因为 luma 使用 python3。

    $ sudo apt-get update
    $ sudo apt-get install build-essential python3 python3-dev python3-setuptools git
    $ git clone https://github.com/Dangku/RPi.GPIO-Amlogic.git
    $ cd RPi.GPIO-Amlogic
    $ sudo python3 setup.py clean --all
    $ sudo python3 setup.py install
    

    复制

    您可以将 test/led.py 中的 bcmledpin 变量更改为硬件背光 gpio 并运行它以检查 RPi.GPIO 是否正常工作。

    $ sudo python3 test/led.py
    

    复制

    硬件背光将重复打开和关闭

  2. luma.examples 库安装

    $ sudo usermod -a -G i2c,spi,gpio pi
    

    复制

    如果组不存在,以下命令将创建它:

    $ sudo groupadd --system xxx
    $ sudo apt-get install python3-dev python3-pip libfreetype6-dev libjpeg-dev build-essential
    $ sudo apt-get install libsdl-dev libportmidi-dev libsdl-ttf2.0-dev libsdl-mixer1.2-dev libsdl-image1.2-dev
    $ git clone https://github.com/rm-hull/luma.examples.git
    $ cd luma.examples
    

    复制

    安装luma.core、luma.emulator、luma.lcd、luma.le-matrix、luma.oled pip libs,确保这一步没有错误或下载中断,如果出错请重试

    $ sudo -H pip install -e .
    

    复制

    或者

    $ sudo -H pip3 install -e .
    

    复制

    对于 debian buster(python 3.7),它在 python3-pip 包中不包含 /usr/bin/pip,并且在使用 pip3 安装 luma 包时会出现以下错误

    ...
    WARNING, No "Setup" File Exists, Running "buildconfig/config.py"
    Using UNIX configuration...
    
    /bin/sh: 1: sdl2-config: not found
    /bin/sh: 1: sdl2-config: not found
    /bin/sh: 1: sdl2-config: not found
    ...
    

    复制

    安装 sdl2 相关软件包来解决此问题,然后使用 pip3 再次安装 luma libs

    $ sudo apt-get install libsdl2-dev libsdl2-ttf-dev libsdl2-mixer-dev libsdl2-image-dev
     $ sudo -H pip3 install -e .
    check installed luma pip libs
     $ pip3 list | grep luma
    
       luma.core          2.4.0
       luma.emulator      1.4.0
       luma.lcd           2.10.0
       luma.led-matrix    1.7.0
       luma.oled          3.11.0
    

    复制

  3. 示例测试在运行测试示例之前
    启用 i2c 或 spi覆盖

    $ cd examples
    $ sudo python3 bounce.py --config ../conf/ili9341.conf
    

    复制

HDMI液晶屏

Bananapi M2 经过超级测试的 HDMI LCD
控制板/boot/boot.ini
微享 3.5寸 480x320setenv display_autoDetect“假” setenv hdmimode“480x320p60hz”
微享 3.5寸 640x480
威享4寸720x720
威享5寸960x544
威享5寸800x480
微享 5.5寸 1440x2560setenv display_autoDetect “假” setenv hdmimode “1440x2560p60hz”
威享 7寸 800x480
威享 7寸 1024x600
微享 7.9英寸 400x1280
威享 8寸 1536x2048setenv display_autoDetect “假” setenv hdmimode “1536x2048p60hz”
微享 8.8寸 480x1920
威享9寸2560x1600setenv display_autoDetect “假” setenv hdmimode “2560x1600p60hz”
微享 10.1英寸 1024x600
微享 10.1寸 1280x800
微享 11.9英寸 320x1480
微享 12.3英寸 1920x720
微享 13.3英寸 1920x1080
微享 15.6英寸 1920x1080

背光控制:github.com/Dangku/Wave…

自定义 Linux 启动徽标

Linux uboot 默认将启动徽标 fb 大小限制为 1080p60hz/1920x1080,因此默认图像将不支持过大的分辨率,但您可以修改 uboot 源代码以支持它。

  1. 准备一个24位bmp文件,命名为boot-logo.bmp
  2. 将目标文件复制到 /boot/firmware/ 或 /boot/ 目录。

其他发展

启动顺序

m5_linux_boot_sequence.png

在控制台调试消息的开头检查从 SDcard 或 EMMC 加载的引导加载程序

  1. Rom 从 SD 卡加载引导加载程序(Linux 日志示例)

    ...
    
    BL2 Built : 15:21:42, Mar 26 2020. g12a g486bc38 - gongwei.chen@droid11-sz
    
    Board ID = 1
    Set cpu clk to 24M
    Set clk81 to 24M
    Use GP1_pll as DSU clk.
    DSU clk: 1200 Mhz
    CPU clk: 1200 MHz
    Set clk81 to 166.6M
    board id: 1
    Load FIP HDR DDR from SD, src: 0x00010200, des: 0xfffd0000, size: 0x00004000, part: 0
    fw parse done
    PIEI prepare done
    fastboot data verify
    result: 255
    Cfg max: 12, cur: 1. Board id: 255. Force loop cfg
    DDR4 probe
    
    ...
    

    复制

  2. ROM 从 EMMC 加载引导加载程序(Android 日志示例)

    ...
    
    Board ID = 1
    Set cpu clk to 24M
    Set clk81 to 24M
    Use GP1_pll as DSU clk.
    DSU clk: 1200 Mhz
    CPU clk: 1200 MHz
    Set clk81 to 166.6M
    eMMC boot @ 0
    sw8 s
    board id: 1
    Load FIP HDR DDR from eMMC, src: 0x00010200, des: 0xfffd0000, size: 0x00004000, part: 0
    fw parse done
    PIEI prepare done
    00000000
    emmc switch 1 ok
    ddr saved addr:00016000
    Load ddr parameter from eMMC, src: 0x02c00000, des: 0xfffd0000, size: 0x00001000, part: 0
    00000000
    
    ...
    

    复制

擦除 EMMC 以用于 SD 卡启动

有四种可能的情况需要注意,EMMC 已经刷入 Android 镜像、EMMC 已经刷入 Linux 镜像、BL2 中启动进程挂起以及 EMMC 为空。

  1. 带有 Android 映像的可启动 EMMC 已闪存

    • 使用USB烧录工具,在7%格式化下载过程中拔掉Type-C USB线****

      m5_android_format.png

    • 使用 Android Fastboot 工具,请确保 adb/fastboot 工具在您的 PC 上正常运行,然后再执行此操作。

      root@dangku-desktop:/tmp# adb root
      adbd is already running as root
      root@dangku-desktop:/tmp# adb remount
      remount succeeded
      root@dangku-desktop:/tmp# adb shell
      bananapi_m2s:/ # reboot fastboot
      

      复制

      等待几秒钟,让主板重新启动至快速启动模式

      root@dangku-desktop:/tmp# fastboot devices
      1234567890  fastboot
      root@dangku-desktop:/tmp# fastboot flashing unlock_critical
      ...
      OKAY [  0.044s]
      finished. total time: 0.044s
      root@dangku-desktop:/tmp# fastboot flashing unlock
      ...
      OKAY [  0.047s]
      finished. total time: 0.047s
      root@dangku-desktop:/tmp# fastboot erase bootloader
      erasing 'bootloader'...
      OKAY [  0.059s]
      finished. total time: 0.059s
      root@dangku-desktop:/tmp# fastboot erase bootloader-boot0
      erasing 'bootloader-boot0'...
      OKAY [  0.036s]
      finished. total time: 0.036s
      root@dangku-desktop:/tmp# fastboot erase bootloader-boot1
      erasing 'bootloader-boot1'...
      OKAY [  0.035s]
      finished. total time: 0.035s
      

      复制

    • 使用uboot命令,连接调试控制台电缆并在开机时按ESC键进入uboot命令行

      bananapi_m2s_v1#amlmmc erase 1
      emmckey_is_protected(): protect
      start = 0,end = 57343
      start = 221184,end = 30535679
      Erasing blocks 0 to 8192 @ boot0
      start = 0,end = 8191
      Erasing blocks 0 to 8192 @ boot1
      start = 0,end = 8191
      bananapi_m2s_v1#reset
      resetting ...
      SM1:BL:511f6b:81ca2f;FEAT:A0F83180:20282000;POC:F;RCY:0;EMMC:0;READ:0;CHK:1F;READ:0;CHK:1F;READ:0;CHK;
      

      复制

      这两种方式实际上擦除了 EMMC android 的 bootloader 部分,从 SDcard Linux 启动后,最好通过 dd 命令格式化整个 EMMC

    • 最简单的方法是在开机前插入带有 Linux 映像的 SD 卡,Android 引导加载程序将检查 SD 卡 vfat 分区中是否存在 boot.ini 文件,以便 SD 卡 Linux 启动。启动后,您可以通过 dd 命令格式化整个 EMMC,然后将 Linux 映像刷新到 EMMC。

      ...
      BPI: try boot from sdcard
      reading boot.ini
      2453 bytes read in 3 ms (797.9 KiB/s)
      ## Executing script at 03080000
      Starting boot.ini...
      reading env.txt
      3483 bytes read in 7 ms (485.4 KiB/s)
      HDMI: Autodetect: 1080p60hz
      reading Image.gz
      10924573 bytes read in 611 ms (17.1 MiB/s)
      reading bananapi_m2s.dtb
      88054 bytes read in 12 ms (7 MiB/s)
      reading uInitrd
      11704481 bytes read in 655 ms (17 MiB/s)
      reading overlays/wifi_bt_rtl8822cs.dtbo
      729 bytes read in 6 ms (118.2 KiB/s)
      

      复制

  2. 带有 Linux 映像的可启动 EMMC 已闪存

    • 使用uboot命令,连接调试控制台电缆并在开机时按ESC键进入uboot命令行

      bananapi_m2s# mmc erase 0 1000
      

      复制

    • Linux u-boot 还会检查 SDcard vfat 分区中是否存在 boot.ini 文件,以便 SDcard Linux 启动。启动后,您可以通过 dd 命令格式化整个 EMMC 或将 Linux 映像直接刷新到 EMMC。

  3. 极端情况是bootloader或uboot损坏,ROM从EMMC加载,但在u-boot或BL2中挂起,例如如果dram init失败,启动过程将挂在EMMC的BL2中,唯一的方法是使用USB烧录工具格式化EMMC ,或者完全下载 Android 映像,然后尝试其他方法擦除 EMMC 或将 Linux 映像刷新到 EMMC。

  4. 如果 EMMC 为空,Rom 将尝试直接从 SD 卡加载 bootloader。

通过dd命令擦除Emmc Android

如果板子以前刷过android,如果你想用SDcard Linux镜像启动它,整个emmc必须被这些命令擦除。

$ sudo dd if=/dev/zero of=/dev/mmcblk0boot0 bs=1M status=noxfer
$ sudo dd if=/dev/zero of=/dev/mmcblk0boot1 bs=1M status=noxfer
$ sudo dd if=/dev/zero of=/dev/mmcblk0 bs=1M status=noxfer
$ sync

复制

无线网络/蓝牙支持

  1. Android 测试和支持。

    rtl8723bu wifi/bt(usb)
    rtl8188eu wifi(usb)
    rtl8821cu wifi/bt(usb)
    rtl8822cs wifi/bt(sdio/uart)
    rtl8814au wifi(usb), please get the aircrack-ng driver and install.
    

    复制

    如何启用 Android Wifi/BT
    USB 类型:将 USB 加密狗插入 USB 主机端口并重新启动系统,启动后,您可以在“设置”应用程序中启用或禁用 wifi 和蓝牙。
    SDIO/UART 类型:将硬件模块正确连接到 40 针接头并配置 Android DTB 覆盖以启用它。

    **注意:Android不支持以太网和wifi同时连接,以太网比wifi具有更高的优先级,这意味着如果以太网已连接,则wifi无法连接网络,如果以太网电缆插件,wifi将断开连接。
  2. Linux 测试和支持。

    rtl8188eu wifi(usb)
    rtl8192eu wifi(usb)
    rtl8723bu wifi/bt(usb)
    rtl8811au wifi(usb)
    rtl8812au wifi(usb)
    rtl8812bu wifi(usb)
    rtl8821cu wifi/bt(usb)
    rtl8822cs wifi/bt(sdio/uart)
    

    复制

    如何启用 Linux Wifi

    Wifi 模块驱动程序已在发布映像中预构建。

    USB类型:将USB加密狗插入USB主机端口,驱动程序将自动加载。SDIO/UART 类型:

    • 将硬件模块正确连接至 40pin 排座。

    • 配置dtb 覆盖

      overlays="wifi_bt_rtl8822cs"
      

      复制

    • 将 wifi 模块名称添加到 /etc/modules 中,以便下次启动时自动加载。

      # This file contains the names of kernel modules that should be loaded
      # at boot time, one per line. Lines beginning with "#" are ignored.
      88x2cs
      

      复制

    如何启用 Linux 蓝牙

    • 请下载rtk-linux-bt-driver源代码,构建并安装 USB 或 uart rtk linux 蓝牙驱动程序/固件到您的映像。
    • 对于 USB 类型,将 USB 加密狗插入 USB 主机端口,驱动程序将自动加载。
    • 对于 UART 类型,在安装蓝牙驱动程序/固件之前,将 dtb 覆盖配置为与 wifi 相同。hci_uart 驱动程序将在 rtk-hciuart.service 启动时加载。

云初始化&Snap

Cloud-init 和 Snap 服务默认启用,您可以禁用或删除它们。

  1. 禁用或删除 cloud-init

    $ sudo touch /etc/cloud/cloud-init.disabled
    

    复制

    或者

    $ sudo apt purge cloud-init
    

    复制

  2. 禁用或删除快照

    $ sudo apt purge snapd
    

    复制

启用 rc-local

systemd 服务 rc-local.service 已存在于发布映像中,但单元文件中没有 [Install] 部分。因此,Systemd 无法启用它。首先,我们必须更新文件。

$ sudo nano /lib/systemd/system/rc-local.service

复制

[Unit]
Description=/etc/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable=/etc/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no

[Install]
WantedBy=multi-user.target
Alias=rc-local.service

复制

创建 /etc/rc.local 文件。

sudo nano /etc/rc.local
#!/bin/sh
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

exit 0

复制

给/etc/rc.local添加可执行权限

$ sudo chmod +x /etc/rc.local

复制

启用 rc-local.service 并重新启动

$ sudo systemctl enable rc-local.service
$ sudo reboot

复制

为 Debian 启用 sudo

发布的 Debian 镜像默认不安装 sudo,使用“su -”命令,用户可以更改为 root。如果你喜欢sudo,可以安装它。

$ su root
Password:(enter bananapi)

# apt-get update
# apt-get install sudo
# adduser pi sudo

复制

然后请注销并重新登录

安装 Docker 引擎

在 Ubuntu 20.04 服务器上安装 Docker 引擎

  1. 设置存储库 更新 apt 软件包索引并安装软件包以允许 apt 通过 HTTPS 使用存储库:

    $ sudo apt-get update
    $ sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
    

    复制

    添加Docker官方GPG密钥:

    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    

    复制

    设置稳定存储库

    $  echo \
       "deb [arch=arm64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
       $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    

    复制

  2. 安装 Docker 引擎

    $ sudo apt-get update
    $ sudo apt-get install docker-ce docker-ce-cli containerd.io
    

    复制

  3. 通过运行 hello-world 映像来验证 Docker 引擎是否已正确安装。

    $ sudo docker run hello-world
    

    复制

    docker-test.png

    使用简单的命令安装 docker

    $ curl -sSL get.docker.com | sudo sh