TX-2440A移植记录(1)

来源:互联网 发布:篮球分析软件 编辑:程序博客网 时间:2024/04/30 05:31

由于项目和毕设的需要,以前在mini2440所开发的QT界面都要移植到TX-2440A上。之前在移植mini2440的时候,遇到了很多的问题,虽然那时大多数都已经解决了,但是在这次的移植过程中也遇到了很多类似于以前的问题,无奈当时没有学会用文档来记录下整个移植过程遇到的问题以及解决的方法。为了以后便于学习和回顾,也顺便在博客中跟大家一起分享一下一些问题的解决方法,故有了这篇博客文章。估计以后我也会把我所做的工作和一些经验总结分享出来给大家。说了这么多,全都是“废话”,就当是前言吧。

如果你喜欢这篇文章,欢迎转载,但请注明来源,本文章出自:http://blog.csdn.net/ok_wolf/article/details/7339699

 

下面介绍一下移植的环境和情况:

虚拟机:红帽企业版5

QT版本:4.5.3

目标板:TX-2440A(天翔电子的2440板子)

移植说明:把一个QT应用程序移植到到TX-2440A中,能够实现系统开机自启动,并且能够与PC机正常进行串口通信。

 

一、移植过程的整体说明

       在这里,QT应用程序已经编译好了,至于QT程序如何编写以及QT开发环境的建立,在这里就不一一说明了,网络上有很多的资料可以参考,更何况每个人的情况都不一样,具体问题具体分析。单有QT应用程序还是不够的,还需要有引导程序,比如uboot,以及kernel和文件系统。在TX-2440A自带的板子中,uboot的已经烧写进Nor Flash中了,而且在板子自带的光盘中,也提供了已经根据目标板配置好的kernel文件,直接把这个文件下载到目标上就可以了,甚至最开始板子已经烧写好kernel文件了,所以,我们要做的事情就非常简单,就是处理根文件系统就可以了。

      根文件系统,需要两种,一种是yaffs2根文件系统,这是一种很常用的根文件系统,也是最终要使用的根文件系统,另外一种就是nfs文件系统,使用nfs文件系统,可以很方便的调节程序,也避免了因不断烧写芯片而缩短板子的使用寿命。

    在板子自带的光盘中,提供了可以用作QT应用程序的文件系统,在这个文件系统中,QT应用程序的运行环境已经建立好了。所以,只要对uboot的启动系统参数进行适当的修改,就可以让板子选择是启动nfs文件系统还是Nand Flash中的yaffs2文件系统。

    yaffs2文件系统的制作很简单,只要使用板子提供的mkyaff2image工具就可以了,当然这些工具在网络上也是很容易找得到的。运行命令:#mkyaffs2image rootfs rootfs.bin

就制作好了yaffs2文件系统的镜像文件,要注意的是,在TX-2440A中,这个镜像文件必须要有可执行权限,所以,执行命令:#chmod 777 rootfs.bin。

   nfs文件系统的制作几乎不需要改变什么,只要把uboot的系统系统的参数修改为从虚拟机启动系统即可,具体的命令可以上网查找。

  最后,说一下系统开机自动QT应用程序,其中的原理就涉及到linux系统启动后先后所执行的是哪些文件了。QT应用程序在执行之前,必须先建立好QT应用程序的运行环境。在rootfs(这里指的是文件系统)中/etc/init.d/rcS这文件中,加入一条命令,让它启动某一个可执行文件,而在这个可执行文件中,前面是关于设置QT应用程序的运行环境的相关命令,后面才是启动QT应用程序的命令。而这个可执行文件可以放入文件系统目录下的/bin目录中,也可以放在/usr/bin目录中,而QT应用程序可以放在任何地方,只要你在执行它时指定它所在的路径就可以了。具体如下:

在/etc/init.d/rcS中,加入启动某个可执行文件的语句,这里是:#qtconfig &

