Linux移植随笔:又遇困难

前段时间没有发表这方面的文章,是因为在搞qtopia-2.2.0,区分QT那几个版本花了一点时间,编译qtopia也花了一点时间。点滴之间,才发现时间悄然逝去。

上次u-boot移植时也遇到困难,这次移植Linux还是遇到困难。其实我这个人运气一直不好,认识我的人知道我是“报忧不报喜”的,因为这样,在许多人的印象里,我是一个忧郁的人。有一句话,是我的签名:一直在尝试,从未成功过。一直在失败,从未敢乐观。对于一个搞技术的人,最重要的一点就是要静心并坚持下去,万千不能骄傲自满。因此我常常用一些非积极的词语来激励自己,而不是那些类似“加油!~~~”、“我是最棒的!~~~”等等的话(或者在这些词语中添加N多诸如~~~~!!!!!之类的东西)。

 

闲话休提。这次的问题主要集中在网络驱动和触摸屏驱动这两个。在搞文件系统(依旧是yaffs2,而不是当初的设想jffs2)时,曾经试过NFS挂载根文件系统,可惜失败了,在这里浪费了许多时间,后来才发觉是网络驱动有问题。第二个触摸屏,按照网上的资料,一切似乎很正常,可惜tslib测试就不成功,不能生成/etc/下的校准文件,而且由于不能使用NFS,每次都要用U盘复制到板子上。诸多麻烦,非亲身经历者不能体会也。

我用的内核是2.6.37.3,网络芯片是dm9000,这个版本的内核相对于以前的版本,改动了很多。这些由于版本更改而造成的差别,着实让人摸不着头脑,其实可以静心看看人家的changelog和mailinglist,里面基本上都有说明的,不过,很多人不愿意,只想着去搜索,看看别人怎么做,——当然,也包括我。

最开始以前搞定了,因为启动时显示信息中已经有了自定义的MAC地址了:

dm9000 Ethernet Driver, V1.31
eth0: dm9000e at c486a300,c486e304 IRQ 51 MAC: 6c:61:74:65:6c:65 (chip)

(MAC地址6个字符为“latele”,由u-boot传递到内核)

后来按照网上的资料修改dm9000.c,也如愿出现提示信息:

dm9000 Ethernet Driver, V1.31
Now using the default MAC address: 6c:61:74:65:6c:65
eth0: dm9000e at c486e300,c4872304 IRQ 51 MAC: 6c:61:74:65:6c:65 (FightNow2440)

 

文件系统启动后,在终端上也能看到eth0启动的信息:

Try to bring eth0 interface up(in net-config)...
ifconfig eth0 hw ether 6c:61:74:65:6c:65
eth0: link down
ifconfig eth0 192.168.5.178 netmask 255.255.255.0 up
add default gw 192.168.5.1
Done
eth0: link up, 100Mbps, full-duplex, lpa 0x45E1

 

用ifconfig命令也能看到IP地址和MAC地址:

# ifconfig
eth0      Link encap:Ethernet  HWaddr 6C:61:74:65:6C:65 
          inet addr:192.168.5.178  Bcast:192.168.5.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:51 Base address:0xe300

 

看似一切正常,但是却ping不通服务器:

# ping -c 3 192.168.5.29
PING 192.168.5.29 (192.168.5.29): 56 data bytes
------------[ cut here ]------------
WARNING: at net/sched/sch_generic.c:258 dev_watchdog+0x14c/0x240()
NETDEV WATCHDOG: eth0 (dm9000): transmit queue 0 timed out
Modules linked in:
[<c003ad3c>] (unwind_backtrace+0x0/0xec) from [<c00498d0>] (warn_slowpath_common+0x48/0x60)
[<c00498d0>] (warn_slowpath_common+0x48/0x60) from [<c0049968>] (warn_slowpath_fmt+0x2c/0x3c)
[<c0049968>] (warn_slowpath_fmt+0x2c/0x3c) from [<c026d60c>] (dev_watchdog+0x14c/0x240)
[<c026d60c>] (dev_watchdog+0x14c/0x240) from [<c0053860>] (run_timer_softirq+0x158/0x208)
[<c0053860>] (run_timer_softirq+0x158/0x208) from [<c004e72c>] (__do_softirq+0x7c/0x10c)
[<c004e72c>] (__do_softirq+0x7c/0x10c) from [<c002a074>] (asm_do_IRQ+0x74/0x94)
[<c002a074>] (asm_do_IRQ+0x74/0x94) from [<c00352e4>] (__irq_svc+0x24/0xa0)
Exception stack(0xc03fdf80 to 0xc03fdfc8)
df80: c0403bf0 00000032 f6100000 60000013 c03fc000 c041ebe0 c0023944 c03ffbd8
dfa0: 3002210c 41129200 300220a4 00000000 00000000 c03fdfc8 c00367b4 c00367c0
dfc0: 60000013 ffffffff
[<c00352e4>] (__irq_svc+0x24/0xa0) from [<c00367c0>] (default_idle+0x48/0x50)
[<c00367c0>] (default_idle+0x48/0x50) from [<c0036d8c>] (cpu_idle+0x58/0x98)
[<c0036d8c>] (cpu_idle+0x58/0x98) from [<c0008a5c>] (start_kernel+0x254/0x2a8)
[<c0008a5c>] (start_kernel+0x254/0x2a8) from [<30008034>] (0x30008034)
---[ end trace 48dd374e5577b566 ]---

