tq2440怎么移植qt应用程序

tq2440怎么移植qt应用程序,第1张

您好,cd qt-4.6.3-x11

sourc qt_x11_setenv.sh

打开qtcreator,建立一个工程假设为form,完成后可以在虚拟机看下做的界面.

进入刚才建立的工程目录,

qmake -project

qmake

make

./form

就可以看到界面了

----------------------------------------------------------------------------------------------------

接下去是移植到开发板.

1. 把刚才做的界面源码复制到qt-4.6.3-arm

cd opt/qt-4.6.3-arm

source qt_arm_setenv.sh //因为要用到arm版的qmake, 环境变量要重新设置

qmake -project

qmake

make

./form

此时会提示错误打不开,是正常的,这是在arm板上运行的

2. 启动开发板,在根目录下建立tq2440和tslib 2个文件夹

//这里貌似QTDIR的路径要与电脑上一致,不然移植字体不识别,就是要把fedora10 系统的usr/local/Trolltech/QtEmbedded-4.6.3-arm/lib 复制到ARM的usr/local/Trolltech/QtEmbedded-4.6.3-arm/lib

mkdir tq2440

mkdr tslib

把fedora10 系统里的usr/local/Trolltech/QtEmbedded-4.6.3-arm/lib 整个lb文件夹拷到开发板/tq2440下

把tslib1.4.tar.gz 安装生成的tslib文件夹内容拷到开发板上/tslib

//tslib1.4的安装这里不赘述了,网上找个都没什么问题

现在,我们可以在开发板根目录看到tq2440和tslib这2个文件夹.

tq2440下有lib文件夹,tslib文件夹下有bin include etc lib 4个文件夹.

网上拷贝这些文件多是搭建nfs服务器做的,我是在虚拟机直接把这些文件夹打包(tar zcvf xx.tar.gz xx),共享传给我我的主机,然后主机通过secureCRT下载到开发板,就免去了搭nfs.

3. 在开发板的 /etc/profile中追加:

export QTDIR=/tq2440

export T_ROOT=/tslib

export PATH=$QTDIR/bin:$PATH

export TSLIB_CONSOLEDEVICE=none

export TSLIB_FBDEVICE=/dev/fb0

export TSLIB_TSDEVICE=/dev/event0

export TSLIB_PLUGINDIR=$T_ROOT/lib/ts

export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf

export TSLIB_CALIBFILE=/etc/pointercal

export QWS_MOUSE_PROTO=tslib:/dev/event0

export LD_LIBRARY_PATH=$T_ROOT/lib:$QTDIR/lib

这里需要注意3句代码:

export TSLIB_FBDEVICE=/dev/fb0

export TSLIB_TSDEVICE=/dev/event0

export QWS_MOUSE_PROTO=tslib:/dev/event0

有的开发板fb0 event0是在/dev/input/目录下的

所以要改为

export TSLIB_FBDEVICE=/dev/input/fb0

export TSLIB_TSDEVICE=/dev/input/event0

export QWS_MOUSE_PROTO=tslib:/dev/input/event0

再执行一下:source /etc/profile 使系统更新一遍刚设置的系统环境变量.

验证变量设置是否成功,在开发板终端下执行

echo $QTDIR

如果显示/tq2440,则说明设置成功了

4 接下来我们还得设置一下触摸屏的配置文件ts.conf.

它在哪里呢?前面我们已经拷到开发板/tslib/下,那么tslib一共就有bin etc include lib 4个目录,而ts.conf就在etc目录下,开发板下用

vi /tslib/etc/ts.conf

把# module_raw input

前面的“#”号去掉,然后把该行移至行首

现在差不多移植完成了,可以把自己用qtcreator写的程序下载到板子运行.

我是在板子目录下新建mkdir test文件夹

上文已经说到已经把qtcreator做的界面编译成arm版的了,现在把这个可执行文件form下载到开发板/test目录下

在开发板执行:

cd /test

chmod a+x form //提示权限错误就加这句,没有提示加不加无所谓

./form -qws

会出现“relocation error: /usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib/libQtGui.so.4: symbol powf, version GLIBCXX_3.4 not defined in file libstdc++.so.6 with link time reference”错误

