移植UbuntuCore-16.04到R16

移植14.04版本在这里。由于14.04在bluez、dbus、systemd等工具的版本太老,很多需要手动编译,我决定移植下16.04(准确的说是16.04.1)版本。

1. 创建基础文件系统

首先,创建一个1GB,ext4的img文件,用于将来作为主系统:

dd if=/dev/zero of=ubuntu1604.img bs=1MB count=1024
mkfs.ext4 ubuntu1604.img
y
sudo mount ubuntu1604.img tmp/

然后,官网下载原始ubuntu-core最小系统,并完成系统挂载:

wget http://cdimage.ubuntu.com/ubuntu-base/releases/16.04/release/ubuntu-base-16.04.1-base-armhf.tar.gz
mkdir tmp/
cd tmp/
sudo tar xvf ../ubuntu-base-16.04.1-base-armhf.tar.gz 
cd ../
sudo cp /usr/bin/qemu-arm-static tmp/usr/bin/
sudo cp /etc/resolv.conf tmp/etc/resolv.conf
sudo mount chproc tmp/proc/ -t proc
sudo mount chsys tmp/sys/ -t sysfs
sudo mount -t devtmpfs chdev tmp/dev

sudo chroot tmp/

2. 虚拟化安装软件包

在qemu虚拟机环境中,安装所需要的package,效率比本地安装高。第一次安装的东西大约280MB,时间大约半小时,如下:

apt-get update
apt-get install build-essential bluez rfkill unzip wget vim wpasupplicant \
net-tools pkg-config libnl-3-dev libssl-dev iputils-ping dnsmasq-base \
libnl-genl-3-dev usbutils dosfstools libdbus-1-dev systemd curl
curl -sSL https://get.docker.com/ | sh
exit
sudo umount tmp/sys/
sudo umount tmp/proc/
sudo umount tmp/dev/
sudo umount tmp/

准备系统启动的配置文件s.sh,就先放在根目录下,以后要放到自启动脚本中(注意:1)sysrq是控制板子工作状态的,参考这里):

#!/bin/sh
source /etc/bash.bashrc
mount chproc /proc -t proc
mount chsys /sys -t sysfs
mkdir /dev/pts
mount devpts /dev/pts -t devpts

touch /lib/modules/3.4.39/modules.order
touch /lib/modules/3.4.39/modules.builtin
depmod

rm -rf /var/run/dbus/pid
modprobe bcmdhd
service dbus start
systemctl start bluetooth
echo 1 >/proc/sys/kernel/sysrq
dbus-daemon --system
wpa_supplicant -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf &
dhclient wlan0

保存后,要记得直接chmod +x s.sh,给执行权限。

针对16.04的selinux权限问题,参考这里,修改/etc/passwd,修改_apt UID(104->0):

_apt UID: _apt:x:0:65534::/nonexistent:/bin/false

准备初始wpa_supplicant.conf文件,如下:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
ssid="WiFi-A"
psk="12345678"
priority=5
}

network={
ssid="303"
psk="303303303303"
priority=4
}

准备wifi/蓝牙所需要的固件,从原生tina那边拷贝过来,主要是:

sudo mkdir tmp/lib/modules/
sudo cp TinaV2Rootfs/lib/modules/3.4.39/ tmp/lib/modules/ -r
sudo cp TinaV2Rootfs/lib/firmware/ tmp/lib/ -r
sudo cp TinaV2Rootfs/etc/firmware/ tmp/etc/ -rf
sudo mkdir tmp/etc/firmware/ap6212/
sudo cp tmp/etc/firmware/bcm43438a0.hcd tmp/etc/firmware/ap6212/4343A0.hcd

3. 制作完整镜像并烧录到板子

直接在TinaV2下面,用已经改好的环境,source、lunch、pack即可。打包完成后,用PhoenixSuit工具完成烧录。

在烧录之前,如果没有修改过kernel,最好按如下方式修改下:

cd TinaV2/lichee/linux-3.4/
vim .config
CONFIG_DEVTMPFS=y
CONFIG_USB_MASS_STORAGE=m

4. 测试各项功能

完成系统烧录后,就可以登录系统测试各项功能。由于刚才只是更新了最小系统需要的软件包,还需要根据功能增加一些,如下:

su root
apt-get update
mkdir m/

4.1 测试wifi连接热点

准备wifi连接的配置文件(目前是静态写死的,后面还是需要做scan之后动态获取的):

