Linux移植随笔:又遇困难 | 迟思堂工作室
A-A+

Linux移植随笔:又遇困难

2014-08-30 15:40 嵌入式Linux 暂无评论 阅读 3,307 次

前段时间没有发表这方面的文章,是因为在搞qtopia-2.2.0,区分QT那几个版本花了一点时间,编译qtopia也花了一点时间。点滴之间,才发现时间悄然逝去。
上次u-boot移植时也遇到困难,这次移植Linux还是遇到困难。其实我这个人运气一直不好,认识我的人知道我是“报忧不报喜”的,因为这样,在许多人的印象里,我是一个忧郁的人。有一句话,是我的签名:一直在尝试,从未成功过。一直在失败,从未敢乐观。对于一个搞技术的人,最重要的一点就是要静心并坚持下去,万千不能骄傲自满。因此我常常用一些非积极的词语来激励自己,而不是那些类似“加油!~~~”、“我是最棒的!~~~”等等的话(或者在这些词语中添加N多诸如~~~~!!!!!^^^^^^^之类的东西)。
闲话休提。这次的问题主要集中在网络驱动和触摸屏驱动这两个。在搞文件系统(依旧是yaffs2,而不是当初的设想jffs2)时,曾经试过NFS挂载根文件系统,可惜失败了,在这里浪费了许多时间,后来才发觉是网络驱动有问题。第二个触摸屏,按照网上的资料,一切似乎很正常,可惜tslib测试就不成功,不能生成/etc/下的校准文件,而且由于不能使用NFS,每次都要用U盘复制到板子上。诸多麻烦,非亲身经历者不能体会也。{jcomments on}
我用的内核是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的一种特色,因为它与常见的操作系统有许多差异。如果肯下决定钻研一下基本用法及理论的东西,相信面对网上众多的操作方法时不会迷失方向,并从中找到一套适合自己的方法。很多人觉得嵌入式入门槛很高,其实,世上无难易之事,看做与不做而已。
牢骚发完,也该去解决这些问题了。
用写于几年前的话结束本文:
月映山岗,倍觉孤高,再攀险峰,与天比高。



如果本文对阁下有帮助,不妨赞助笔者以输出更多好文章,谢谢!
donate




给我留言