我的解决办法是进入主机/opt/toolchains/arm920t-eabi/arm-angstrom-linux-gnueabi/lib目录下找到libstdc++.so.6链接的文件(通过右键属性——〉基本,可以看到链接的文件)libstdc++.so.6.0.8,重命名为libstdc++.so.6复制下载到开发板/tq2440/lib/目录下,之前别忘了将该文件夹下的libstdc++.so.6移到其它地方或重命名,如libstdc++.so.6.old。

*重命名其实是比较野蛮的方法,可以用ln命令的,参照下面这篇文章……

http://hi.baidu.com/a263238386/blog/item/362f01ce7b11a10a93457eae.html

然后再运行./form –qws,看问题是不是解决了!

现在可以看到开发板界面出现自己qt写的界面了

5. 不过触摸屏还没有校准,进入开发板根目录/tslib

cd bin

./ts_calibrate //触摸屏校准程序

运行该程序,屏幕出现5点校准画面,依次点击,将生成触摸屏校准数据文件/etc/pointercal

./ts_test//触摸屏拖曳测试程序

可以用这个来测试校准的怎么样

6. 开机自动启动qt 程序

如果想在开机后直接运行自己编的qt程序,而不想出现qt自带的那个界面只需把/etc/init.d/rcS中的

/bin/qtopia &注释掉,前面加个#号就行:

#/bin/qtopia &

并在下面加上自己的启动程序

/tq2440/run.sh &

//添加一个执行脚本行,这个脚本因为在/etc/init.d/rcS中,所以会被自动运行(注意后面最好有个&,使他在后台执行,否则无法通过串口 *** 作控制台)

修改echo "Starting Qtopia, please waiting..." >/dev/tty1

为echo "Starting myapps, please waiting..." >/dev/tty1

然后在/tq2440/目录下建立一个run.sh文件,内容如下:

#! /bin/sh

export QTDIR=/tq2440

export T_ROOT=/tslib

export PATH=$QTDIR/bin:$PATH

export TSLIB_CONSOLEDEVICE=none

export TSLIB_FBDEVICE=/dev/fb0

export TSLIB_TSDEVICE=/dev/event0//这边可能有的开发板是export TSLIB_TSDEVICE=/dev/input/event0

export TSLIB_PLUGINDIR=$T_ROOT/lib/ts

export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf

export TSLIB_CALIBFILE=/etc/pointercal

export QWS_MOUSE_PROTO=tslib:/dev/event0//同上,可能在/dev/input/event0

export LD_LIBRARY_PATH=$T_ROOT/lib:$QTDIR/lib

/test/form -qws

重启之后,就可以看见自己添加的qt程序开机自动运行,并且我们可以正常使用触屏。原理就是qt程序依赖很多的动态共享库,在运行的时候必须找到这个共享库,所以在运行qt程序之前必须显式地指明这些共享库的所在位置。

移植步骤:

1.修改根目录的Makefile中的ARCH=arm,CROSS-COMPILE=arm-linux-

2.在arch/arm/mach-s3c2440/mach-smdk2440.c中,将163行的s3c24xx_init_clocks(16934400)改为s3c24xx_init_clocks(12000000)。

3.修改arch/arm/tools/mach-types中379行的362改为168,因为uboot中定义的机器码是168.

4.修改arch/arm/boot/中的Makefile文件,在58行添加@cp -f arch/arm/boot/zImage zImage.bin,实现把生成的zImage文件复制到内核源码根目录下。

5.在根目录的Makefile的1164行添加rm -f zImage.bin,使得在执行make distclean在清除产生的文件的同时,把内核根目录下的zImage也清除。

6.修改arch/arm/plat-s3c24xx/common-smdk.c中111行的static struct mtd_partition smdk_default_nand_part[]的nandflash分区为:

[0] = {

.name = "Andy_uboot",

.offset = 0x00000000,

.size = 0x00040000,

},

[1] = {

.name = "Andy_kernel",

.offset = 0x00200000,

.size = 0x00200000,

},

[2] = {

.name = "Andy_yaffs2",

.offset = 0x00400000,

.size = 0x0FB80000,

}

7.修改drivers/mtd/nand/s3c2410.c中的839行为chip->ecc.mode=NAND_ECC_NONE

8.修改arch/arm/mach-s3c2440/mach-smdk2440.c中100行为.ulcon = 0x03。

9.在drivers/serial/samsung.c的51行添加

#include

#include

在433行添加:

