在XOLO X900上实现Ubuntu for Android

本文同步自(最佳显示效果请点击):https://zohead.com/archives/ubuntu-for-xolo-x900/

由于 Lava XOLO X900 使用的 Intel Atom Z2460 这一 x86 的 CPU,我们就可以做一些改动,让其实现初步的 Ubuntu for Android 效果,而且运行的是 x86 版本的 Ubuntu,相对于 ARM 版本(不能运行私有软件,没有源代码的话啥都干不了)来说实用性要好很多的。

先看看实际的效果图:

Ubuntu for Android on XOLO X900

现在我在这个 Android 手机里的 Ubuntu 上已经开始正常运行 Skype、Ubuntu One、sopcast 等应用,而且 Ubuntu 和 Android 系统是共存同时运行的,Ubuntu 是运行在外部屏幕上的,对 Android 完全没有影响,不需要 VNC 登录之类的。

Canonical 公司提出的 Ubuntu for Android 请参考这里:

http://www.ubuntu.com/devices/android

这里提到的 Canonical 的 Ubuntu for Android 的要求有:

  • 双核手机,内存最少 512MB;
  • 支持 secondary frame buffer;
  • 支持 USB OTG

对于 XOLO X900 来说,第二点要求 secondary frame buffer 暂时无法满足,因为官方的 kernel 只注册了 /dev/graphics/fb0 一个 frame buffer 设备。但由于支持 USB OTG,我们这里暂时用支持 Linux frame buffer 的外置 USB 显卡来实现。

需要的设备及配件:

  • Motorola LapDock 100(做显示器及键盘鼠标输入,同时接 USB 外置显卡,你完全可以用自己的显示器)
  • DisplayLink USB 显卡
  • USB OTG 线
  • HDMI 线

1、准备 x86 Ubuntu 环境:

由于 XOLO X900 只有 16GB 的 ROM 空间,为了速度和扩展考虑,最好可以将 Ubuntu 安装在隐藏未启用的 microSD 插槽上,最好使用 Class 10 的 microSD,这样不会对 Ubuntu 的性能造成影响。

你可以参考这个视频(只有 Youtube 哈)查看如果启用隐藏的 microSD 插槽:

http://www.youtube.com/watch?v=6-FkK7Htohs

下面是找一个合适的 Ubuntu 系统,如果你有时间的话,完全可以用 VMware 安装一个虚拟机到 SD 卡上。如果你像我一样不想浪费时间安装,可以到网上下载现成的 VMware vmdk 映像并直接拷贝到 SD 卡上。

我选择的是下面这个 Lubuntu 12.04 系统,因为使用 LXDE 桌面,速度比较快,这个网站也有完整的 Unity 桌面环境的 Ubuntu 12.04 系统哦:

http://www.trendsigma.net/vmware/lubuntu1204.html

你可能需要另一个 Linux 虚拟机来将 Lubuntu 映像里的所有文件拷贝到 SD 卡里(最好能对 SD 卡进行分区,我是建立了一个 ext4 的分区)。

2、准备需要的 DisplayLink USB 显卡驱动:

由于 XOLO X900 官方 kernel 对 frame buffer 支持并不完整(缺少 defio 等支持),官方 3.0.8 kernel 源代码里的 DisplayLink USB 显卡驱动 udlfb 无法正常编译。

我基于下面的 udlfb 项目的 0.4 版本修改了一个新的可直接用于 XOLO X900 官方 kernel 的 udlfb 驱动(默认代码加载之后无法正常显示图像):

http://git.plugable.com/gitphp/index.php?p=udlfb

我修改过的 udlfb 0.4 驱动的下载地址:

http://miseal.googlecode.com/files/udlfb-v0.4.tar.bz2

相对默认 0.4 版本的主要改进为:

  • 解决在 Linux 3.0.8 中无法正常编译的问题;
  • 解决 kzalloc 分配内存失败的问题,以 vmalloc 替代;
  • 增加卸载驱动时的释放内存处理;
  • 自动根据 EDID 判断显示器分辨率,默认使用 EDID 得到的分辨率;
  • 如果 EDID 无法得到合适的分辨率,使用默认 1280x1024 分辨率;
  • 增加模块参数,加载模块时可以指定初始分辨率

编译方法请参考之前写的编译 XOLO X900 自定义 kernel 的文章:

https://zohead.com/archives/xolo-x900-kernel/

如果你想直接用我编译好的,请访问此链接下载:

http://miseal.googlecode.com/files/x900-kernel-config-modules.7z

编译好的 udlfb.ko 在解压缩出来的 modules 目录中,建议将 modules 目录拷贝到 /system/lib 目录中。

3、测试 udlfb 驱动是否可用:

