全部博文(343)
分类: LINUX
2007-09-02 22:23:54
命运这次来当个小记者
话说springrain大侠真N~才一个星期的功夫而已就这进展了……
一、如何移植qt-2.3.10到E2
在网上看到,有人把qt-2.3.10移植到了E2上面,近来没事,验证一下是否可行。经过四个工作日的不懈努力,小有成果。
发现网上的资料真是太少,为了给后人打个基础,下面说一下,移植的过程,最后有实例的图片。
0)准备工作
0.1 Linux的机器
0.2 Windows的机器(Linux下不能telnet,到少我不少)+E2+可telnet,samba
0.3下载 qt-2.3.10,可以从的ftp站下载:ftp://ftp.trolltech.com/qt/snapshots/
0.4下载ARM CROSS-COMPILE工具,推荐http://lsb.blogdns.net/ezx-crosstool
1)安装ARM CROSS-COMPILE
此处略过,看一下CROSS-COMPILE的安装说明,最后,最好把安装CROSS-COMPILE目录下的bin目录加到PATH中。
2)编译qt lib
2.1 解压 qt-2.3.10.tar.gz 到 qt-2.3.10。
2.2 设置QTDIR环境变量。
2.3 Configure QT,使用
./configure -xplatform linux-arm-g++ depths 24
-xplatform是说要cross compile,depths是说用24位深,但其实 E2是18位深,为了方便,决定在24位的基础上做修改。
选择 everything, qvfb 无所谓。
2.4 修改qt的文件
src/kernel/qgfxraster_qws.cpp,把其中,查找 == 24 或是 ==24的地方,加上一个条件 == 18,如 if(d == 24)改成 if(d == 24 || d == 18)。把三个函数改成
//Change 24 to 18 bits
inline void gfxSetRgb24( unsigned char *d, unsigned int p )
{
/*
*d = p & 0x0000ff;
*(d+1) = (p & 0x00ff00 ) >> 8;
*(d+2) = (p & 0xff0000 ) >> 16;
*/
*d = (p & 0x0000fc) >> 2 | (p & 0x000c00) >> 4;
*(d+1) = (p & 0x00f000 ) >> 12 | (p & 0x3c0000) >> 6;
*(d+2) = (p & 0xc00000 ) >> 22;
}
inline void gfxSetRgb24( unsigned char *d, int r, int g, int b )
{
/*
*d = b;
*(d+1) = g;
*(d+2) = r;
*/
*d = (b >> 2) | ((g & 0x0C) << 4);;
*(d+1) = (g & 0xF0) >> 4 | ((r & 0x3C) << 2);
*(d+2) = (r & 0xC0) >> 6;
}
inline unsigned int gfxGetRgb24( unsigned char *d )
{
// return *d | (*(d+1)<<8) | (*(d+2)<<16);
return (*d & 0x3F) << 2 | ( (*d & 0x30) >> 4 | (*(d+1) & 0x0F) << 4) << 8 | ( (*(d +1) & 0xF0) >> 2 | (*(d+2) & 0x03 ) << 6) << 16;
}
之后,就可以make了。
3)编译 examples
如果exmapes没有编译,可以选择一个来编译,就选dclock啦,到examples/dclock目录,make就可以了,如果link不通过,请把Makefile 中的SYSCONF_LINK改成arm-linux-g++
4)测试
通过samba把qt的lib目录,copy到sd卡上,(比较大,fonts目录可以只保留fontdir和unifont_160_50.qpf,libqte.so.2.3.10可以用arm-linux-strip strip一下)
把dclock放在和lib目录同级。
写个测试脚本:
export QTDIR=/mmc/mmca1/software #这是lib目录所在的目录
export QWS_SIZE=240x160 #qt的大小,最大为240x320
export QWS_KEYBOARD=None #没有keyboard
export QWS_MOUSE_PROTO="None" #没有Mouse
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH: $QTDIR/lib #可以加载的lib库的path
./dclock -qws
看到东西了,但是不是segmentation fault了呢。
qDebug了很长时间,发现是在qwsmanager_qws.cpp中的void QWSManager::paintEvent(QPaintEvent *)
把
// dec.paintButton(&painter, managed, QWSDecoration::Menu, menuBtn->state());
// dec.paintButton(&painter, managed, QWSDecoration::Close, closeBtn->state());
// dec.paintButton(&painter, managed, QWSDecoration::Minimize, minimizeBtn->state());
// dec.paintButton(&painter, managed, QWSDecoration::Maximize, maximizeBtn->state());
注释掉,重新编译lib库,就OK啦,不过这样窗口上的一些按钮就没有了。
5)载屏(见图一)
6)时间为什么不对?我们是+8区O。
7)再次感谢第一阵营(上次打错了,变陈营了)提供的 49P。
8)有什么问题,可以和我联系,QQ 643246
还有不少的问题,关键还是keyboard的输入,没有ezsdk,估计很难。
下一步,想看看mplayer或是ffmpeg在e2上可行不。
刚刚又改了一下:
src/kernel/qgfxlinuxfb_qws.cpp 中
QLinuxFbScreen::connect
d=vinfo.bits_per_pixel;
应该改成
d=24;
这样,qt lib就完全没有问题了。
paintButton也工作正常了。
如何移植qt-2.3.10到E2之二--关于键盘响应
几天前写了《 如何移植qt-2.3.10到E2》,反应比较热烈。
但是其中,也有人怀疑,键盘搞不定。
本着DIY的精神,本人对E2研究了两天,发现最起码在我的49P上,是可以得到键盘响应的,下面详细说说。
本来,我是想写一个驱动,从底层去得到的。但是看了一下下的内核源代码,心中凉了一半,key是从arm的寄存器中得到的,里面一有值就会引发4号中断,在ezx_keypad.c中
static void kp_interrupt(int irq, void *ptr, struct pt_regs *regs)处理。
在keypad_open中,又限制了只能有一个进程打开
spin_lock(&p->keypad_lock);
if (p->reading_opens > 0) {
spin_unlock(&p->keypad_lock);
return -EBUSY;
}
p->reading_opens++;
spin_unlock(&p->keypad_lock);
真的没有办法了吗?
突然看到
#ifdef KEYPAD_DEBUG
printk(KERN_INFO "add keypad event = 0x%04x\n", event);
#endif
而KEYPAD_DEBUG是define的。
赶紧 cat /proc/kmsg,按一下键,哈哈,有东西:
<6>T[3389178]add keypad event = 0x001e
...
<6>T[3389203]add keypad event = 0x801e
激动,后面不就是key的值嘛。
修改了一下src/kernel/qkeyboad_qws.cpp,把QWSSamsungKeypadHandler拿来给E2用。
E2的键码,释放时+0x8000
12 0C 13
1C 0E 10 0F 1E
2D 0D 18
01 02 03
04 05 06
07 08 09
0B 00 0A
左侧 25 26 2A 2C 2B 右侧 20 2E
修改了dclock example,和启动脚本
export QTDIR=/mmc/mmca1/software
#export QWS_SIZE=240x160
export QWS_KEYBOARD="E2" #原来是None,现在我把Samsung的kbddriver改成了E2
export QWS_MOUSE_PROTO="None"
export LD_LIBRARY_PATH=$QTDIR/lib
./dclock -qws
我承认,方法比较丑陋,但是挺有效的。但怎么与原来的ezx融为一体,我没有什么好的方法。我想是不是可以做一个空白的j2me程序,放在QT程序的前面,从而屏蔽掉按钮。
昨天,有很多本论坛的网友加我为好友,我没法从QQ号到论坛用户做一一对应,对他们对我的帮助表示感谢。同时,昨天由于在写程序,QQ也Down了几次,对其中有些问题没有及时回答,表示歉意。
有什么问题可以联系我,QQ 643246(可能隐身中)。