if (port->line == 2) {

s3c2410_gpio_cfgpin(S3C2410_GPH(6), S3C2410_GPH6_TXD2)

s3c2410_gpio_pullup(S3C2410_GPH(6), 1)

s3c2410_gpio_cfgpin(S3C2410_GPH(7), S3C2410_GPH7_RXD2)

s3c2410_gpio_pullup(S3C2410_GPH(7), 1)

}

10.用git工具下载最新的yaffs2源代码。

具体为在终端输入git clonegit://www.aleph1.co.uk/yaffs2下载最新的yaffs2,下

载完成给内核打补丁,进入yaffs目录,执行

./patch-kernel.sh c m opt/Andy/linux-2.6.38(以自己的内核目录为准),其中的c代表复制,m代表复合类型。

11.用make menuconfig配置linux内核。

12.执行make zImage,将生成的zImage.bin下载到TQ2440。

13.制作文件系统。

解压busybox-1.18.4.tar.bz2,修改busybox-1.18.4中的Makefile,在164行和190行分别修改为CROSS-COMPILE=arm-linux-和ARCH=arm。执行make,然后在执行make install。将生成_install复制到根目录,添加文件系统文件,用天嵌提供的mkyaffs2image生成root.bin的可执行文件,下载到开发板。

14.启动开发板,打印信息如下:

Start Linux ...

Copy linux kernel from 0x00200000 to 0x30008000, size = 0x00200000 ... Copy Kernel to SDRAM done,NOW, Booting Linux......

Uncompressing Linux... done, booting the kernel.

Linux version 2.6.38-Andy (root@Andy) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-176) ) #15 Fri Apr 8 20:21:42 CST 2011

CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177

CPU: VIVT data cache, VIVT instruction cache

Machine: Andy's TQ2440 development board!

ATAG_INITRD is deprecatedplease update your bootloader.

Memory policy: ECC disabled, Data cache writeback

CPU S3C2440A (id 0x32440001)

S3C24XX Clocks, Copyright 2004 Simtec Electronics

S3C244X: core 400.000 MHz, memory 100.000 MHz, peripheral 50.000 MHz

CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on

Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16256

Kernel command line: noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0

PID hash table entries: 256 (order: -2, 1024 bytes)

Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)

Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)

Memory: 64MB = 64MB total

Memory: 60896k/60896k available, 4640k reserved, 0K highmem

Virtual kernel memory layout:

vector : 0xffff0000 - 0xffff1000 ( 4 kB)

fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)

DMA : 0xffc00000 - 0xffe00000 ( 2 MB)

vmalloc : 0xc4800000 - 0xf6000000 ( 792 MB)

lowmem : 0xc0000000 - 0xc4000000 ( 64 MB)

modules : 0xbf000000 - 0xc0000000 ( 16 MB)

.init : 0xc0008000 - 0xc0025000 ( 116 kB)

.text : 0xc0025000 - 0xc0399000 (3536 kB)

.data : 0xc039a000 - 0xc03bac40 ( 132 kB)

SLUB: Genslabs=13, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1

NR_IRQS:85

irq: clearing pending ext status 00080000

irq: clearing subpending status 00000003

irq: clearing subpending status 00000002

Console: colour dummy device 80x30

console [ttySAC0] enabled

Calibrating delay loop... 199.47 BogoMIPS (lpj=498688)

pid_max: default: 32768 minimum: 301

Mount-cache hash table entries: 512

CPU: Testing write buffer coherency: ok

gpiochip_add: gpios 288..303 (GPIOK) failed to register

gpiochip_add: gpios 320..334 (GPIOL) failed to register

gpiochip_add: gpios 352..353 (GPIOM) failed to register

NET: Registered protocol family 16

S3C2440: Initialising architecture

S3C2440: IRQ Support

S3C24XX DMA Driver, Copyright 2003-2006 Simtec Electronics

DMA channel 0 at c4808000, irq 33

DMA channel 1 at c4808040, irq 34

DMA channel 2 at c4808080, irq 35

DMA channel 3 at c48080c0, irq 36

S3C244X: Clock Support, DVS off

bio: create slab at 0

SCSI subsystem initialized

usbcore: registered new interface driver usbfs

usbcore: registered new interface driver hub

usbcore: registered new device driver usb

s3c-i2c s3c2440-i2c: slave address 0x10

s3c-i2c s3c2440-i2c: bus frequency set to 97 KHz