通过外置带电源的 USB HUB 接上 DisplayLink USB 显卡(Motorola Lapdock 就是一个带电源的 USB HUB 哈),并将显卡接到外置显示器上,root 过之后,在 shell 中运行 su 然后运行:

insmod /system/lib/modules/udlfb.ko

如果一切正常的话,驱动将自动判断你的显示器分辨率,并在显示器中显示绿屏。

然后运行下面的命令检查 frame buffer 设备是否正常,一般应有正常的设备节点信息输出:

ls -l /dev/graphics/fb1

如果你的显示器不支持 EDID 或者默认的 1280x1024 分辨率不支持,也可以加载驱动时手工指定分辨率,例如:

insmod /system/lib/modules/udlfb.ko init_xres=1024 init_yres=768

上面的命令即将初始分辨率设置为 1024x768。

4、屏蔽 Android 本身对 USB 键盘鼠标的支持:

由于 XOLO X900 默认支持 USB OTG,通过 OTG 接上 USB 键盘鼠标之后,可以直接对 Android 进行操作,而且任何对键盘和鼠标的操作都会解锁手机,这对于我们运行 Ubuntu for Android 是毫无益处的,而且会导致重复的 input event 发到 Android 界面上。因此我们需要屏蔽 Android 本身对 USB 输入设备的支持。

首先接上 USB 键盘和鼠标(通过 USB HUB),并确定是哪个 input 设备,同样在 root 中 su 运行:

ls /dev/input/event*

你会看到很多个 event 设备,一一用下面的命令(把 X 换为具体的设备名)确定到底哪个是你所插上的 USB 键盘和鼠标,cat 之后在键盘上敲键或者移动鼠标,正确的设备将会有输出:

cat /dev/input/eventX

假设确定好鼠标和键盘分别为:/dev/input/event10/dev/input/event11

然后运行 dmesg 确定 USB 键盘和鼠标的设备名,你可以看到类似这样的输出:

usb 1-1: new high speed USB device number 2 using penwell_otg
hub 1-1:1.0: USB hub found
hub 1-1:1.0: 7 ports detected
usb 1-1.1: new full speed USB device number 3 using penwell_otg
input: Motorola Mobility Motorola HD Dock as /devices/pci0000:00/0000:00:02.3/usb1/1-1/1-1.1/1-1.1:1.0/input/input11
generic-usb 0003:22B8:0938.0003: input,hidraw0: USB HID v1.01 Keyboard [Motorola Mobility Motorola HD Dock] on usb-0000:00:02.3-1.1/input0
usb 1-1.3: new low speed USB device number 4 using penwell_otg
input: BTC USB Cordless Mouse as /devices/pci0000:00/0000:00:02.3/usb1/1-1/1-1.3/1-1.3:1.0/input/input12
generic-usb 0003:1241:0003.0004: input,hidraw1: USB HID v1.10 Keyboard [BTC USB Cordless Mouse] on usb-0000:00:02.3-1.3/input0
input: BTC USB Cordless Mouse as /devices/pci0000:00/0000:00:02.3/usb1/1-1/1-1.3/1-1.3:1.1/input/input13
generic-usb 0003:1241:0003.0005: input,hidraw2: USB HID v1.10 Mouse [BTC USB Cordless Mouse] on usb-0000:00:02.3-1.3/input1
usb 1-1.6: new high speed USB device number 5 using penwell_otg

上面的 Motorola Mobility Motorola HD DockBTC USB Cordless Mouse 即为 USB 键盘和鼠标设备的设备名,记下这些。

编译 /system/etc/excluded-input-devices.xml 配置文件,将上面的 USB 键盘和鼠标设备名加入进来,然后重启手机,在 USB 输入设备上的操作就不会影响 Android 系统。

例如我的配置文件内容如下:

<?xml version="1.0" encoding="utf-8"?>
<devices>
<device name="Unipoint HID"/>
<device name="RMI4 Unipoint"/>
<device name="Motorola Mobility Motorola HD Dock"/>
<device name="BTC USB Cordless Mouse"/>
</devices>

5、在 Android 中切换到 Ubuntu 环境:

首先 su 运行 shell 创建一个目录作为 Ubuntu 分区的挂载点(这里假设为 /system/sd):

mount -o remount,rw /dev/block/mmcblk0p2 /system
busybox mkdir -m 777 /system/sd
mount -o remount,ro /dev/block/mmcblk0p2 /system

你可以使用我写好的这个切换到 Ubuntu 的脚本 startubuntu(我这里是挂载了 SD 卡第一个 ext4 分区,请根据需要自行修改):

http://pastebin.com/raw.php?i=9r21dR7L

