2014年5月22日星期四

Native Linux for TMall MagicBox

一开始对这个问题有兴趣,是想看看能不能通过原生linux解决魔盒伪1080输出的问题。毕竟国内厂商靠不住这件事人尽皆知,而且新版魔盒都已经出来了,阿里肯定是指望不上的。

经过这段时间里无穷无尽的折腾,成果固然是有一些,不过要说解决问题的话,还差得有些远。从这次的经历也可以看得出来,不管是拿来玩还是拿来用的硬件,充分的技术支持和成规模的社区都是很重要的。

单纯就视频播放而言,可能回头去找个1186的机器会更好。如果有更高的要求,x86是个更好的选择。arm嘛,嗯。

uboot

因为我希望保留nand上的安卓系统,所以linux就只能安装到tf卡里,这需要对uboot环境变量进行一定的修改。虽然这件事安卓系统里也能做,但是没有uart就看不到输出,折腾起来很不方便,所以就目前来说拆机焊线还是有必要的。

为了两个系统里都用得上,我把一张16G的tf卡分了两个区,第一个4G的fat32,剩下的则格式化为ext3。

想要启动时加载fat32分区上的uImage内核文件,需要在uboot中进行如下操作:

mmcinfo
fatload mmc 0 ${loadaddr} uImage
bootm

如果希望启动时默认加载tf卡上的linux内核,则可以这样做:

setenv bootlnx 'mmcinfo; fatload mmc 0 ${loadaddr} uImage; bootm; '
setenv bootcmd 'run bootlnx'
saveenv

另外还有个法子,可以在上电时通过狂按遥控上的菜单键加载tf卡上的系统:

setenv bootlnx 'mmcinfo; fatload mmc 0 ${loadaddr} uImage; bootm; '
setenv irremote_update 'if irkey 0x1f2d12e 500000 ;then run bootlnx; fi'
saveenv

uboot还支持脚本文件,如将以下内容以auto_script文件名保存:

mmcinfo
fatload mmc 0 0x82000000 uImage
bootm 0x82000000

使用u-boot-tools软件包中的mkImage生成aml_autoscript:

mkimage -A ARM -O linux -T script -C none -a 0 -e 0 -n “auto_script” -d auto_script aml_autoscript

将aml_autoscript放入fat32分区,uboot中run update即可执行该脚本。

内核

amlogic官方放出的代码这里有:http://openlinux.amlogic.com:8000/download/ARM/

不过直接用这里的代码虽然能够成功编译,但实际用起来问题非常多。wjb@github修改整理的版本相对比较靠谱一点,目前的版本是3.0.96+。

编译过程大概是这样:

sudo apt-get install gcc-arm-linux-gnueabihf

git clone https://github.com/wjb/mx-common.git
cd mx-common

export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm
make mrproper
make meson6_g18_mx2_defconfig
make menuconfig
make uImage -j4
make modules -j4

sudo cp arch/arm/boot/uImage /media/BOOT
sudo make INSTALL_MOD_PATH=/media/AMLinux modules_install

一个linux跑不跑得起来,一大半都在内核上,可m6内核离完善真心差很远。

一开始我使用的是gcc 4.8,且打上了如下补丁:

diff --git a/drivers/amlogic/gpio/am_gpio.c b/drivers/amlogic/gpio/am_gpio.c
index c4ab581..771b529 100755
--- a/drivers/amlogic/gpio/am_gpio.c
+++ b/drivers/amlogic/gpio/am_gpio.c
@@ -196,7 +196,7 @@ static ssize_t am_gpio_write(struct file *file, const char __user *buf,

    if(buf == NULL || op == NULL)
        return -1;
-   val = copy_from_user(tmp, buf, size);
+   val = copy_from_user(tmp, buf, bytes);
    if (0 > val) {
        printk("am_gpio_write: Some bytes could not be copied: %d\n", val);
        return -EFAULT;
diff --git a/drivers/amlogic/hdmi/hdmi_tx/hdmi_tx_edid.c b/drivers/amlogic/hdmi/hdmi_tx/hdmi_tx_edid.c
index 80391ed..5020450 100755
--- a/drivers/amlogic/hdmi/hdmi_tx/hdmi_tx_edid.c
+++ b/drivers/amlogic/hdmi/hdmi_tx/hdmi_tx_edid.c
@@ -233,7 +233,7 @@ static unsigned char Edid_TimingDescriptors[204]=    //12x17
 //-----------------------------------------------------------
 void Edid_CompareTimingDescriptors(HDMI_TX_INFO_t * info, unsigned char *Data)
 {
-   int index1,index2;
+   volatile int index1,index2;

  for(index1=0;index1<17;index1++)
     {

其中第二处修改,如果不加上volatile,index1会出现远大于17的情况,这显然是gcc的bug。

这样编译出来的内核可以启动,但是usb不能用音频也存在问题。尝试换用gcc 4.7,结果问题更严重了,三次上电只能成功启动一次,而且失败时没有任何错误信息,就是直接挂在那里不动。

wjb@github提供的mx2ref内核可以直接拿来用,版本号是3.0.50。这个内核问题略少,但也就是略少而已。

debian

ubuntu和debian都提供了arm支持,下面的方法两个发行版都适用。不过只用命令行的话,ubuntu远不如debian,再加上stable的debian软件包都太老,所以这里装的是sid的debian。

sudo apt-get install qemu-arm-static debootstrap
mkdir debian-armhf-sid
sudo debootstrap --foreign --arch armhf sid debian-armhf-sid http://ftp.tw.debian.org/debian/
sudo cp /usr/bin/qemu-arm-static debian-armhf-sid/usr/bin/
sudo chroot debian-armhf-sid /debootstrap/debootstrap --second-stage
sudo chroot debian-armhf-sid

qemu-arm-static在ubuntu 14.04中包含在qemu-user-static中,这东西很好用,可以直接在pc里chroot进arm系统。这样很多操作就可以在pc上完成,再慢也比在目标机器上弄要快。

然后就是一些基本设置:

passwd
echo AMLinux > /etc/hostname
echo deb http://ftp.tw.debian.org/debian sid main contrib non-free >> /etc/apt/sources.list
apt-get update
apt-get install locales
dpkg-reconfigure locales
apt-get install wireless-tools wpasupplicant
mknod -m 660 /dev/ttyS0 c 4 64

编辑/etc/inittab,将ttyS0所在行改为:

T0:2345:respawn:/sbin/agetty -L ttyS0 115200 vt100

其他设置去看debian文档吧,很详细。弄完cp -a将debian-armhf-sid复制到tf卡的ext3分区,到这里该tf卡就可以在魔盒中成功启动了。

现有问题

音频

gcc 4.8编译的内核,aplay只能播放特定格式的wav,mpg123无法成功播放mp3,xbmc只能放得出爆音。wjb预编译的内核,xbmc中可以成功播放音频视频文件,但声音听起来有点怪,有点像跑调了。

视频

wjb预编译内核跑xbmc,加载libamplayer,可以全速播放avc1/ac3(瞬时码率最高约30Mbps)。因为usb不能用,samba也遇到点小问题所以更多的没有测试。

效果方面,第一印象很一般,感觉颜色有些暗淡。

usb

无论哪个内核,不管是启动前还是启动后插入的设备均不能用。

eth0的mac地址问题

在启动linux时,log里有一句未配置mac地址,使用随机地址的信息。进入linux后重启进入android,系统会自动运行一个叫MiptAutoTestForAli-10030的程序。虽然看起来很吓人,但其实只要在这个程序中选择写入随机mac地址再退出,就可以正常使用android系统了。

这个问题应该可以通过修改驱动解决,不过我暂时没去管。

遥控器不能用

遥控使用的是BK2433,没找到驱动。不过问题不大,xbmc可以用android或ios设备当遥控。

1 条评论 :

匿名 说...

我之前在Github上面看到的是那个030812的,编译出来内核放在U盘fat分区,然后U盘的ext放了一个buildroot的根就行了。主要参考的是http://hansen0730.github.io/2013/11/%E5%A4%A9%E7%8C%AB%E9%AD%94%E7%9B%92_%E7%A0%B4%E8%A7%A3.html

只不过需要在启动的时候用UART,
Hit Enter key to stop autoboot:
截断加载内核的步骤,这样可以手动敲usb相关命令了。
不知道在uboot当中敲usb start是否影响检测USB的结果
但是这样做出来的连HDMI的输出都没有,只能通过TTL