把qtconfig这个放入/usr/bin目录中,QT应用程序也放在这个目录中,在qtconfig文件中,前面是设置QT应用程序的运行环境,后面是:#QT -qws &

这样就能够实现开机自启动QT应用程序了。

 

二、移植过程中遇到的问题总结

1、关于/usr/lib/linstdc++.so.6:version “CXXABI_1.3.3”的问题

这个问题很经典,也很普遍。这类错误类似于:/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found。

再仔细一看,原来是libstdc++.so.6的链接文件出现了问题。

运行命令:#strings /TX-2440A/root_qtfs/usr/lib/libstdc++.so.6 | grep CXXABI

发现的确没有CXXABI_1.3.3。再运行:ls –l libstdc++.so.6的具体信息,发现libstdc++.so.6是链接到了libstdc++.so.6.0.8。运行上面的方法查看libstdc++.so.6.0.8发现也是没有CXXABI_1.3.3的。再看了一下原来mini2440的文件系统rootfs。发现libstdc++.so.6是链接到了libstdc++.so.6.0.13的。很明显了,libstdc++.so.6.0.13比libstdc++.so.6.0.8要高级点,所以就应该有CXXABI_1.3.3的,运行上面的方法,的确发现有这个的一个文件。

下面要做的就是更改libstdc++.so.6的链接文件。要删除libstdc++.so.6原来的链接文件,重新进行软链接(所谓软链接就是加上“-s”参数的ln命令)。

首先,把rootfs中的libstdc++.so.6.0.13拷贝过来。再执行以下操作:

(1).删除libstdc++.so.6,终端输入:rm -rf /urs/lib/libstdc++.so.6,回车执行

(2)..重做libstdc++.so.6软链接,终端输入:ln -s /urs/lib/libstdc++.so.6.0.13 /urs/lib/libstdc++.so.6,回车执行。

重新制作root_qtfs文件的镜像文件,下载运行,没有再提示出错。

 

2、在/dev目录下没有找到ttySAC0这个文件

我查看了rootfs的dev目录下,的确没有这个文件,我运行命令:#mknod ttySAC0 c 6 0,生成了ttySAC0文件,重新制作镜像文件之后,发现还是没能正常运行,并且在系统的dev目录下,也是没有发现这个文件。偶然发现原来,TX-2440A的串口0的设备文件是s3c2410_serial0这个文件,相应的,串口1的设备文件是s3c2410_serial1。在系统启动后,查看了dev目录下,果然有这两个文件。难怪我自己生成的ttySAC0在下载到板子上之后就没有了,原来,串口0对应的设备文件是s3c2410_serial0而不是ttySAC0。而在mini2440中,对应的是ttySAC0。

 

3、使用secure CRT总是不能从键盘输入命令

原来是设置的问题。应该把Flow Control中原先选中的RTS/CTS取消掉即可了。

 

4、如何让虚拟机、PC机、目标板三者ping通

这就要求三者在同一个网段内。虚拟机的IP地址设置就不说了,下面说说如何设置PC机、目标板的IP地址。

(1)设置目标板的IP地址

启动Nand Flash中的系统后,在串口终端,运行命令:#ifconfig eth0命令,查到TX-2440A的IP地址为192.168.1.10。因为原先虚拟机上的IP地址已经设置好了,为192.168.200.128,并且mini2440的IP地址已经设置为192.168.200.127,所以为了方便,把TX-2440A的IP地址设置为192.168.200.126。具体运行以下命令即可:

#ifconfig eth0 192.168.200.126

再运行#ifconfig eth0命令,结果如下:

[root@TX2440A /]# ifconfig eth0

eth0      Link encap:Ethernet  HWaddr 08:90:90:90:90:90 

          inet addr:192.168.200.126  Bcast:192.168.200.255  Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:1073 errors:0 dropped:0 overruns:0 frame:0

          TX packets:729 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:105846 (103.3 KiB)  TX bytes:33418 (32.6 KiB)

          Interrupt:62