我在脚本中将 Android 中的 /mnt/sdcard 目录挂载到了 Ubuntu 里的 /sdcard 目录,Android 系统的 /system 目录挂载到了 /android/system 目录,这样可以很方便的在 Ubuntu 中访问 Android 系统中的数据。

6、准备运行 X 的环境:

假设你已经切换到 Ubuntu,首先安装 DisplayLink 的 X 驱动:

apt-get install xserver-xorg-video-displaylink

然后安装输入模块:

apt-get install xserver-xorg-input-evdev

安装成功之后,修改 /etc/X11/xorg.conf X11 配置文件(Ubuntu 12.04 中没有这个配置文件,需要在 /usr/share/X11/xorg.conf.d 目录中自己增加新的配置文件,我的为:52-displaylink.conf),内容为下面的链接:

http://pastebin.com/raw.php?i=WjcfFWc2

注意请将其中的 input 设备和分辨率改为自己需要的。

7、运行 X - 最终的 Ubuntu for Android:

产生 X 的初始配置文件 /root/.xinitrc

#!/bin/sh
xrandr -o 0
startlubuntu

第二行的 xrandr 命令是专门为 DisplayLink udlfb 驱动修改的,没有这个的话可能会导致 X 环境中的菜单项不能正确显示。第三行的 startlubuntu 你可以替换成你需要的 X 命令(例如:xinit lxsession)。

然后运行 startx 就可以启动 X 桌面环境了。

某些情况下如果这样运行 startx 还是有问题,可以在 startx 时增加参数:

startx -- :0 vt1

如果这样可以的话表示 X 使用的 VT 不正确,这时你可能需要将 /etc/X11/xinit/xserverrc 改为下面这样以强制指定 X 使用的 VT:

#!/bin/sh
exec /usr/bin/X -nolisten tcp vt1 "$@"

8、总结:

这样实现的 Ubuntu for Android 实际还是有一些不足的:

  • 必须要有外置的 USB 显卡太不方便,而且热插拔 USB 显卡会导致 X server 直接挂掉,最好的解决方案是启用 HDMI frame buffer;
  • 暂时没有声音输出,可能可以用 USB 声卡,或者将声音输出至手机(能想象的到的丑陋);
  • 不支持通过 USB HUB 进行充电,应该是要修改 kernel 才能支持

本文的内容均为我根据实际使用所写,没有考虑到通用的情况,其中有任何问题欢迎提出指正哦 ^_^

在XOLO X900上实现Ubuntu for Android》上的评论

  1. Thanks, Zhiming Unzipped Lbuntu1204 contains: Lbuntu-s001.vmdk…to..Lbuntu-s021.vmdk (21 files), Lbuntu.vmdk, Lbuntu.vmsd, Lbuntu.vmx, nvram and readme.txt (one file each) Previously I confused that it was just required to put above 25 files on ubuntu partition.

    1. Hi:

      If you run a full desktop Linux system in XOLO X900 like android x86 device,
      desktop Linux runs in chroot environment (in android x86 kernel), it’s able to run PC applications

      Please refer to my post about running Ubuntu for Android on XOLO X900:
      http://zohead.com/archives/ubuntu-for-xolo-x900/?lang=en

      I’ve managed to run desktop programs like: Ubuntu One, Skype, Sopcat, LibreOffice …
      And also it’s able to run some Windows program with Wine emulator in desktop Linux

  2. Thank you very much for quick reply. I’ll post it on modaco tomorrow (with a link to these comments; please let me know if you have any objections).

    And just out of curiosity possibly there were some programs which didn’t work? (I mean not games, but think games statistic will be interesting for others as well)

    1. It’s OK you post these on MoDaCo, i’ve post a topic about running Ubuntu for Android on XOLO X900 in MoDaco before.

      The problem is I’m using a DisplayLink USB display adapter (with powered USB hub, very ugly) for X11 desktop Linux display,
      if you want to avoid use USB display adapter, you may need to use tightvncserver to run X11 server,
      and run VNC viewer in Android to connect to desktop Linux (you can use HDMI output to larger screen for XOLO X900),
      VNC performance is quite poor, you can’t do something like gaming, video playback may also quite slow

      And if you are running chroot Ubuntu, Upstart may not work well, there is a solution in my blog
      Also some hardware or driver related program can’t run in chroot Linux

    1. 你用的x900?视频就是讲怎么把tf卡放到隐藏插槽里,默认系统不能直接用,需要root之后装软件(国外论坛里有)使用。
      我这个ubuntu方法就是直接用tf卡设备,tf卡在安卓系统里默认未启用的

      1. 原来视频只是讲了一下插槽位置啊,汗!我去找找看需要安装什么。我现在已经用chroot的方法运行debian了,搞点开发真的很方便,X86就是好啊!另外,非常感谢你的回复!

发表评论

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

*