当前位置: 首页 > 嵌入式Linux > 正文

Linux移植随笔:又遇困难

前段时间没有发表这方面的文章,是因为在搞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=240×320

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的一种特色,因为它与常见的操作系统有许多差异。如果肯下决定钻研一下基本用法及理论的东西,相信面对网上众多的操作方法时不会迷失方向,并从中找到一套适合自己的方法。很多人觉得嵌入式入门槛很高,其实,世上无难易之事,看做与不做而已。

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

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

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

本文固定链接: http://www.latelee.org/embedded-linux/porting-linux-the-case.html

如无特别说明,迟思堂工作室文章均为原创,转载请注明: Linux移植随笔:又遇困难 | 迟思堂工作室

目前暂无评论

发表评论

*

快捷键:Ctrl+Enter