--- 192.168.5.29 ping statistics ---
3 packets transmitted, 0 packets received, 100% packet loss

按这个提示信息查了一下,由于功力不深,没什么发现。

网络驱动搞不定,暂且按下。接着就搞触摸屏了。

触摸屏驱动看似也没什么问题:

# echo 8 > /proc/sys/kernel/printk
# cat /dev/input/event0
X: 332, Y: 365
xLxmxxX: 331, Y: 364
xKxlxX: 332, Y: 365
xJLxKmxKX: 331, Y: 367

能打印坐标。

测试Tslib时却失败了:

# ./ts_calibrate
No raw modules loaded.
ts_config: Success

 

在ts.conf中使用module_raw h3600,提示如下:

# ./ts_calibrate
xres = 240, yres = 320
ts_read: Invalid argument

网上说要注释h3600,使用:
module_raw input
不过却出现:

# ./ts_calibrate
xres = 240, yres = 320
selected device is not a touchscreen I understand

 

运行qpe时:

# ./qpe -qws
Mouse type Tslib:/dev/input/event0 unsupported
Warning: Need to run firstuse
Warning: language message - en_US
Warning: and its not null
Warning: loading /opt/qtopia/i18n/en_US/qt.qm
Warning: loading /opt/qtopia/i18n/en_US/qpe.qm
Warning: loading /opt/qtopia/i18n/en_US/libqpe.qm
Warning: loading /opt/qtopia/i18n/en_US/libqtopia.qm
Warning: loading /opt/qtopia/i18n/en_US/language.qm
Warning: loading /opt/qtopia/i18n/en_US/timezone.qm
Warning: loading /opt/qtopia/i18n/en_US/systemtime.qm
X: 478, Y: 326
X: 479, Y: 329
X: 479, Y: 327
X: 479, Y: 323

 

后面几行的坐标是点击触摸屏后出现的。这也说明了触摸屏还算正常。

附上tslib的环境变量配置:

# Late Lee 2011-03-31 for touchscreen test
export TSLIB_ROOT=/home/latelee/tslib
export TSLIB_TSEVENTTYPE=H3600
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export QWS_MOUSE_PROTO=Tslib:/dev/input/event0
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib

 以及qtopia的环境变量:

#!/bin/sh

export QTDIR=/opt/qtopia
export QPEDIR=/opt/qtopia
export PATH=$QPEDIR/bin:$PATH
export QWS_DISPLAY="LinuxFb:mmWidth240:mmHeight320:0"
export QWS_SIZE=240x320
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$QTDIR/lib:$QPEDIR/lib
export QWS_MOUSE_PROTO="Tslib:/dev/input/event0"
export TSLIB_CALIBFILE=/etc/pointercal

 

上面种种迹象表明,触摸屏应该是正常的,可能是由于某些配置出现了问题。因为网上资料实在太多了,让人摸不着头脑。如果对Linux不太熟悉的话,就会发现里面出现太多的配置、路径,编译时configure要写很多配置,在运行qtopia和tslib时要配置环境变量。这个算是Linux的一种特色,因为它与常见的操作系统有许多差异。如果肯下决定钻研一下基本用法及理论的东西,相信面对网上众多的操作方法时不会迷失方向,并从中找到一套适合自己的方法。很多人觉得嵌入式入门槛很高,其实,世上无难易之事,看做与不做而已。

牢骚发完,也该去解决这些问题了。

用写于几年前的话结束本文:

月映山岗,倍觉孤高,再攀险峰,与天比高。

你可能感兴趣的:(Linux移植随笔:又遇困难)