TinaV2到Ubuntu

近期R16调试过程

– 由R16-Tina在wifi ap/蓝牙多模式中出现的问题,发现基于Openwrt的Tina系统不完善,决定切换到ARM Ubuntu系统。但R16尚无Ubuntu的移植和适配,所以需要适配;

– 下载Ubuntu官方的Ubuntu Core 14.04/16.04包,解压缩放到Tina文件系统,发现无法运行其指令。分析是库(Tina用的是musl的简化库,Ubuntu用的GlibC的完整库)、编译器以及root目录的问题。改用将Ubuntu作为根文件系统启动。

文件系统制作记录:

wget http://cdimage.ubuntu.com/ubuntu-base/releases/14.04/release/ubuntu-base-14.04-core-armhf.tar.gz
mkdir ubuntuCore/
cd ubuntuCore/
tar xvf ../ubuntu-base-14.04-core-armhf.tar.gz
cd ../
mkdir tmp/
dd if=/dev/zero of=ubuntu.img bs=1M count=900
mkfs.ext4  -b 1K ubuntu.img        格式化镜像,格式化为ext4文件系统
sudo mount -t ext4 ubuntu.img tmp/
sudo cp ubuntuCore/* tmp/
sudo umount tmp/

完成后运行,可以看到(或者执行下pack命令)如下:

2c6a4f4f-af41-4553-9d15-90272902fdf6

– 发现无法启动Ubuntu根文件系统,分析是因为Tina采用的preinit-init方式与Ubuntu不同,因此决定采用Tina启动,再挂在Ubuntu的文件系统方式。

– 通过修改sys_partition.fex等文件,并将Ubuntu系统按照rootfs方式打包后,整体烧写到R16 Nand中,启动Tina后手动挂载Ubuntu文件系统,发现该文件系统是只读的。

– 发现只读的原因是打包Ubuntu时,是按照Tina的rootfs,采用了squashfs的文件系统格式,该格式是只读的。因此从新用mkfs.ext4构建Ubuntu的文件系统,只读问题解决。

– 启动Tina、切换到Ubuntu后,命令可以执行,发现缺少iwconfig等登陆wifi的应用(Ubuntu默认有线网卡方式登陆,因此没有直接提供无线配置工具),静态编译源码完成iwconfig等工具,发现工具无法正常使用。

– 分析原因是Ubuntu系统的目录中没有AP6212的固件,从Tina文件系统中拷贝到对应目录,此时iwconfig等工具可以正常使用,能扫描到热点。此时发现连接到热点失败。

– 分析失败原因,可能是全志系统配置无线网络与其他系统不同,Tina下面是通过全志的官方工具(有源码)配置上网的。因此考虑移植该工具到Ubuntu。

– 移植过程发现该工具(wifimanager)采用动态编译,依赖全志自己的基础库,移植失败。此时发现有cubieboard上运行Ubuntu 12.04的例子(cubieboard是全志A20+ap6212),其方法正在尝试。

我在这儿记录下如何从R16的Tina-V2更新到Ubuntu 14.04的过程。现在在Tina那边用:

./wifi_connect_ap_test SSID PASSWORD
chroot /mnt/UDISK
echo "91.189.88.150 ports.ubuntu.com" > /etc/hosts

这样可以连接实验室的wifi热点(也能正确连接到ubuntu的port站点,并完成apt-get update等操作),但由于其是动态编译的,所以需要在ubuntu那边动态编译。但动态编译就依赖一堆的库和arm本地编译工具,此时就需要apt-get install方式安装了。但会遇到一堆的错误,这些错误主要都来源于没有按照ubuntu正常启动流程执行init,如下:

20170131234358

在拷贝了Tina文件系统/lib/functions/下面的文件到ubuntu相应目录后,提示找不到libubox的东西,好吧。这下玩完了,因为libubox是openwrt专属的网络相关专属库。因此,一直tina V2的全志官方wifi连接工具这条路走不通了。

——————— 思考下 ————————————

想到能否直接正常启动ubuntu呢,不再先启动tina再chroot方式切换到ubuntu。这条路此前我走过,也没有走通,当时的问题还是集中在ubuntu的init没有适配R16的系统。因为我们用的是ubuntu core,只有文件系统,没有对底层的适配。现在想到的是:cubieboard这个系列也是A10/A20这类的全志SoC,他们已经有ubuntu core的适配,能否把启动部分脚本扒拉出来呢?

这里下载cubietruck(A20主控)的ubuntu-desktop镜像文件(500+MB),然后解压看看。解压后发现还是img格式,不是文件系统本身。

– 重新制作镜像,注意要手工修改下lichee/.config,把CONFIG_DEVTMPFS打开(udev会用到),然后chroot到/mnt/UDISK/,然后:

sudo rm -rf /var/lib/apt/lists/*
修改下hosts文件(因为tina那边没有dns)

2685377237@chatroom_1486128717371_52.png

update完成后,我首先安装udev,如下:

qq%e6%88%aa%e5%9b%be20170204211834

就直接:apt-get install bluez wget build-essential unzip了。

20170203213558

看起来就是系统没有挂载需要的/dev/等目录,我来试试挂载下:

exit     #回到tina下面
mount /dev /mnt/UDISK/dev/
mount /proc /mnt/UDISK/proc/
mount /sys /mnt/UDISK/sys
chroot /mnt/UDISK

然后还需要把Tina那边已经集成的固件拷贝到Ubuntu的相同路径下,这样kernel在加载某些ko时才能顺利找到所需要的固件,如下:

exit  #回到tina下面
cp /lib/modules/ /mnt/UDISK/lib/ -rf
cp /lib/firmware/ /mnt/UDISK/lib/ -rf
cp /lib/firmware/ /mnt/UDISK/etc/ -rf
chroot /mnt/UDISK touch /lib/modules/3.4.39/modules.order touch /lib/modules/3.4.39/modules.builtin depmod modprobe bcmdhd

然后再来apt-get install bluez,此时发现bluez服务貌似成功启动了,如下:

qq%e6%88%aa%e5%9b%be20170203214317

重启板子后,需要先把Tina那边的蓝牙给断开,方法是:/etc/bluetooth/btenable.sh off。然后切到ubuntu这边,就可以通过/etc/init.d/bluetooth start,重新启动蓝牙服务,如下:

qq%e6%88%aa%e5%9b%be20170203215000

此时还仅仅是bluez可以用,事实上还需要底层的固件的支持,如下:

sudo apt-get install rfkill
rfkill list # 看看有没有所需要的节点
cp /lib/firmware/ /etc/ -rf
wget https://launchpad.net/ubuntu/+archive/primary/+files/brcm-patchram-plus_0.1.1.tar.gz
tar xvf brcm-patchram-plus_0.1.1.tar.gz
cd bcm-patchram-plus/
gcc brcm_patchram_plus.c
# 得到的a.out
echo 0 > /sys/class/rfkill/rfkill0/state
sleep 1
echo 1 > /sys/class/rfkill/rfkill0/state
sleep 1
./a.out --patchram /etc/firmware/bcm43438a0.hcd --baudrate 115200 --enable_hci --no2bytes /dev/ttyS1 &

完美,手机蓝牙能看到bt-test-allwinnertech的蓝牙音源,此时就可以在手机端播放音乐,并在板子上就收并播放出来了,如下:

qq%e6%88%aa%e5%9b%be201702032157247136623772338953

下一步测试下蓝牙的文件传输。参考这里,此时需要在板子上运行obexpushd,但貌似我们的ubuntu 14.04的sourcelist没有这个,所以只能找找手动安装的方案了,如下:

1)安装下obexpushd的2个依赖库:

sudo apt-get install libopenobex1 libbluetooth3

2)然后下载并手动安装这个工具:

wget http://launchpadlibrarian.net/86294689/obexpushd_0.11.2-1_armhf.deb
adb push obexpushd_0.11.2-1_armhf.deb /mnt/UDISK
dpkg -i obexpushd_0.11.2-1_armhf.deb

由于armhf的ubuntu 14.04没有hostapd(在这儿可以下载到),只能手动安装了,其依赖关系不少,需要解决下:

sudo apt-get install libc6-dev libnl-3-dev libnl-genl-3-dev libnl-route-3-dev libssl-dev lsb-base
dpkg -i hostapd_2.4-0ubuntu3_armhf.deb

然后就能顺利安装好hostapd了,如下:

%e5%be%ae%e4%bf%a1%e6%88%aa%e5%9b%be_20170203231801

然后用一个简单的hostapd.config测试了下,没有成功,还是报此前的错误,所以看来还是得安装下network-manager了,如下:

sudo apt-get install network-manager

然后,按照这里这里的说法,做下处理:

sudo nmcli nm wifi off

安装这个nm非常吃力了,因为需要X系统的支持,甚至需要gnome的图形化界面。安装之后还有一堆的错误:

%e5%be%ae%e4%bf%a1%e6%88%aa%e5%9b%be_20170204000827

但是nmcli这个命令行工具还是可以用的,但运行还是出问题,貌似是dbus的问题,如下:

%e5%be%ae%e4%bf%a1%e6%88%aa%e5%9b%be_20170204001353

尝试sudo apt-get install systemd

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s