Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1394523
  • 博文数量: 343
  • 博客积分: 13098
  • 博客等级: 上将
  • 技术积分: 2862
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-06 00:35
文章存档

2012年(131)

2011年(31)

2010年(53)

2009年(23)

2008年(62)

2007年(2)

2006年(36)

2005年(5)

分类: LINUX

2007-09-02 22:23:54

很久没有来更新我的博客了,近日上来看看,发现很久以前闲来无聊做的QTE在E2上的移植居然很受关注。百度了一把“E2 QTE”,发现在iphone.com.cn上有朋友将patch都贴出来了。关于键盘的问题,iphone上的朋友比我研究的更为深入 - 直接去看EzX Linux Kernel的源代码。
 
由于键盘设备只能有一个进程使用,我能够想到的办法是做一个j2me的小daemon,监听所有的key message,并将其映射到一个local socket。然后我们hack版本的qte的键盘设备就可以通过这个local socket来获取键盘事件了。
 
iphone.com.cn上有关E2 QTE的内容引用如下,如果还有朋友对这方面的技术有兴趣,欢迎来讨论讨论。我的QQ是14281258。
 

 

命运这次来当个小记者

 

话说springrain大侠真N~才一个星期的功夫而已就这进展了……

 

一、如何移植qt-2.3.10E2

 

在网上看到,有人把qt-2.3.10移植到了E2上面,近来没事,验证一下是否可行。经过四个工作日的不懈努力,小有成果。

发现网上的资料真是太少,为了给后人打个基础,下面说一下,移植的过程,最后有实例的图片。

0)准备工作

0.1 Linux的机器

0.2 Windows的机器(Linux下不能telnet,到少我不少)+E2+telnetsamba

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 compiledepths是说用24位深,但其实 E218位深,为了方便,决定在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)测试

通过sambaqtlib目录,copysd卡上,(比较大,fonts目录可以只保留fontdirunifont_160_50.qpflibqte.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)时间为什么不对?我们是+8O

7)再次感谢第一阵营(上次打错了,变陈营了)提供的 49P

8)有什么问题,可以和我联系,QQ 643246

 

 

还有不少的问题,关键还是keyboard的输入,没有ezsdk,估计很难。

下一步,想看看mplayer或是ffmpege2上可行不。

 

 

刚刚又改了一下:

src/kernel/qgfxlinuxfb_qws.cpp

QLinuxFbScreen::connect

d=vinfo.bits_per_pixel;

应该改成

d=24;

这样,qt lib就完全没有问题了。

paintButton也工作正常了。

 

 

 

如何移植qt-2.3.10E2之二--关于键盘响应

 

几天前写了《 如何移植qt-2.3.10E2,反应比较热烈。

但是其中,也有人怀疑,键盘搞不定。

本着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_DEBUGdefine的。

赶紧 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,现在我把Samsungkbddriver改成了E2

export QWS_MOUSE_PROTO="None"

export LD_LIBRARY_PATH=$QTDIR/lib

./dclock -qws

 

我承认,方法比较丑陋,但是挺有效的。但怎么与原来的ezx融为一体,我没有什么好的方法。我想是不是可以做一个空白的j2me程序,放在QT程序的前面,从而屏蔽掉按钮。

 

昨天,有很多本论坛的网友加我为好友,我没法从QQ号到论坛用户做一一对应,对他们对我的帮助表示感谢。同时,昨天由于在写程序,QQDown了几次,对其中有些问题没有及时回答,表示歉意。

 

有什么问题可以联系我,QQ 643246(可能隐身中)。


阅读(2917) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

oncefly2009-06-15 18:22:06

moto的响应速度慢,不如直接将ezx全部移除,都用QT吧。