Banana Pi BPI-M5 是新一代单板计算机,采用 Amlogic S905X3 四核 Cortex-A55(2.0 GHz)处理器和带 4 个执行引擎的 Mali-G31 MP2 GPU(650 MHz)。它配备 4 GB LPDDR4 内存、16 GB eMMC、4 个 USB 3.0 端口、1 个千兆网口、红外接收器、音频插孔、1 个 HDMI 输出接口,并通过 USB Type-C 供电。
Banana Pi BPI-M2 Pro 与 BPI-M5 使用相同的 SoC,但电路板布局不同。它配备 2 GB LPDDR4 内存、16 GB eMMC、2 个 USB 3.0 端口、1 个千兆网口、板载 RTL8821CU USB Wi-Fi/蓝牙模块、红外接收器、1 个 HDMI 输出接口、1 个 Micro-USB 端口,并使用直流电源供电。
|
更多信息:Banana Pi BPI-M5 更多信息:Banana Pi BPI-M2 Pro |
SoC:Amlogic S905X3 四核 Cortex-A55 处理器,主频最高 2.0 GHz,搭配 Mali-G31 MP2 GPU(650 MHz) Mali-G31 MP2 GPU,主频 650 MHz
系统内存:4 GB LPDDR4
存储:16 GB eMMC(可选最高 64 GB),MicroSD 卡槽最高支持 2 TB
视频输出:HDMI 2.1,最高支持带 HDR、CEC 和 EDID 的 4Kp60 输出
音频:3.5 mm 音频插孔、HDMI 数字音频
网络:千兆以太网
USB:通过 VL817 Hub 控制器提供 4 个 USB 3.0 端口,另有 1 个 USB-C 端口(可能仅用于供电)
扩展:40 Pin Raspberry Pi 兼容排针,提供 28 路 GPIO、UART、I2C、SPI、PWM 以及 +5 V、+3.3 V 和 GND 电源信号
调试:3 Pin 调试排针
其他:Reset、Power 和 U-Boot 按钮;电源与活动状态 LED;红外接收器
电源:通过 USB Type-C 端口输入 5 V/3 A
尺寸:92 × 60 mm(不同于 Raspberry Pi PCB 尺寸;测量时可能包含连接器)
重量:48 g
准备一根 USB 转串口线和一个 5 V/3 A Type-C 电源适配器。串口线用于控制台调试;BPI-M5 的 Type-C 线和 BPI-M2 Pro 的 Micro-USB 线用于下载 Android 镜像和 ADB 调试。
Linux 开发需要一张至少 8 GB 的 SD 卡;Android 仅支持从 eMMC 启动。
SoC ROM 首先尝试从 eMMC 启动。因此,只要 eMMC 中存在可启动镜像,开发板就无法从 SD 卡启动。更多信息请参阅开发板的启动顺序。
在 Android 中,SD 卡为 mmc0、eMMC 为 mmc1;在 Linux 中,SD 卡为 mmc1、eMMC 为 mmc0。
下载并安装 AML USB Burning Tool,用于通过 BPI-M5 的 USB Type-C 端口或 BPI-M2 Pro 的 Micro-USB 端口下载 Android 镜像;该工具仅支持 Windows。
下载最新的 Android 镜像,并确认 MD5 校验值正确。
BPI-M5 与 BPI-M2 Pro 使用相同的 Android 镜像。
打开 USB_Burning_Tool.exe,选择菜单 File → Import image,然后选择 Android 镜像文件 aml_upgrade_package.img。
断开 BPI-M5/BPI-M2 Pro 的电源,按住 40 Pin 排针旁的 SW4 按钮,再将 Type-C USB 线(BPI-M2 Pro 使用 Micro-USB 线)连接到 PC。
单击 Start 按钮,等待升级完成。
写入成功后,拔下 USB 线,再连接电源适配器启动开发板。
单击 Stop 按钮取消升级过程,然后关闭 USB Burning Tool。
Aml-flash-tool 是一款在 Linux 平台上为 Amlogic Android 设备写入镜像的开源工具。
$ ./flash-tool.sh --img=/path/to/aml_upgrade_package.img --parts=all --wipe --soc=g12a --reset=y
获取 Android 9.0 源代码
$ git clone https://github.com/BPI-SINOVOIP/BPI-S905X3-Android9
也可以从 百度网盘(提取码:8888)或 Google Drive 下载源码 tar 包。
构建 Android 9.0 源代码 请阅读源码仓库中的 README.md。
下表列出 Banana Pi BPI-M5/BPI-M2 Pro 的 DTBO idx 值;发布镜像中的默认 idx 为 0。
| Banana Pi BPI-M5/BPI-M2 Pro DTBO idx 值表 | ||
|---|---|---|
idx 值 |
设备树 Overlay |
说明 |
0 |
android_p_overlay |
默认 DTBO,不启用额外功能 |
1 |
wifi_bt_rtl8822cs |
启用 Banana Pi RTL8822CS Wi-Fi/蓝牙模块 |
2 |
i2c2 |
启用 i2c 2 |
3 |
i2c3 |
启用 i2c 3 |
4 |
sdio |
启用 SDIO |
5 |
uart1 |
启用双引脚 UART 1 |
6 |
uart1_cts_rts |
启用四引脚 UART 1 |
7 |
uart2 |
启用双引脚 UART 2 |
8 |
hifi_pcm5122 |
启用 I2S PCM5122 HiFi DAC |
如何应用新的 DTBO
通过 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_m5:/ # echo dtbo > /sys/class/unifykeys/name
bananapi_m5:/ # echo "1" > /sys/class/unifykeys/write
bananapi_m5:/ # reboot
通过 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
设置应用(待完成)
检查启动时的 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 中选择“Normal erase”不会清除该数据,后续升级仍会保留。若希望下载镜像后应用默认 DTBO idx,必须选择“Erase all”。
构建使用指定默认 DTBO 的 Android 镜像
默认内置 Overlay 定义在 device/amlogic/bananapi_m5/Kernel.mk 中,可以在此处添加新的 DTBO Overlay。
DTBO_DEVICETREE := android_p_overlay wifi_bt_rtl8822cs i2c2 i2c3 sdio uart1 uart1_cts_rts uart2 hifi_pcm5122
默认应用的 DTBO idx 定义在 device/amlogic/bananapi_m5/BoardConfig.mk 中,可以修改 idx 值来选择默认应用的 DTBO Overlay。
BOARD_KERNEL_CMDLINE += androidboot.dtbo_idx=0
DTS 文件位于 common/arch/arm/boot/dts/amlogic/overlay/bananapi_m5/ 有关 Android 设备树 Overlay 的更多信息,请参阅 Android 官方文档。
从 OpenGApps 下载安装包;Android 发布镜像使用 ARM/Android 9.0 版本。
下载 device_id.apk。
将 OpenGApps 软件包复制到 U 盘或 SD 卡根目录。
在 U 盘或 SD 卡根目录创建名为 factory_update_param.aml 的文本文件,写入以下 Android Recovery 参数,并将文件名替换为实际下载的软件包名称。
U 盘:
--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
将 U 盘或 SD 卡插入开发板,然后开机。
安装 OpenGApps 并完成认证。
YouTube 视频: https://youtu.be/fXOKmWfpqF8
观看此视频 哔哩哔哩
开始前需要了解以下 Android 基本概念,并确保相关功能可用。
Linux 内核输入按键事件。
Android 键码。
Linux 键码到 Android 键码的映射。
PC 上的 Android ADB 功能可以正常使用。
从设备中拉取遥控器配置文件
# adb pull /vendor/etc/remote.cfg
# adb pull /vendor/etc/remote.tab
修改 remote.cfg,启用遥控器调试信息
将 remote.cfg 推送回设备
# adb root
# adb remount
# adb push remote.cfg /vendor/etc/
# adb shell
m5_mbox:/ # chmod 644 /vendor/etc/remote.cfg
m5_mbox:/ # remotecfg -c /vendor/etc/remote.cfg -d
cfgdir = /vendor/etc/remote.cfg
work_mode = 1
repeat_enable = 0
debug_enable = 1
max_frame_time = 1000
获取遥控器键码
依次按下遥控器上的各个按键,然后查看 dmesg,获取遥控器的 custom_code 和每个按键的键码。
# adb shell dmesg | grep framecode=
custom_code = 0xfe01
keycode = 0x00, 0x01, 0x09, 0x02, 0x0a, 0x05, 0x04 0x06, 0x03, 0x0b, 0x40, 0x48, 0x44
修改 remote.tab,将扫描码映射为 Android 键码
推送 remote.tab,并测试每个按键是否正常工作。
# adb root
# adb remount
# adb push remote.tab1 /vendor/etc/
# adb shell
m5_mbox:/ # chmod 644 /vendor/etc/remote.tab
m5_mbox:/ # remotecfg -c /vendor/etc/remote.cfg -t /vendor/etc/remote.tab -d
cfgdir = /vendor/etc/remote.cfg
work_mode = 1
repeat_enable = 0
debug_enable = 1
max_frame_time = 1000
tabdir = /vendor/etc/remote.tab
custom_name = nec-test
fn_key_scancode = 0xffff
cursor_left_scancode = 0xffff
cursor_right_scancode = 0xffff
cursor_up_scancode = 0xffff
cursor_down_scancode = 0xffff
cursor_ok_scancode = 0xffff
custom_code = 0xfe01
release_delay = 80
map_size = 13
key[0] = 0x74
key[1] = 0x1008b
key[2] = 0x90066
key[3] = 0x20069
key[4] = 0xa006a
key[5] = 0x50067
key[6] = 0x4006c
key[7] = 0x6001c
key[8] = 0x30072
key[9] = 0xb0073
key[10] = 0x40009e
key[11] = 0x4800a4
key[12] = 0x440071
重启开发板。
Linux 镜像支持从 SD 卡或 eMMC 启动,但请先阅读启动顺序章节。
建议使用容量至少为 8 GB 的 A1 等级存储卡。
BPI-M5 与 BPI-M2 Pro 使用相同的 Linux 镜像。
若要从 SD 卡启动,请先格式化带有可启动系统的 eMMC。
若要从 eMMC 启动并将 SD 卡用作存储,请确保 SD 卡已格式化且未写入 Linux 镜像。
在 Linux PC 上安装 bpi-tools(如果使用其他工具写入镜像,可跳过此步)。如果无法访问该地址或安装时遇到问题,请前往 bpi-tools 源码仓库手动下载并安装。
$ apt-get install pv
$ curl -sL https://github.com/BPI-SINOVOIP/bpi-tools/raw/master/bpi-tools | sudo -E bash
下载最新的 Linux 镜像,并确认 MD5 校验值正确。
默认登录: pi/bananapi 或 root/bananapi
本 Wiki 指南仅适用于 Banana Pi 4.9 BSP Ubuntu/Debian 镜像。
使用 Balena Etcher 写入镜像,支持 Windows、Linux 和 macOS。
Balena Etcher 是 Balena 提供的开源图形化镜像写入工具,可将操作系统镜像写入 SD 卡或 U 盘。
单击“Flash from file”选择镜像。
单击“Select target”选择目标设备。
单击“Flash!”开始写入。
使用 Balena CLI 写入镜像,支持 Windows、Linux 和 macOS。
Balena CLI 是 balenaCloud/openBalena 的命令行工具,可用于写入 Linux 镜像。从 balena-io Releases 下载安装程序或独立软件包,并按照 安装说明正确安装到 PC。随后可使用 Balena 的“local flash”命令将 Linux 镜像写入 SD 卡或 U 盘。
$ sudo balena local flash path/to/xxx-bpi-m5-xxx.img.zip
$ sudo balena local flash path/to/xxx-bpi-m5-xxx.img.zip --drive /dev/disk2
$ sudo balena local flash path/to/xxx-bpi-m5-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-m5-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-m5-xxx.img.zip /dev/sdX
准备一张已写入 Linux 镜像的 SD 卡,并用该 SD 卡启动开发板。
将 Linux 镜像复制到 U 盘,将 U 盘插入开发板并挂载。
可通过以下 两种方式 将 Linux 镜像安装到开发板。
使用 dd 命令安装。如果 mmcblk0p1 和 mmcblk0p2 分区已自动挂载,请先卸载。bpi-copy 的实际作用与这里的 dd 命令相同。
$ sudo apt-get install pv unzip
$ sudo unzip -p xxx-bpi-m5-xxx.img.zip | pv | dd of=/dev/mmcblk0 bs=10M status=noxfer
使用 bpi-tools 命令安装 U 盘中的 Linux 镜像
$ sudo apt-get install pv unzip
$ sudo bpi-copy xxx-bpi-m5-xxx.img.zip /dev/mmcblk0
下载完成后,安全关闭电源并弹出 SD 卡。
获取 Linux BSP 源代码
$ git clone https://github.com/BPI-SINOVOIP/BPI-M5-bsp
构建 BSP 源代码
请阅读源码仓库中的 README.md。
如果要分别构建 U-Boot 和内核,请仅下载 U-Boot 与 内核 源码;工具链、启动脚本及其他配置文件请从 BPI-M5-bsp 获取。
DTB Overlay 用于配置 40 Pin GPIO 的复用功能,文件位于 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
i2c0.dtbo pwm_ef.dtbo waveshare_tft24_lcd.dtbo
i2c1.dtbo pwm_ef-f.dtbo waveshare_tft35c_lcd.dtbo
pwm_ab.dtbo sdio.dtbo waveshare_tft35c_rtp.dtbo
修改 VFAT 分区中 /boot/boot.ini 的 overlays 环境变量,启用所需功能。默认启用 i2c0、spi0 和 uart1。
# Overlays to load
# Example combinations:
# spi0 i2c0 i2c1 uart0
# hktft32
# hktft35
setenv overlays "i2c0 spi0 uart1"
修改后必须重启开发板,DTB Overlay 才会加载。
| 此 WiringPi 仅支持将 40 Pin GPIO 配置为输出、输入或软件 PWM。若要使用 I2C、SPI、硬件 PWM 等复用功能,必须在 boot.ini 中启用相应的 DTB Overlay。 |
构建并安装 WiringPi。在 Debian 上构建之前,必须先安装 sudo。
$ sudo apt-get update
$ sudo apt-get install build-essential git
$ git clone https://github.com/BPI-SINOVOIP/amlogic-wiringPi
$ cd amlogic-wiringPi
$ chmod a+x build
$ sudo ./build
运行 gpio readall,显示全部 40 Pin 引脚的状态。
BPI GPIO 扩展板示例位于 amlogic-wiringPi/examples
blinkall:不使用扩展板,依次闪烁排针上的所有 GPIO。
lcd-bpi:BPI LCD 1602 显示模块示例。
52pi-bpi:BPI OLED 显示模块示例。
matrixled-bpi:BPI RGB LED 矩阵扩展模块示例。
berryclip-bpi:BPI BerryClip 模块示例。
构建并安装 RPi.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 编号模式,因此需要将 40 Pin 排针映射到 BCM GPIO 编号,并正确连接硬件。
构建并安装 RPi.GPIO
$ 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
硬件背光将反复亮起和熄灭。
安装 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.led-matrix 和 luma.oled 等 pip 库。请确保此步骤未报错且下载未中断;如有错误,请重试。
$ 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 库:
$ sudo apt-get install libsdl2-dev libsdl2-ttf-dev libsdl2-mixer-dev libsdl2-image-dev
$ sudo -H pip3 install -e .
检查已安装的 Luma pip 库:
$ 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
测试示例 运行测试示例前,请启用 I2C 或 SPI Overlay。
$ cd examples
$ sudo python3 bounce.py --config ../conf/ili9341.conf
| Banana Pi BPI-M5/BPI-M2 Pro 已测试的 HDMI LCD | |
|---|---|
面板 |
/boot/boot.ini |
setenv display_autodetect "false" |
|
setenv display_autodetect "false" |
|
setenv display_autodetect "false" |
|
setenv display_autodetect "false" |
|
S905X3 的 SoC ROM 不支持从 USB 启动。因此,要从 U 盘运行 Linux,必须先在 SD 卡或 eMMC 中写入引导加载程序,再从 U 盘加载 boot 和根文件系统。启动完成后,系统将从 U 盘运行。
最简单的方法是将 BPI-M5/BPI-M2 Pro Linux 镜像写入 SD 卡或 eMMC 用于引导,同时将该镜像写入 U 盘,用于加载 boot 和根文件系统。
使用 SD 卡或 eMMC 启动 BPI-M5/BPI-M2 Pro,将 /boot/boot.ini 复制为 /boot/boot.ini.org,使引导加载程序无法在该介质加载 boot.ini,继而尝试从 U 盘启动分区加载。
重启系统,启动脚本和根文件系统将从 U 盘加载。
测试性能 可运行以下命令,通过 Pi Benchmarks 测试 U 盘性能:
sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash
SD 卡、eMMC 和 U 盘的测试结果如下:
类别 |
测试 |
SD 卡测试结果 |
eMMC 测试结果 |
U 盘测试结果 |
HDParm |
磁盘读取 |
67.91 MB/s |
156.64 MB/s |
253.40 MB/s |
HDParm |
缓存磁盘读取 |
57.39 MB/s |
126.53 MB/s |
253.52 MB/s |
DD |
磁盘写入 |
13.0 MB/s |
48.8 MB/s |
149 MB/s |
FIO |
4K 随机读取 |
2456 IOPS (9826 KB/s) |
9701 IOPS (38806 KB/s) |
5474 IOPS (21897 KB/s) |
FIO |
4K 随机写入 |
938 IOPS (3753 KB/s) |
12888 IOPS (51554 KB/s) |
6980 IOPS (27920 KB/s) |
IOZone |
4K 读取 |
10615 KB/s |
29568 KB/s |
23770 KB/s |
IOZone |
4K 写入 |
4276 KB/s |
33585 KB/s |
18598 KB/s |
IOZone |
4K 随机读取 |
8661 KB/s |
29637 KB/s |
19982 KB/s |
IOZone |
4K 随机写入 |
4795 KB/s |
38177 KB/s |
22134 KB/s |
得分:1300 |
得分:7811 |
得分:5879 |
Linux U-Boot 默认将启动徽标的帧缓冲区尺寸限制为 1080p60Hz(1920×1080),因此默认镜像不支持更大的分辨率;如有需要,可修改 U-Boot 源码以提供支持。
准备一个 24 位 BMP 文件,并将其命名为 boot-logo.bmp。
将 BMP 文件压缩为 boot-logo.bmp.gz。
$ gzip boot-logo.bmp
将目标文件复制到 Linux 镜像的 BPI-BOOT 分区。
$ cp boot-logo.bmp.gz /media/xxx/BPI-BOOT/
Android 引导加载程序默认将启动徽标帧缓冲区限制为 1080p60Hz(1920×1080);Android 内核 DTB 分区表默认将启动徽标分区大小限制为 16 MB。
准备一个 24 位 BMP 文件,并将其命名为 boot-logo.bmp。
将 BMP 文件压缩为 boot-logo.bmp.gz。
$ gzip boot-logo.bmp
解压该工具包。
$ unzip m5_android_bootlogo_tool.zip
$ cd m5_android_bootlogo_tool/
$ cp -a logo_img_files logo //logo_img_files is the origin bootlogo resource in android source and copy from <android-source-dir>/devices/amlogic/bananapi_m5/log_img_files
$ 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_X3.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
复制 boot-logo.bmp.gz:
$ cp boot-logo.bmp.gz logo/bootup.bmp
$ cp boot-logo.bmp.gz logo/bootup_X3.bmp
使用镜像打包工具创建目标 logo.img;m5_android_bootlogo_tool 的二进制文件和相关库复制自 <android-source-dir>/out/host/linux-x86。
$ ./logo_img_packer -r logo logo.img
使用 Fastboot 写入启动徽标
$ 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
可通过调试控制台消息的开头,确认引导加载程序是从 SD 卡还是 eMMC 加载的。
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
...
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 已写入 Android 镜像、eMMC 已写入 Linux 镜像、启动过程停在 BL2,以及 eMMC 为空。
eMMC 中已写入可启动的 Android 镜像
使用 USB Burning Tool:下载进度到 7%(格式化阶段) 时,拔下下载用的 USB 线缆。
使用 Android Fastboot 工具。操作前请确认 PC 上的 adb/fastboot 工具可以正常运行。
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_m5:/ # reboot fastboot
等待几秒钟,开发板将重启进入 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
使用 U-Boot 命令:连接调试串口线,并在上电时按 Esc 键进入 U-Boot 命令行。
bananapi_m5_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_m5_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 的引导加载程序部分。从 SD 卡启动 Linux 后,建议再使用 dd 命令格式化整个 eMMC。
最简单的方法是在上电前插入已写入 Linux 镜像的 SD 卡。Android 引导加载程序会检查 SD 卡 VFAT 分区中是否存在 boot.ini;若存在,便会从 SD 卡启动 Linux。启动后,可使用 dd 命令格式化整个 eMMC,再将 Linux 镜像写入 eMMC。
...
BPI: try boot from sdcard
reading boot.ini
5699 bytes read in 3 ms (1.8 MiB/s)
## Executing script at 01b00000
...
reading Image.gz
9143358 bytes read in 510 ms (17.1 MiB/s)
reading meson64_bananapi_m5.dtb
70850 bytes read in 8 ms (8.4 MiB/s)
reading uInitrd
11704481 bytes read in 655 ms (17 MiB/s)
reading overlays/i2c0.dtbo
223 bytes read in 6 ms (36.1 KiB/s)
reading overlays/spi0.dtbo
516 bytes read in 6 ms (84 KiB/s)
reading overlays/uart1.dtbo
225 bytes read in 5 ms (43.9 KiB/s)
eMMC 中已写入可启动的 Linux 镜像
使用 U-Boot 命令:连接调试串口线,并在上电时按 Esc 键进入 U-Boot 命令行。
bananapi_m5# mmc erase 0 1000
Linux U-Boot 同样会检查 SD 卡 VFAT 分区中是否存在 boot.ini;若存在,便会从 SD 卡启动 Linux。启动后,可使用 dd 命令格式化整个 eMMC,或直接将 Linux 镜像写入 eMMC。
极端情况下,引导加载程序或 U-Boot 已损坏:ROM 从 eMMC 加载后,启动过程停在 U-Boot 或 BL2。例如 DRAM 初始化失败时,eMMC 启动会停在 BL2。此时只能使用 USB Burning Tool 格式化 eMMC,或者完整写入 Android 镜像后,再尝试其他方法擦除 eMMC 或写入 Linux 镜像。
如果 eMMC 为空,ROM 会尝试直接从 SD 卡加载引导加载程序。
如果开发板之前写入过 Android,而现在要从装有 Linux 镜像的 SD 卡启动,则必须使用以下命令擦除整个 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
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 Wi-Fi/蓝牙
USB 类型:将 USB 无线网卡插入 USB Host 端口并重启系统。启动后,可在“设置”应用中启用或禁用 Wi-Fi 和蓝牙。
SDIO/UART 类型:将硬件模块正确连接到 40 Pin 排针,并 配置 Android DTB Overlay 以启用该模块。
| Android 不支持以太网和 Wi-Fi 同时连接。以太网优先级高于 Wi-Fi:以太网已连接时 Wi-Fi 无法连接网络;插入网线后,现有 Wi-Fi 连接也会断开。 |
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 Wi-Fi
Wi-Fi 模块驱动已预编译到发布镜像中。 USB 类型:将 USB 无线网卡插入 USB Host 端口,驱动会自动加载。
SDIO/UART 类型:
将硬件模块正确连接到 40 Pin 排针。
配置 DTB Overlay:
# Overlays to load
# Example combinations:
# spi0 i2c0 i2c1 uart0
# hktft32
# hktft35
setenv overlays "wifi_bt_rtl8822cs"
将 Wi-Fi 模块名添加到 /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 类型的 Realtek Linux 蓝牙驱动与固件。
对于 USB 类型,将 USB 蓝牙适配器插入 USB Host 端口,驱动会自动加载。
对于 UART 类型,在安装蓝牙驱动和固件前,按前述 Wi-Fi 配置设置 DTB Overlay。rtk-hciuart.service 启动时会加载 hci_uart 驱动。
Linux Wi-Fi STA 模式
以下是 Wi-Fi STA 模式的 Netplan 配置文件示例 01-wlan0-sta.yaml:
network:
version: 2
renderer: networkd
wifis:
wlan0:
dhcp4: true
access-points:
"bananapi":
password: "123456789"
Linux Wi-Fi AP 模式
正确安装并配置 Wi-Fi 适配器。
获取 Wi-Fi 适配器的频段、频率、信道、HT 能力、VHT 能力及其他属性:
$ iw list
使用 Netplan 和 NetworkManager 管理 Wi-Fi AP 模式。 安装 NetworkManager,因为只有 NetworkManager 渲染器支持 AP 模式。
$ sudo apt install network-manager
以下是 2.4 GHz Wi-Fi AP 模式的 Netplan 配置文件示例 01-wlan0-ap-2.4g.yaml:
network:
version: 2
renderer: NetworkManager
wifis:
wlan0:
dhcp4: no
access-points:
"bananapi":
mode: ap
band: 2.4GHz
channel: 6
auth:
key-management: psk
password: "123456789"
以下是 5 GHz Wi-Fi AP 模式的 Netplan 配置文件示例 01-wlan0-ap-5g.yaml:
network:
version: 2
renderer: NetworkManager
wifis:
wlan0:
dhcp4: no
access-points:
"bananapi":
mode: ap
band: 5GHz
channel: 36
auth:
key-management: psk
password: "123456789"
使用 Netplan 和 hostapd 管理 Wi-Fi AP 模式。
创建 Netplan 配置文件 01-wlan0-ap-hostapd.yaml:
network:
version: 2
renderer: networkd
ethernets:
wlan0:
dhcp4: no
addresses:
- 192.168.11.1/24
安装 hostapd
$ sudo apt install hostapd
创建 hostapd 配置文件 /etc/hostapd/hostapd.conf,例如:
interface=wlan0
ssid=bananapi
driver=nl80211
auth_algs=1
wpa=2
wpa_passphrase=123456789
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
#bridge=br0
beacon_int=500
#SSID not hidden
ignore_broadcast_ssid=0
hw_mode=a
channel=36
max_num_sta=8
### IEEE 802.11n
ieee80211n=1
#require_vht=0
ht_capab=[HT20][HT40+][SHORT-GI-20][SHORT-GI-40][SHORT-GI-80][DSSS_CCK-40]
### IEEE 802.11ac
ieee80211ac=1
#require_vht=0
#vht_capab=[MAX-MPDU-3895][SHORT-GI-80][SU-BEAMFORMEE]
#vht_oper_chwidth=1
#vht_oper_centr_freq_seg0_idx=42
### WMM
wmm_enabled=1
要支持 80 MHz 信道带宽,需要使用 rtw_vht_enable=2 选项加载驱动;也可以创建 /etc/modprobe.d/8822cs.conf,并写入以下内容:
options 88x2cs rtw_vht_enable=2
安装并配置 DHCP 服务器服务,以下以 isc-dhcp-server 为例:
$ sudo apt install isc-dhcp-server
在 /etc/default/isc-dhcp-server 中配置 DHCP 服务器接口:
# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
# Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACESv4="wlan0"
在 /etc/dhcp/dhcpd.conf 中配置 DHCP 子网和 DNS:
...
option domain-name "example.org";
option domain-name-servers 8.8.8.8, 114.114.114.114;
...
# No service will be given on this subnet, but declaring it helps the
# DHCP server to understand the network topology.
subnet 192.168.11.0 netmask 255.255.255.0 {
range dynamic-bootp 192.168.11.1 192.168.11.100;
option broadcast-address 192.168.11.255;
option routers 192.168.11.1;
}
启动服务
$ sudo hostapd /etc/hostapd/hostapd.conf -B
$ sudo systemctl restart isc-dhcp-server
配置路由。
sysctl net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -o eth0 -j MASQUERADE
Cloud-init 和 Snap 服务默认启用,可按需禁用或移除。
禁用或移除 cloud-init
$ sudo touch /etc/cloud/cloud-init.disabled
或
$ sudo apt purge cloud-init
禁用或移除 snap
$ sudo apt purge snapd
发布镜像中已包含 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。用户可使用“su -”切换为 root;如需使用 sudo,可按以下步骤安装。
$ su root
Password:(enter bananapi)
# apt-get update
# apt-get install sudo
# adduser pi sudo
然后请注销并重新登录。
在 Ubuntu 20.04 Server 上安装 Docker Engine。
设置软件仓库 更新 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
设置 stable 软件仓库:
$ 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
安装 Docker Engine
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
运行 hello-world 镜像,验证 Docker Engine 是否安装正确。
$ sudo docker run hello-world
也可以使用一条命令安装 Docker:
$ curl -sSL get.docker.com | sudo sh
其他 Linux 发行版请参阅 Docker Engine 安装文档。