移植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=nl80211ssid=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之后应该有如下信息:
在运行了hcitool scan之后应该能得到类似下面的反馈:
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盘一样。