费了些时间,Audio,Bluetooth,WiFi模块终于可以在RPi 3B上正常工作了。同时为了保证编译出来的image可以在RPi 2B上正常工作,也费了不少功夫。由于RPi 2B上没有Bluetooth与WiFi块,也就只能使Audio模块能够正常工作。
- 目录结构及代码下载与编译
经过几天的努力,终让可以在不修改原有代码的情况下,编译出可以直接在RPi 2B/3B上运行的系统了:
/local/brillo-m10-dev-rpi3b +-- .repo | `-- manifest.xml +-- device | `-- hzak | `-- rpi3b | +-- bsp | | +-- audio | | +-- bluetooth | | +-- kernel-config | | `-- wifi | `-- manifest.xml `-- hardware `-- bsp `-- kernel `-- hzak `-- rpi-4.1.y @ 20fe468 `-- arch `-- arm `-- configs `-- bcm2709_defconfig
a. 从这里下载设备相关代码:2016_04_09_brillo-m10-dev-rpi3b-device-v1.tar.gz
$ mkdir -pv /local/brillo-m10-dev-rpi3b && cd /local/brillo-m10-dev-rpi3b $ curl https://www.brobwind.com/wp-content/uploads/2016/04/2016_04_09_brillo-m10-dev-rpi3b-device-v1.tar.gz | tar -zxvf -
b. 下载brillo-m10-dev分支的代码:
$ repo init -u https://android.googlesource.com/brillo/manifest -b brillo-m10-dev $ rm .repo/manifest.xml && cp device/hzak/rpi3b/manifest.xml .repo/ $ repo sync
NOTE: repo manifest文件使用的是device/hzak/rpi3b/manifest.xml,以避免由于dev分支代码更新出现其他问题。
c. 下载RPi 2B/3B kernel代码:
$ mkdir -pv hardware/bsp/kernel/hzak $ git clone https://github.com/raspberrypi/linux.git rpi-4.1.y $ cd rpi-4.1.y && git checkout 20fe468 $ cp ../../../../../device/hzak/rpi3b/bsp/kernel-config arch/arm/configs/
NOTE: RPi 2B/3B kernel配置文件使用的是device/hzak/rpi3b/bsp/kernel-config文件,Brillo系统需要相应的kernel支持。
d. 编译:
$ . build/envsetup.sh $ lunch rpi3b-eng $ make -j 4
- 下载image及运行
参考这篇文档:
- 同时兼容RPi2B与RPi 3B
为了能够让编译出来的系统可以同时在RPi 2B与RPi 3B上运行,我们需要在开机时start.elf程序能够加载不同的dtb文件,同时为了能够看到串口log, 我们还需要start.elf能够载入不同的命令行参数。为了达到这个目的,我们需要修改config.txt文件。还好有condition filters, 我们只需要加入如下代码:
[all] core_freq=250 cmdline=cmdline-rpi-3-b.txt device_tree=bcm2710-rpi-3-b.dtb initramfs ramdisk7.img [pi1] core_freq= cmdline= device_tree= [pi2] core_freq= cmdline=cmdline-rpi-2-b.txt device_tree=bcm2709-rpi-2-b.dtb initramfs ramdisk7.img
- 关于Bluetooth模块
从这里我们可以看到:
我们需要修改system/bt/osi/src/alarm.c代码,才能使得系统运行过程中bluetototbd服务能够正常运行,RPi 3B的Bluetoth模块正常工作。还好在system/bt/Android.mk有相关的宏定义,使行我们可以将这种改动放置到device/hzak/rpi3b/bsp/bluetooth/bdroid_buildcfg.h中:
#ifndef __BDROID_BUILDCFG_H__ #define __BDROID_BUILDCFG_H__ #define KERNEL_MISSING_CLOCK_BOOTTIME_ALARM TRUE #endif
- 关于WiFi模块
RPi 3B内置的WiFi模块BCM43438可以使WiFi工作在AP与STA模式:
WiFi工作在AP模式时,需要dnsmasq服务作为dhcp service提供客户端IP地址自动分配。Brillo提供的默认fs_config配置文件:device/generic/brillo/fs_config/android_filesystem_config.h
static const struct fs_path_config android_device_files[] = { { 00700, AID_SYSTEM, AID_SHELL, CAP_MASK_LONG(CAP_NET_BIND_SERVICE), "system/bin/dnsmasq" }, // ... };
文件中关于system/bin/dnsmasq文件配置使得它无法将UDP packet发送出去,需要使system/bin/dnsmasq文件具有
CAP_NET_ADMIN和CAP_NET_RAW capability:
static const struct fs_path_config android_device_files[] = {
{ 00755, AID_SYSTEM, AID_SHELL, CAP_MASK_LONG(CAP_NET_BIND_SERVICE) | CAP_MASK_LONG(CAP_NET_ADMIN) |
CAP_MASK_LONG(CAP_NET_RAW), "system/bin/dnsmasq" },
// ...
};
- 关于firewalld服务
同样地,由于system/bin/iptables与system/bin/ip6tables也没有CAP_NET_ADMIN与CAP_NET_RAW capability,使行firewalld服务无法通过iptables/ip6tables命令Punch TCP/UDP hole,需要在android_filesystem_config.h中添加如下代码:
static const struct fs_path_config android_device_files[] = {
// ...
{ 00755, AID_SYSTEM, AID_SHELL, CAP_MASK_LONG(CAP_NET_ADMIN) |
CAP_MASK_LONG(CAP_NET_RAW), "system/bin/iptables" },
{ 00755, AID_SYSTEM, AID_SHELL, CAP_MASK_LONG(CAP_NET_ADMIN) |
CAP_MASK_LONG(CAP_NET_RAW), "system/bin/ip6tables" },
};
- 目前存在的问题
1. 开机之后,有线网络(eth0)有时候不能自动获取IP地址
2. wireless regulatory domain无法更新(已经解决:->@<-)
3. 更新recovery模式
- 相关的参考文档
- https://www.raspberrypi.org/documentation/configuration/config-txt.md
太牛逼了,膜拜一下大神
大神,能不能发一个详细的烧写brillo编译出来的文件如何烧写到TF卡,启动rpi3的文章?
请参考这篇文档:BRILLO: RPI 2B(树莓派)使其支持RECOVERY模式
https://www.brobwind.com/archives/219
预编译好的image可以从这里下载:
https://github.com/brobwind/bin-brillo-m10-dev-rpi3b
还有这篇文档:BRILLO: 在RPI 2B/3B上通过FASTBOOT更新系统
https://www.brobwind.com/archives/975