vi  etc/wpa_supplicant/wpa_supplicant.conf
---  SSID ---
--- PASSWORD ---

4.2 测试wifi ap功能

修改/etc/modules文件,加入如下行:

bcmdhd op_mode=2

编译安装hostapd,如下:

wget http://w1.fi/releases/hostapd-2.6.tar.gz
tar xvf hostapd-2.6.tar.gz
cd hostapd-2.6/hostapd/
cp defconfig .config
### uncomment CONFIG_LIBNL32=y 
make
make install
cd ../../

创建简单的hostapd-mini.config和复杂的hostapd-full.config脚本:

#change wlan0 to your wireless device  
interface=wlan0
driver=nl80211
ssid=test303
channel=1
interface=wlan0
driver=nl80211
ssid=test303
channel=1
wmm_enabled=0
wpa=1
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
auth_algs=1
macaddr_acl=0

然后,就可以测试下:

# hostapd hostapd-mini.config

此时在其他设备上(wifi的电脑、手机、平板等)应该就可以看到一个叫做test303的热点了。

4.3 测试蓝牙功能

# cd m/ 
# ./a.out -d --no2bytes --patchram /lib/firmware/ap6212/bcm43438A0.hcd /dev/ttyS1
su root
./s.sh

echo "0" > /sys/class/rfkill/rfkill0/state
echo "1" > /sys/class/rfkill/rfkill0/state
echo " " > /dev/ttyS1


hciattach /dev/ttyS1 bcm43xx 115200
systemctl start bluetooth
rfkill unblock all
hciconfig hci0 up
hciconfig -a
hcitool scan

在运行完hciattach之后应该有如下信息:

2685377237chatroom_1486471072235_38

在运行了hcitool scan之后应该能得到类似下面的反馈:

wx20170207-1552272x

rfcomm bind hci0 20:2D:07:AA:76:BF 1
rfcomm connect 20:2D:07:AA:76:BF 1

此时在手机端会弹出一个输入pin码的窗口,输入正确的pin码,就能完成手机与蓝牙设备的配对了。然后就可以开始文件传输、音频流传输、控制传输等操作了。

4.4 测试usb的mass storage设备功能

这项功能是为了,通过microUSB-USB线(大小口线)将板子和PC电脑连起来,从而可以通过pc直接拷贝文件/数据到板子。参考官方这里(注意kernel是要按照前面说的修改,并保证ko被拷贝到对应目录才行),先做一个20MB的小盘:

dd if=/dev/zero of=/mass_storage bs=1M seek=20 count=0
ls -l /mass_storage
## -rw-r--r-- 1 root root 1073741824 Feb 15 16:40 /mass_storage 
du -hs 
## /mass_storage
## 0       /mass_storage

创建单个分区

cat <

格式化,如下:

fdisk -lu /mass_storage 

## Disk /mass_storage: 1073 MB, 1073741824 bytes
## 139 heads, 8 sectors/track, 1885 cylinders, total 2097152 sectors
## Units = sectors of 1 * 512 = 512 bytes
## Sector size (logical/physical): 512 bytes / 512 bytes
## I/O size (minimum/optimal): 512 bytes / 512 bytes
## Disk identifier: 0x00000000
## Device Boot Start End Blocks Id System 
## /mass_storage1 1 2097151 1048575+ c W95 FAT32 (LBA)

设置loop设备,并格式为fat32格式(用于保证windows、linux、macos都能挂载):

losetup -o 512 /dev/loop0 /mass_storage
losetup -a
## /dev/loop0: [b302]:14867 (/mass_storage), offset 512
mkdosfs /dev/loop0

测试设备,如下:

mount -t vfat /dev/loop0 /mnt/
df -h /mnt
## Filesystem Size Used Avail Use% Mounted on /dev/loop0 1022M 4.0K 1022M 1% /mnt
mount | grep mnt 
## /dev/loop0 on /mnt type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=cp437,iocharset=ascii,shortname=mixed,errors=remount-ro)

释放设备,如下:

umount  /mnt/
losetup -d /dev/loop0 
losetup -a
du -sh /mass_storage
## 2.1M /mass_storage 
ls -lh /mass_storage 
## -rw-r--r-- 1 root root 1.0G Feb 15 16:54 /mass_storage

加载mass storage的驱动,如下:

modprobe g_mass_storage file=/mass_storage

最后,把microUSB-USB的大小口usb线插入板子和pc,应该就能在pc端看到一个可以读写的盘符了,就像插入了u盘一样。

留下评论