s3c-i2c s3c2440-i2c: i2c-0: S3C I2C adapter

Advanced Linux Sound Architecture Driver Version 1.0.23.

cfg80211: Calling CRDA to update world regulatory domain

NET: Registered protocol family 2

IP route cache hash table entries: 1024 (order: 0, 4096 bytes)

TCP established hash table entries: 2048 (order: 2, 16384 bytes)

TCP bind hash table entries: 2048 (order: 1, 8192 bytes)

TCP: Hash tables configured (established 2048 bind 2048)

TCP reno registered

UDP hash table entries: 256 (order: 0, 4096 bytes)

UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)

NET: Registered protocol family 1

RPC: Registered udp transport module.

RPC: Registered tcp transport module.

RPC: Registered tcp NFSv4.1 backchannel transport module.

msgmni has been set to 118

io scheduler noop registered (default)

s3c2440-uart.0: ttySAC0 at MMIO 0x50000000 (irq = 70) is a S3C2440

s3c2440-uart.1: ttySAC1 at MMIO 0x50004000 (irq = 73) is a S3C2440

s3c2440-uart.2: ttySAC2 at MMIO 0x50008000 (irq = 76) is a S3C2440

loop: module loaded

S3C24XX NAND Driver, (c) 2004 Simtec Electronics

s3c24xx-nand s3c2440-nand: Tacls=2, 20ns Twrph0=6 60ns, Twrph1=2 20ns

s3c24xx-nand s3c2440-nand: NAND ECC disabled

NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)

NAND_ECC_NONE selected by board driver. This is not recommended !!

Scanning device for bad blocks

Bad eraseblock 62 at 0x0000007c0000

Bad eraseblock 1435 at 0x00000b360000

cmdlinepart partition parsing not available

Creating 3 MTD partitions on "NAND":

0x000000000000-0x000000040000 : "Andy_uboot"

0x000000200000-0x000000400000 : "Andy_kernel"

0x000000400000-0x00000ff80000 : "Andy_yaffs2"

dm9000 Ethernet Driver, V1.31

Now use the default MAC address: 10:23:45:67:89:ab

eth0: dm9000e at c4810000,c4814004 IRQ 51 MAC: 10:23:45:67:89:ab (EmbedSky)

ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver

s3c2410-ohci s3c2410-ohci: S3C24XX OHCI

s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1

s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x49000000

usb usb1: New USB device found, idVendor=1d6b, idProduct=0001

usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1

usb usb1: Product: S3C24XX OHCI

usb usb1: Manufacturer: Linux 2.6.38-Andy ohci_hcd

usb usb1: SerialNumber: s3c24xx

hub 1-0:1.0: USB hub found

hub 1-0:1.0: 2 ports detected

Initializing USB Mass Storage driver...

usbcore: registered new interface driver usb-storage

USB Mass Storage support registered.

usbcore: registered new interface driver usbserial

usbserial: USB Serial Driver core

USB Serial support registered for pl2303

usbcore: registered new interface driver pl2303

pl2303: Prolific PL2303 USB to serial adaptor driver

s3c2410_udc: debugfs dir creation failed -19

mousedev: PS/2 mouse device common for all mice

S3C24XX RTC, (c) 2004,2006 Simtec Electronics

s3c-rtc s3c2410-rtc: rtc disabled, re-enabling

s3c-rtc s3c2410-rtc: rtc core: registered s3c as rtc0

i2c /dev entries driver

S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics

s3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irq enabled

usbcore: registered new interface driver usbhid

usbhid: USB HID core driver

ALSA device list:

No soundcards found.

TCP cubic registered

lib80211: common routines for IEEE802.11 drivers

s3c-rtc s3c2410-rtc: setting system clock to 2000-01-02 00:47:19 UTC (946774039)

yaffs: dev is 32505858 name is "mtdblock2" rw

yaffs: passed flags ""

VFS: Mounted root (yaffs filesystem) on device 31:2.

Freeing init memory: 116K

Please press Enter to activate this console.

移植过程中产生的问题及其解决方法将在下一节说明。还有一些驱动没有移植。继续努力!

在移植linux2.6.38过程中,遇见了很多的问题,通过在网上查阅相关信息和在图书馆不停的查阅资料,终于成功了。下面将移植过程中产生的问题及其解放方法与大家共享一下。

1、编译内核时yaffs2出现unknown field 'clear_inode' specified in initializer的