这样就把开发板的IP地址设置好了。再与虚拟机进行测试,可以互相ping通。

(2)设置PC机IP地址

1、进入网络连接。找到本地连接选项。

2、右键选择属性点击进去,找到Internet 协议(TCP/IP)选项,双击进去设置。

3、在常规选项卡里面,输入指定的IP即可。这里输入的是:192.168.200.125.

这样就设置好了。要注意的是,要想让虚拟机、PC机、开发板三者互相ping通,必须把PC机与开发板用网线连接上,否则网卡是不工作的。

 

5、FATAL: kernel too old

原因:这是因为有些交叉编译器在制作时限制了使用的最低内核版本,不要比这个版本低就可以了。

比如配置glibc时使用–enable-kernel参数指定版本2.6.28,那么做出的文件系统一定不适合2.6.27或更低版本的。

如果想确认文件系统要求的最低内核,可以使用file命令查看libc-*.so文件,例如:

$ file libc-2.11.2.so

libc-2.11.2.so: ELF 32-bit LSB shared object, ARM, version 1, dynamically linked (uses shared libs), for GNU/Linux 2.6.28, stripped

上面的提示意味着使用这个库的文件系统只能供2.6.28和以上版本的内核使用。

解决方法就是降低交叉编译版本,或者提高内核版本。

 

6、route: SIOCADDRT: File exists

这个问题实际上对系统启动好像没有什么影响,上网查了一下,大概的原因是跟重复设置IP地址、网关的问题有关。因为在uboot的参数设置时我已经设置好了开发板的IP地址以及网关等等。而在文件系统目录中的/etc/init.d/rcS文件中的:

ifconfig lo 127.0.0.1

ifconfig eth0 192.168.200.126 netmask 255.255.255.0 up

route add default gw 192.168.200.2

所以,大概的意思是重复设置了。所以在这个文件中就没有必要再进行设置了。在我把这几条语句注视掉之后,果然上面的那个信息没有在出现了。

 

7、dm9000 dm9000.0: status check fail: 8

上网搜了一下,这个问题好像是特别与天翔的板子有关,这个问题最坏的情况就是板子的网卡坏了。这个目前还在测试当中,还没有找出原因和解决办法。

 

8、dm9000 dm9000.0: WARNING: no IRQ resource flags set

这个问题在网上也是有很多人遇到的。当然,这看起来好像是一个警告,看天翔论坛的帖子大概就是说dm9000.C的文件不对。以下是管理员的解释:

根据以上信息,你应该是没有按照手册上面所讲,替换掉DM9000.c文件,因为2.6.25.8自带的那个DM9000的驱动是不行的,你需要用2.6.24以下的内核里面的dm9000.c文件来替换。

当然,这个仅仅是警告,对程序的启动没有什么大的影响,所以可以忽略。

 

9、nfs: server 192.168.200.128 not responding, still trying

关于这个问题的说法,网上也有很多种看法,一般都是一下几个问题:

1、在程序启动之后,修改了板子的IP地址。修改板子的IP地址的代码一般在/etc/init.d/rcS这个文件中,查看了这个文件,里面确实是有相关的语句,不过被我注销掉了。

 17 #ifconfig lo 127.0.0.1

 18 #ifconfig eth0 192.168.1.10 netmask 255.255.255.0 up

 19 #route add default gw 192.168.1.1

以上这三条语句是设置开发板的IP地址的,这样在程序启动之后,就可以自动设置,不用自己来手动设置了。但在我们这里,我们在uboot中已经设置好了,而且用的又是nfs文件系统,所以就不需要了。即使不注释掉,也可以把它修改为我们自己需要设置的IP地址。

2、UDP协议的问题

这个问题可以参考一下:http://blog.csdn.net/l_yangliu/article/details/6925390

 

如果你喜欢这篇文章,欢迎转载,但请注明出处,本文出自:http://blog.csdn.net/ok_wolf/article/details/7339699