在安卓之上运行原生的Xorg和Linux桌面有以下好处:
1. 比VNC:流畅。我的单核全志A10
1.0GHz的机器,基本上有我原来那个赛扬的老机器用Windows XP的流畅度了。
2.
比TF卡:方便。不用重启机器,按各种按钮,就能切换各种Linux桌面。
3.
比TF卡:方便。同上,玩完Linux,不用重启机器,就可以重新回到启动安卓。
4.
比TF卡:可以直接使用现成的驱动。
结语:在安卓上用framebuffer直接运行Xorg其实很简单,让xorg使用/dev/graphics/fb0并停掉安卓的服务就行了。由于驱动已经加载在内核中,设备本身的驱动不是问题。不过怎么使用驱动却是问题,比如触摸屏的使用,Xorg需要一个中间驱动层,tslib是单点触摸驱动、evdev多点触摸驱动,如果实在用不了,可以用触摸板的驱动代替,比如multitouch或mtrack。
详细过程及笔者所用的脚本和镜像,请参考我在ubuntu中文论坛的帖子:http://forum.ubuntu.org.cn/viewtopic.php?f=177&t=451917&sid=b6867f7f12fa4f29e7de2e208f017a47
有兴趣在安卓手机或平板上体验Linux桌面的,最简单的方法可以使用Linux Deploy软件。
2013-11-19 11:53
红米手机上使用Xorg :0 vt1
出错,无法打开virtual console 1
如果不加vt1,就是无法打开/dev/tty0,文件不存在。
Fatal server error:
(EE) xf86OpenConsole: Cannot open virtual console 1 (No such
file or directory)
(EE) xf86OpenConsole: Cannot open /dev/tty0 (No such file or
directory)
虚拟终端设备?
看来这个方法并不普遍啊。
2013-10-25 02:20
把安卓的驱动和内核提取出来,用到TF卡上启动,终于搞定触摸屏驱动了!
这样的话,从卡上启动的完整的Linux系统可以使用Android里面的所有驱动。
哎,无奈之举啊,触摸屏驱动不开源,网上找到的版本都不能用,所以只能把驱动模块直接拿来用了。
不过这种办法倒是可以解决所有的驱动问题,不管厂家是不是开源。
2013-10-24 14:42
直接在TF卡上运行的系统还是搞不定触摸驱动的问题。
gt82x.c里面的test_i2c_transfer那段由一个宏变量控制,注释掉那个宏就可以可以不编译这段。也就是不做i2c传输的测试,果然能在/dev/input/下创建一个event,但是会出错:
……
[ 59.840000] incomplete
xfer (0x20)
[ 59.890000] incomplete xfer (0x20)
[ 59.900000] Goodix-TS 2-005d: line:878,I2C
transfer error. Number:-70
i2c是一个啥子总线结构,看源码时说是要根据不同的平台进行修改。
不再搞代码编译,毕竟自己不是搞硬件驱动设计的。
2013-10-22 21:18
A10的这个编译的内核,触摸屏驱动模块反正就是一个检测没过,然后不干活了。又尝试找了其它平台的gt82x的驱动文件来折腾了一下,想加到A10的里面,不行,编译出错。
2013-10-22 15:25
dmesg可以看到错误,对应驱动里面的源码:
ret = goodix_i2c_test(client);
if(!ret){
pr_info("Warnning: I2C connection might be something
wrong!\n");
goto err_i2c_failed;
}
不知是什么错误。。。
2013-10-22 14:50
自己用github上ugers/linux-sunxi编译的内核和模块,其中的gt82x_ts就是我的触摸屏的驱动,这个驱动不知道怎么回事。没有被udev检测到,没有在/dev/input/下创建event。找了下,触摸设备在/sys/bus/i2c下面可以看到,2-005d目录就是,而在/sys/dev/char/里面没有这个设备,仅有的两个主编号为13的设备分别是电源、音量按键和鼠标。
这个驱动不行?
看到:
https://groups.google.com/forum/#!forum/zh-kernel
这是所有的input这个系统都不能生成event,但是我这个很扯淡的是鼠标键盘能生成event、但是G-sensor和触摸屏gt82x_ts不能生成event。
原因应该是在gt82_x这个驱动上?
2013-10-21 15:16
现在触摸屏用mtrack驱动,其实是拿touchscreen当touchpad用,并不是很舒服,也是当时自己开始不太想整mtrack或multitouch的原因之一。不过evdev用不了,也就只能当触摸板用用了。现在才注意到,evtest的结果里只有TRACKING_ID,
POSITION_X,
POSITION_Y和TOUCH_MSJOR四个量(前面都带ABS_MT),五个手指是支持的(TrackingID),但是只有这四个量的话,是不是功能不全呢?只是用来调试的么?
虚拟键盘:xvkbd鼠标一放上就打字。matchbox-keyboard有点小bug,最大化一个程序时,这个程序会成和它一样大小然后叠加到它上面。onboard更好看,没有这个bug,就是有点小,比xvkbd大点,但还是小。
2013-10-21 00:58
使用synergy,平板可以使用电脑的鼠标、触摸板和键盘。反过来用,平板的触摸屏可以用做电脑的无线鼠标,比android下的那些应用还好用。甚至还可以做为电脑的手写板,在gimp里面画图,哈哈,好玩,不过好像不怎么灵光。可能是因为只模拟了点击的事件,因为在平板上现在也还是只能点击不能选上然后拖动。这个可以通过在xorg.conf里面配置mtrack来实现。
原来一直用的那个屏幕键盘就是matchbox-keyboard,还以为是onboard呢。用着还可以,比xkvb那个小小的键盘可用性强点。
2013-10-20 18:00
终于搞定了触摸屏的问题。使用mtrack来驱动就好了。真是柳暗花明又一村啊,不能总是在一棵树上吊死!
原来一直卡在evdev上,因为它看起来最有希望:用evtest测试,内核的触摸事件报告完全正常,但用evdev作为Xorg的触摸屏输入驱动,Xorg的log文件显示没有任何问题,但是触摸就是没有任何反应(莫非要校准?10-evdev.conf里已经写上了。)。
剩下的事情就没那么重要了,一是搞定屏幕休眠,然后是电源电量,还有蓝牙的问题。
2013-10-20 11:14
之前试过安卓下的自动安装Linux的应用,但是体验很差,半天下不下来镜像文件,就没再用过。主要前几天玩的过程中看到Linux
Deploy为个应用支持安装Desktop的Linux,还能选择桌面环境是使用Xserver、VNC或是Framebuffer什么的。那么和我现在做的事就是一样样的,如果能更简单的做一件事,何乐而不为呢,所以现在就在尝试中。速度还可以。已经装完,但是选Framebuffer怎么光是黑了。。。没见界面啊。
2013-10-19 23:50
今天把之前的修理匠想法实现了一下:提取并替换安卓内核(安卓这个内核8.1M比Linux那个大了一倍),copy一份3.0.96+的版本然后更名为3.0.8,然后把module也替换为安卓的(只要安卓有的)。。。
结果是启动变慢,中间还以为没启动起来。本来我没有构建声音的模块,但启动后似乎有声音(LXDE面板上有音量插件了,没有测试),可见声卡驱动已经放在内核里了。意料之中,触摸屏还是用不了。
发现Linux东西的开发还用Linux下的工具靠谱,提取A10固件和相应的文件系统,内核什么的,请去这:
http://linux-sunxi.org/Boot_Android_from_SdCard
之前我的想法错了,原来不是全志固件的问题,安卓的boot分区就是那样的,先有段header然后是kernel接着是ramdisk。
总结一下就是:目前最好的情况是在安卓上chroot运行linaro的rootfs,这样触摸屏驱动肯定是好的,能用evtest测试,但是用evdev拿触摸屏作为输入设备却不可以。
2013-10-19 01:42
gt82到底是个什么玩意儿,为什么用的人这么少。哎,ft5x_ts多好,随便一加载驱动就能用了。
evdev可以用,但是为什么一到我这儿,这个gt82x的驱动就死活不能作为Xorg的输入呢?不能触摸,也不能当鼠标使,更别提多点触摸了。
想从安卓里面提取内核,全志的这个内核怎么都不对,无法挂载。记得上次用其它镜像从TF卡启动的时候似乎看到了uImage啊,现在怎么总是挂载不上了...
2013-10-18 19:54
搞定自己编译内核的流畅度问题!
发现自己原来在台式机上还存有config_3.0.36-t2这个配置文件,于是用它编译,中间出点小意外,最后避开了那个错误:
http://forum.ubuntu.org.cn/viewtopic.php?f=126&t=422855&p=3037428#p3037428
现在TF上运行自己编译的内核,和Linaro-armhf以及Android内核上运行的流畅度相当了,很好。
再用gparted来看nand闪存盘,果然是有问题,每个分区Gparted都独立标识出来了,而且是有错误的。真不知道Android是怎么启动起来的……
可以用gpart恢复数据,这个。。。分区表就没有对过,还是不整了。能用着就用着,不懂不瞎搞。
似乎这个驱动不行,没有把触摸屏驱动起来吧。
2013-10-18 15:44
fdisk太不靠谱了,分区表给恢复坏了。又得刷次安卓。。。
原来平板刷机的时候把/data分区调大到2G,但是那种调整方法似乎不太对,分区表可能出了点问题。android命令行下df看到/data分区只有1G,但是busybox
df -h看到是有2G,在android的设置--存储里面看到的也是2G。
所以分区表可能是有点问题的,从TF卡启动Linux,用fdisk
-l能看到nand各分区,大小确实是那么大,但是每个分区都提示invalid的分区表。于是用fdisk恢复,一进去就告诉我分区表有问题,于是就直接w写入新分区表。。。然后就坏了。
下次试试gparted,不行就直接用着。
现在知道用suxi的工具自己编译u-boot了,不过是使用现成的配置文件哦。。。嘻,用mk802ii的配置文件。硬件反正咱不懂。。。
似乎上次关机后没关好就拔了TF卡,上面有些错误所以启动不了卡让的Linux系统,但是重新写入u-boot就又可以启动了。
考虑直接使用安卓内核的话会怎么样呢?模块使用方式不太一样,那么把相应模块换一下呢?
(修理匠思想。。。功能替换)
2013-10-18 01:25
又回到自己编译的内核和linaro的rootfs的组合,从卡上启动。
A10采用u-boot,除了编译script.bin,还要生成u-boot启动的配置文件boot.scr.
自己编译的内核上运行确实各种不流畅啊。
哈,忘了在/etc/modules里面加驱动,直接modprobe 8192cu,可以用无线了;modprobe
gt82x,没有反应,udevd在运行着,但是没有在/dev/input/下建立eventx,cat
/proc/bus/input/devices也只看按键的id,触摸屏的驱动似乎还是没有带起来。。。
明天再试用linaro的内核编译参数吧。
从Linux内核启动进LXDE桌面太快了,上次说的有点保守,实际上3到5秒就能进桌面。
不明白,这个/dev/input/eventx是怎么建立的,我自己当然可以建一个,但是proc里都没有发现设备,是不是说我的编译的模块是失败的?
2013-10-17 17:xx
尝试不挂载/dev目录到chroot的系统中,这样,choot后/dev/input/下没有东西。把udevd打开,然后rmmod关掉内存中触摸屏驱动,再用insmod把驱动加载上,这时果然多了一个有了一个/dev/input/event2。不过这样加载的驱动也是一样的,evdev还是没有支持触摸屏。。。
哎,有单点的触摸就行嘛,用来模拟鼠标和敲字就完全行得通了,不然总是要连一套键鼠,不是很方便。
2013-10-17 10:53
昨晚睡觉前发现,只要触摸屏的校正参数不是“0 768 0 1024”就不会出现触发这个Bug。
但是改了其它校正参数,还是不能用触摸。也没法校正。
用evtest测试,内核报告触摸事件应该是正常的(10个参数),这说明android内核和触摸屏相应的驱动是匹配的。Xorg的日记文件显示没有错误了。但是不能触摸。。。
Linaro八月的rootfs镜像很有意思,有一个startlubuntu-nexus7,把LXDE改得稍微像平板。从ubuntu源里安装较新的gcc,4.7,编译的程序效率要比原来的高不少。
2013-10-17 00:35
用linaro比较新的rootfs:linaro-raring-alip-20130826-474.tar.gz。编译成功xf86-input-evdev。然后运行Xorg,仍然使用evdev驱动,不会崩溃了,不过那个bug的提示仍然在(evdev-ts是我对触摸屏起的名字):
(EE)
(EE) Backtrace:
(EE)
evdev-ts: Attempted to start touch without x/y (driver
bug)
(EE) BUG: triggered 'if (inSignalContext)'
(EE) BUG: ../../os/log.c:484 in LogVMessageVerb()
(EE) Warning: attempting to log data in a signal unsafe manner
while in signal context.
Please update to check inSignalContext and/or use
LogMessageVerbSigSafe() or ErrorFSigSafe().
The offending log format message is:
%s: Attempted to start touch without x/y (driver bug)
不错,有进展。是不是要提交一下这个bug呢?
2013-10-16 15:18
编译tslib时已经装了automake libtool。
编译xf86-input-xvdev,安装:xutils-dev
gettext pkg-config
./autogen.sh
……
checking for XORG... no
configure: error: Package requirements (xorg-server >= 1.10
xproto inputproto) were not met:
No package 'xorg-server' found
No package 'xproto' found
No package 'inputproto' found
Consider adjusting the PKG_CONFIG_PATH environment variable if
you
installed software in a non-standard prefix.
要编译整个Xorg?
不用,安装xserver-xorg-dev x11proto-core-dev
x11proto-input-dev。
当缺少某个包的时候,标准做法:apt-cache search,apt-get xxx-dev。
又提示缺少libudev,安装libudev-dev
接着提示libevdev,这个一搜,源里面没有。。。
看了下,似乎今年9月份才出来这个东西,这不关键问题,关键问题是编译它的过程中又出错了:
……
In file included from libevdev-uinput.c:36:0:
libevdev-int.h:96:30: error: 'ABS_MT_TOOL_Y' undeclared here
(not in a function)
libevdev-uinput.c: In function 'fetch_device_node':
libevdev-uinput.c:175:11: warning: ignoring return value of
'asprintf', declared with attribute warn_unused_result
[-Wunused-result]
make[3]: *** [libevdev-uinput.lo] Error 1
make[2]: *** [all] Error 2
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2
新东西,网上没有多少资料,暂时放弃。
突然想起可以直接用apt-get来自己编译包。我也不知道它得到的源码是不是最新的,那个bug是不是除掉了。反正不妨试试。
apt-get
build-dep xserver-xorg-input-evdev
apt-get source xserver-xorg-input-evdev
apt-get -b
source xserver-xorg-input-evdev
哈,生成的怎么有两个deb包,
xserver-xorg-input-evdev-dev_2.7.0-0ubuntu1.2_all.deb
xserver-xorg-input-evdev_2.7.0-0ubuntu1.2_armhf.deb
试了下,还真不是最新,这个bug还是没有修复。打补丁的事不会。还是先试试Ubuntu Touch吧。
刚好明天好像就要发布了。
2013-10-16 13:26
tslib果然是只支持单点的。
安卓内核里的驱动上报的事件里含有MT字样,就是MultiTouch的意思吧。
如果要继续用tslib这个单点触摸驱动,似乎既要改触摸驱动的源码,又要改tslib的驱动,最后得到的还是一个只支持单点的结果,只能模拟鼠标。
还是看evdev吧。
这个多点触摸比较炫哈:
2013-10-16 03:50
tslib编译了,它告诉我:
tslib: Selected device is not a touchscreen (must support
ABS_X and ABS_Y events)
用evtest看了下,触摸屏驱动返回的是
ABS_HAT0X
ABS_HAT1X
ABS_HAT2Y
ABS_HAT3X
ABS_DISTANCE
ABS_MT_TOUCH_MAJOR
ABS_MT_WIDTH_MAJOR
ABS_MT_POSITION_X
ABS_MT_POSITION_Y
ABS_MT_TRACKING_ID
咋回事?会不会是只支持单点?
怎么办?
不行只能再看evdev,它好像比tslib好一些,那个bug可能现在已经解决了。再试下multitouch吧。
又学了一招,cat
/dev/input/event*,触摸屏驱动好着的话,触摸它就会在shell里有显示。
哎,在这种时候,偏偏充电器坏掉,似乎没电,平板自己关了。睡觉。04:23