错误,原因是所下载的yaffs2不支持linux2.6.38.

解决方法:最新的yaffs2采用git发布,所以采用git工具下载最新的yaffs2源代码。

具体为在终端输入git clonegit://www.aleph1.co.uk/yaffs2下载最新的yaffs2,下

载完成给内核打补丁,进入yaffs目录,执行

./patch-ker.sh c m opt/Andy/linux-2.6.38(以自己的内核目录为准),其中的c代表复制,m代表复合类型。

2、移植linux内核到开发板后,出现data abort的错误,错误原因为内核大小超过了2M,

天嵌的Uboot只分配给内核2M的空间,所以报错。

解决方法:精简内核,使其小于2M。或者修改Uboot,是内核大小大于2M。

所以个人认为天嵌的Uboot值得改进,下一步我将移植Uboot,用自己的Uboot就不存在这个问题了。嘿嘿

3.移植内核时,出现Uncompressing Linux... done, booting the kernel后,系统不能启动,网上好多人说是因为在menuconfig选项中的Boot options中的Default kernel command string中没有设置noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0 rootfs=yaffs2 rw。其实不用设置这个参数也可以,我采用在内核配置文件中将Kernel Feature/Provide old way to pass kernel parameters选上就行了,因为天嵌用的bootloader太老了,从打印的内核信息中就可以看出。(ATAG_INITRD is deprecatedplease update your bootloader.)

4.内核启动时,出现Failed to execute /linuxrc的错误,原因是:

(1)文件系统中没有包含linuxrc的可执行文件。在文件系统中添加linuxrc就可完成linux的启动。

(2)在/driver/mtd/nand/s3c2410.c中将chip->ecc.mode = NAND_ECC_SOFT改为chip->ecc.mode = NAND_ECC_NONE并在配置内核中将Samsung S3C NAND Hardware ECC选项删掉。

这个问题纠结了我好久,我遇见这个问题后,先尝试用nfs挂载,能够挂载上,所以我确定肯定是nandflash出了问题了,以为nandflash坏了(因为被我不停的擦写,嘿嘿),后来用天嵌自带的镜像试了是好的,我就明白了,估计是我的nand驱动有问题了,仔细检查驱动,发现内核配置中的Samsung S3C NAND Hardware ECC没有去掉,,一个小小的问题折磨了我这么久。所以一定一定要仔细啊。

5.编译串口驱动是出现error: implicit declaration of function 's3c2410_gpio_cfgpin'的错误,是因为内核版本2.6.38的内核定义s3c2410_gpio_cfgpin是在linux/gpio.h中,所以添加#include 后即可。

6.编译串口驱动是出现error: 'S3C2410_GPH6' undeclared (first use in this function)是因为在内核版本2.6.38的内核定义s3c2410_gpio_cfgpin的函数变量采用的是S3C2410_GPH(6),而非S3C2410_GPH6,将其改为S3C2410_GPH(6)即可解决问题。

7.linux内核2.6.38的串口程序samsung.c在/driver/tty/serial中。这里与原来的内核版本不一致。这个要注意,内核版本改了,接口也改了,我当时找不到samsung.c,然后通过find命令一看,晕,原来在这里面。

8.在添加yaffs2内核支持时,找不到Kconfig,复制Yaffs2文件夹中的Kconfig_muti到linux内核的fs/yaffs2中,并将Kconfig_muti修改为Kconfig。

进行OS移植,首先要明确目标板上CPU、FLASH、SDRAM的情况,以尽可能相一致为原则,先找出一个与所移植目标板为同一个或同一系列处理器的开发板为移植参考板。

2440的基本参数如下:

CPU处理器

– Samsung S3C2440AL,主频400MHz,最高533MHz。

SDRAM内存

– 板载64MB SDRAM

– 32bit数据总线

– SDRAM时钟频率高达100MHz

– Hynix809E

Flash存储器

– 板载64MB Nand Flash,掉电非易失

– 板载2MB Nor Flash

以2410为参考,修改Makefile和源文件,如:

修改顶层Makefile

在smdk2410_config : unconfig

@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

之后,添加以下内容:

tq2440_config : unconfig

@$(MKCONFIG) $(@:_config=) arm arm920t tq2440 NULL s3c24x0


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/9012808.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-23
下一篇 2023-04-23

发表评论

登录后才能评论

评论列表(0条)

保存