Brillo: brillo-m10-dev @ RPi 2B/ RPi 3B

费了些时间,Audio,Bluetooth,WiFi模块终于可以在RPi 3B上正常工作了。同时为了保证编译出来的image可以在RPi 2B上正常工作,也费了不少功夫。由于RPi 2B上没有Bluetooth与WiFi块,也就只能使Audio模块能够正常工作。

2016_04_09_410c_rpi3b

  •  目录结构及代码下载与编译

经过几天的努力,终让可以在不修改原有代码的情况下,编译出可以直接在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及运行

参考这篇文档:

Brillo: RPi 2B(树莓派)使其支持recovery模式

  • 同时兼容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模块

从这里我们可以看到:

Brillo: brillo-m10-dev @ RPi 3B – 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模式:

Brillo: brillo-m10-dev @ RPi 3B – WiFi模块

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无法更新(已经解决:->@<-

Brillo: cfg80211 regulatory domain & CRDA

3. 更新recovery模式

  • 相关的参考文档
  1. https://www.raspberrypi.org/documentation/configuration/config-txt.md

《Brillo: brillo-m10-dev @ RPi 2B/ RPi 3B》有4个想法

  1. 大神,能不能发一个详细的烧写brillo编译出来的文件如何烧写到TF卡,启动rpi3的文章?

    1. 请参考这篇文档:BRILLO: RPI 2B(树莓派)使其支持RECOVERY模式
      https://www.brobwind.com/archives/219
      预编译好的image可以从这里下载:
      https://github.com/brobwind/bin-brillo-m10-dev-rpi3b

    2. 还有这篇文档:BRILLO: 在RPI 2B/3B上通过FASTBOOT更新系统
      https://www.brobwind.com/archives/975

发表评论

电子邮件地址不会被公开。 必填项已用*标注