第1章 产品概述】 - 【第2章 硬件资源介绍】 - 【第3章 MDK例程的使用】 - 【第4章 Linux系统指南】 - 【第5章 Android系统指南

4.1 概述

本章主要讲述如何在MYD-SAM9X5开发板上安装运行Linux系统和嵌入式Linux应用程序及驱动的开发流程。其中包括开发环境的搭建、源码编译、映像下载、Linux应用程序、驱动的实例分析以及Qt移植教程。系统的默认启动方式为NandFlash启动,产品在出厂时初始系统为Linux系统,NandFlash内容分布图及部分分析如下图所示:

图4-1

(1)BootStrap

一级引导程序,系统上电后由CPU自动拷贝到内部SRAM中并开始执行。主要作用是初始化CPU和外部RAM,并将u-boot从NandFlash中拷贝到外部RAM中,然后跳到u-boot的程序入口开始执行u-boot;

(2)u-boot

二级引导程序,可以与用户交互,用于内核映像更新、载入内核以及引导内核启动;

(3)u-boot Env

配置环境变量,提供u-boot运行的各项参数,比如ip地址,启动命令,内核启动参数等;

(4)Linux Kernel

专为MYD-SAM9X5制定的Linux 2.6.39内核;

(5)Root FS

Angstrom-X11 GUI 文件系统,Angstrom-Qt无桌面文件系统。

4.2 软件资源

类别 名称 备注
引导程序 Boot Stram 一级引导程序
u-boot 二级引导程序
Linux内核 Linux 2.6.39 专为MYD-SAM9X5的硬件制定的Linux内核
设备驱动 USB Host USB Host驱动,支持OHCI和EHCI两种传输模式
USB Device USB Device驱动(Gadget)
Ethernet 以太网驱动
MMC / SD MMC/SD卡驱动
NandFlash NandFlash/SmartMedia驱动
TWI(I2C) I2C驱动
SPI SPI驱动
AC97 AC97音频驱动
LCD Controller LCD屏驱动,可支持4.3寸,7寸,10.2寸液晶屏
RTC RTC时钟驱动
TouchScreen 4线电阻触摸屏驱动
PWM PWM(脉宽调制)驱动
UART 串口驱动
LED LED驱动,包括GPIO LED和PWM LED驱动
文件系统 Angstrom-X11 具有图形界面的X11文件系统
Angstrom-Qt 移植好Qt库的无桌面文件系统

表4-1

4.3 快速启用Linux系统

4.3.1 安装下载工具

安装 atmel 的 ISP下载软件 SAM-BA(要求版本2.11以上,光盘中的位置:03-Tools/SAM-BA)。

注意:如果安装了 SAM-BA 2.10 及以前的版本,需要先将其全部卸载(包括SAM-BA 软件以及开发板 USB驱动)。如果需要两个或以上的SAM-BA版本共存,那么不同版本的SAM-BA应该使用PC上不同的USB接口。

4.3.2 连接开发板与PC机

(1)通过micro USB线将开发板(J17)与PC相连并将电源开关J5拨到USB供电。

(2)将核心板上的拨码开关SW1的开关1、2全部拨为OFF,并将跳线JP8断开,然后重启开发板(顺序不可颠倒)。第一次连接开发板时会提示安装开发板驱动,此时选中SAM-BA安装目录下的相关位置安装即可如图4-2所示:

图 4-2

(3)如果在“我的电脑→属性→管理→设备管理器→端口”中可以看到如图4-3所示,则说明开发板驱动已经装好。

图 4-3

此处COM8为本机下的连接端口(根据实际情况确定,这里为COM8),然后将拨码开关SW1的开关1拨为ON,开关2保持为OFF。

(4)使用串口线连接开发板J18和PC机,并在PC机上设置超级终端为:COM1,115200,8,None,1。其中COM端口号根据实际情况设置。

4.3.3 自动下载

注意:
1. 如果有SD卡,下载前请将SD卡拔出,否则可能会出现错误;
2. 这里以使用4.3寸屏的X11镜像为例,如果使用的是其它尺寸的屏或要下载Qt镜像,请下载对应目录下的镜像。

完成步骤4.3.1和4.3.2以后打开光盘目录:\02-Images\Linux\4.3 LCD\X11,双击at91sam9x5ek_demo_linux_nandflash.bat接着,SAM-BA将会自动下载linux映像到开发板中。整个下载过程大概需要3分钟,当自动弹出logfile.log文件时,复位开发板,在超级终端上便可看到linux的启动信息。

说明:Linux使用请参照4.7节详细介绍。

4.3.4 手动下载

注意:
1. 如果有SD卡,下载前请将SD卡拔出,否则可能会出现错误;
2. 这里以使用4.3寸屏的X11镜像为例,如果使用的是其它尺寸的屏或要下载Qt镜像,请下载对应目录下的镜像。

利用SAM-BA手动下载linux

(1)完成步骤4.3.1和4.3.2后,将核心板的开关SW1,SW2拨为off,重启开发板,再将开关SW1拨为ON,然后打开SAM-BA进行相应的参数设置,其中connection为\USBserial\COMXX (XX各自电脑的COM口,根据实际情况选择,这里选COM8),board选择为at91sam9x35-ek。然后点击Connect,便可成功连接上开发板,具体设置和连接后的效果如图4-4、图4-5所示:

图 4-4



图 4-5

(2)点击NandFlash选项卡,并在Scripts选项卡中依次并执行Enable NandFlash、Erase All、Enable OS PMECC parameters(选择一项操作后点击旁边的“Execute”执行),在执行Enable OS PMECC parameters时弹出的对话框直接点OK采用默认设置即可,具体操作如下所示:

在Scripts选项卡中选择“Enable NandFlash”,然后点击“Execute”使能NandFlash,如图4-6所示:

图 4-6

在Scripts选项卡中选择“Enable OS PMECC parameters”,然后点击“Execute”执行,在弹出的对话框中直接点OK采用默认设置即可,如图4-7所示:

图 4-7

在Scripts选项卡中选择“Erase All”,然后点击“Execute”,格式化NandFlash。如图4-8所

图 4-8

(3)烧写at91sam9x5ek-nandflashboot-3.1.bin,如图4-9和图4-10所示:

图 4-9



图 4-10

(4)烧写u-boot.bin到地址0x40000处,如图4-11所示:

图 4-11

(5)烧写ubootEnvtFileNandFlash.bin到地址0xC0000处,如图4-12所示:

图 4-12

(6)烧写linux 内核uImage到地址0x200000处,如图4-13所示:

图4-13

(7) 烧写文件系统 Angstrom-x11-at91sam9-image-eglibc-ipk-v20110624-at91sam9x5ek.rootfs.ubi到地址0x800000处,如图4-14所示:

图 4-14

注意:在选择Enable OS PMECC parameteers然后点击Execute弹出的对话框中一定要将Trimffst选项选上(打上勾)。

最后重启开发板即可正常启动Linux系统。Linux使用请参照4.7节详细介绍。

4.4 Linux开发环境的搭建

此部分内容请参考“基于VirtualBox的Linux开发环境搭建说明”。

4.5 Linux的安装与编译

4.5.1 建立工作目录

$ mkdir /home/MYIR_SAM9X5
$ cd /home/MYIR_SAM9X5

将光盘中的05-Linux_Source文件夹复制到此/home/MYIR_SAM9X5目录中(用户也可自定义自己的工作目录):

$ cp -r /media/cdrom/05-Linux_Source ./

4.5.2 安装交叉编译工具

解压交叉编译工具到/usr/local目录下:

$ sudo tar xvjf 05-Linux_Source/CrossTool/arm-2010q1-202-arm-none-linux-gnueabi.tar.bz2 -C /usr/local

4.5.3 安装AT91Bootstrap源码并编译

(1)安装

$ tar xvjf 05-Linux_Source/AT91Bootstrap/AT91Bootstrap-5series_1.2.tar.bz2 -C ./

(2) 编译

$ cd AT91Bootstrap-5series_1.2
$ make distclean 
$ make at91sam9x5nf_defconfig 
$ make CROSS_COMPILE=/usr/local/arm-2010q1/bin/arm-none-linux-gnueabi-

在binary目录下的at91sam9x5ek-nandflashboot-3.1.bin就是我们要烧写的AT91Bootstrap文件。 AT91Bootstrap是针对ATMEL芯片的一级引导程序,它初始化一些必要的硬件 (GPIO, Clock, SDRAM, etc), 然后将uboot拷贝到SDRAM中开始运行。

4.5.4 安装uboot源码并编译

(1)安装

$ cd 05-Linux_Source/U-Boot/
$ tar xvjf u-boot-linux.tar.bz2
$ cd u-boot-linux

(2)编译不带debug功能的u-boot 不带debug功能的u-boot.bin在开发板启动后将不检测PC键盘的按键而直接引导系统启动。默认情况下不作任何修改编译出来的u-boot是不带debug功能的,编译命令如下:

$ make at91sam9x5ek_nandflash_config
$ make CROSS_COMPILE=/usr/local/arm-2010q1/bin/arm-none-linux-gnueabi-
$ ls

编译完成后将在u-boot-linux目录下生成不带debug功能的u-boot.bin文件。

(3)编译带debug功能的u-boot

使用带debug功能的u-boot-debug.bin在连接串口的情况下可以在开发板启动后马上按下空格或回车键进入u-boot操作模式,此模式下可以进行tftp下载并更新镜像、设置u-boot环境变量等操作,如果没有检测到按键则继续引导系。由于带debug功能的u-boot在启动时需要做初始化网络等一系列操作,所以启动速度将大大减慢(大约慢10到15秒),所以我们强烈建议在实际产品中使用不带debug功能的u-boot.bin。要打开u-boot的debug功能需要修改/u-boot-linux/include/configs/at91sam9x5ek.h文件:

① 将91行的CONFIG_BOOTDELAY修改为1秒,系统启动后将有1秒钟的时间等待键盘输入:

#define CONFIG_BOOTDELAY        0//1

修改为:

#define CONFIG_BOOTDELAY        1

② 打开第168行对CONFIG_MACB的注释,从而打开网络支持:

//#define CONFIG_MACB                   1

修改为:

#define CONFIG_MACB                   1

③ 执行下面命令进行编译

$ make distclean
$ make at91sam9x5ek_nandflash_config
$ make CROSS_COMPILE=/usr/local/arm-2010q1/bin/arm-none-linux-gnueabi-
$ ls

编译完成后将在u-boot-linux目录下生成带有debug功能的u-boot.bin文件。

4.5.5 安装Linux kernel源码并编译

(1)安装

$ cd 05-Linux_Source/Linux_Kernel/
$ tar xvjf linux-2.6.39.tar.bz2 -C ./
$ cd linux-2.6.39/

(2)编译

直接执行源码根目录下的make_image.sh脚本进行编译:

$ sudo chmod a+x make_image.sh
$ ./make_image.sh 4.3    #(说明:其中4.3表示使用的是4.3寸的屏,如果使用其它尺寸的屏,请改成对应尺寸的数字)

或执行下面的命令进行编译:

$ make ARCH=arm myir_MYD-SAM9X5_4.3lcd_defconfig

注意:myir_MYS-SAM9X5_4.3lcd_defconfig为4.3寸屏的默认配置文件,如果使用其它尺寸的屏,请改成与其它尺寸相对应的默认配置文件)download。

$ make ARCH=arm uImage CROSS_COMPILE=/usr/local/arm-2010q1/bin/arm-none-linux-gnueabi-

注意:make uImage这个命令要求编译环境中已经安装mkimage工具,否则请使用以下命令安装该工具:

$ sudo apt-get install uboot-mkimage

内核编译结束,arch/arm/boot/目录下的uImage文件就是我们需要的linux境像文件。

4.6 快速制定Linux文件系统

光盘中提供的文件系统 Angstrom-x11-at91sam9-image-eglibc-ipk-v20110624-at91sam9x5ek.rootfs.ubi可以进行简单的制定和修改,这里以向文件系统根目录添加应用程序helloworld为例,说明制定文件系统的详细步骤。

4.6.1 编写demo程序helloworld

首先编写一个简单的程序helloworld:

(1)创建并编辑helloworld.c

$ vi helloworld.c

向helloworld.c中输入如下内容后保存退出:

#include <stdio.h>
int main(int argc, char *argv[])
{
	int i;
	printf("========== Hello World ==========\n");
	printf("argc: %d\n", argc);
	for(i = 0; i < argc; i++)
	{
		printf("argv[%d]: %s\n", i, argv[i]);
	}
	return 0;
}

(2)编译helloworld.c

添加交叉编译工具路径到PATH中:

$ export PATH=$PATH:/usr/local/arm-2010q1/bin/

利用交叉编译工具进行编译:

$ arm-none-linux-gnueabi-gcc -o helloworld helloworld.c

生成的 helloworld 便是可以在目标板上运行的应用程序。

4.6.2 在PC机Linux平台上挂载UBIFS文件系统

UBIFS是nokia工程师在the university of Szeged大学帮助下开发的新的Flash file system。UBIFS可以认为是JFFS2文件系统的下一代。UBIFS文件系统是专门为大容量FLASH嵌入式移动设备设计的,挂载UBIFS文件系统必须有mtd接口,而普通的PC机通常都不用mtd管理磁盘,所以这里需要用到nandsim模拟器,用一片RAM空间模拟出mtd设备,然后对UBIFS文件系统进行挂载。具体步骤如下:

(1)加载UBIFS驱动和mtd驱动 依次输入如下命令:

$ sudo modprobe nandsim first_id _byte=0xec second_id_byte=0xda third_id_byte=0x10 fourth_id_byte=0x95

加载nandsim时需要传入的几个参数:first_id_byte、second_id_byte、third_id_byte和fourth_id_byte是需要模拟的目标NANDFLASH的ID,MYD-SAM9x5使用的NANDFLASH为三星的K9F2G08U0B,从datasheet中可查到四个ID bytes依次为: 0xec,0xda,0x10,0x95 若执行成功将可以在/dev/目录下找到mtd0和mtd0r0两个设备:

$ ls /dev/mtd*
/dev/mtd0 /dev/mtd0ro

(2)擦除mtd0分区,操作如下:

$ sudo flash_eraseall /dev/mtd0
flash_eraseall has been replaced by `flash_erase <mtddev> 0 0`; please use it
Erasing 128 Kibyte @ ffe0000 -- 100 % complete

(3)将Angstrom-x11-at91sam9-image-eglibc-ipk-v20110624-at91sam9x5ek.rootfs.ubi装入新建的mtd0分区,这里用到dd命令进行装入,如下:

$ sudo dd if=Angstrom-x11-at91samg-image-eglibc-ipk-v20110624-at91sam9x5ek.rootfs.ubi of=/dev/mtd0
100864+0 records in
100864+0 records out
51642368 bytes (52 MB) copied, 0.323121 s, 160 MB/s

(4)挂载UBIFS文件系统

完成以上步骤之后,加载ubi模块并attach到mtd0中,便可以像挂载普通的mtd设备一样挂载UBIFS文件系统。

加载ubi模块并attach到mtd0设备:

$ sudo modprobe ubi mtd=0,2048 

新建一个挂载点:

$ mkdir fsmount

通过以下命令进行挂载:

$ sudo mount -t ubifs ubi0_0 fsmount/
$ ls fsmount/ 
bin  boot  dev  etc  home  lib  media  mnt  proc  sbin  sys  tmp  usr  var

至此我们已经在PC机上成功挂载目标板中使用的UBIFS文件系统。

4.6.3 修改UBIFS文件系统

成功挂载UBIFS文件系统之后便可以按需要对里面的内容进行修改,如添加和删除文件,修改文件等,这里需要往文件系统的根目录中添加之前编译好的demo程序helloworld。操作如下:

$ sudo cp helloworld fsmount/
$ sync
$ ls fsmount
bin boot dev etc helloworld home lib media  mnt  proc  sbin  sys  tmp  usr  var

4.6.4 重新生成UBIFS文件系统

修改完成之后需要利用mkfs.ubifs工具重新生成文件系统,如果没有mkfs.ubifs工具可通过以下命令安装:

$ sudo apt-get install mtd-utils

输入以下命令生成新的UBIFS文件系统:

$ sudo mkfs.ubifs -r fsmount/ -m 2048 -e 126976 -c 2024 -o ubifs.img

mkfs.ubifs参数说明:

  • -r 建立文件系统的目录
  • -m 最小的I/O传输单元大小
  • -e 逻辑擦除块大小
  • -c 最大的逻辑擦除块数
  • -o 指定输出文件

其中可以通过以下命令查看最小的I/O传输单元大小和逻辑擦除块大小:

$ ubinfo /dev/ubi0 	
ubi0
Volumes count:                           1
Logical eraseblock size:                 126976 bytes, 124.0 KiB
Total amount of logical eraseblocks:     2048 (260046848 bytes, 248.0 MiB)
Amount of available logical eraseblocks: 0 (0 bytes)
Maximum count of volumes                 128
Count of bad physical eraseblocks:       0
Count of reserved physical eraseblocks:  20
Current maximum erase counter value:     1
Minimum input/output unit size:          2048 bytes
Character device major/minor:            250:0
Present volumes:                         0

通过以下命令查看最大的逻辑擦除块数:

$ ubinfo /dev/ubi0_0
Volume ID:   0 (on ubi0)
Type:        dynamic
Alignment:   1
Size:        2024 LEBs (256999424 bytes, 245.1 MiB)
State:       OK
Name:        rootfs
Character device major/minor: 250:1

然后利用ubinize工具生成fsimage.ubi文件。首先需要建立ubinize的配置文件ubinize.cfg:

$ vi ubinize.cfg

输入以下内容,并保存退出:

[ubifs]
mode=ubi
image=ubifs.img
vol_id=0
vol_size=64MiB
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize
vol_alignment=1

输入以下命令生成最终烧写到目标板的文件系统文件fsimage.ubi:

$ sudo ubinize -m 2048 -p 128KiB -o fsimage.ubi ubinize.cfg

ubinize参数说明:

  • -m 最小输入/输出字节闪存单元的大小
  • -p FLASH的物理擦除块的大小
  • -o 输出的文件

这里和mkfs.ubifs的参数不同,-p的参数为物理擦除块大小,也就是ubi工作在MTD层之上,所以需要MTD的参数,即物理参数,而ubifs工作在ubi之上,所以需要ubi的参数,即逻辑参数。现在,ubi设备映像已经被保存在了ubi.img中,不仅包含ubifs信息,还包含ubi信息。 完成之后,所生成的fsimage.ubi文件便可以用 4.3.4中手动下载linux 所描述的方法进行烧写,即在烧写文件系统的步骤中将新生成的文件系统fsimage.ubi烧写到地址0x800000处即可。

成功烧写之后复位开发板,输入root登陆,可以在根目录下找到新添加进去的helloworld文件:

at91sam9x5ek login: root
root@at91sam9x5ek:~$ cd /
root@at91sam9x5ek:/$ ls
bin        etc        lib        proc       tmp
boot       helloworld  media      sbin       usr
dev        home       mnt        sys        var

运行helloworld,如下所示:

root@at91sam9x5ek:/$ ./helloword 
========== Hello World ==========
argc: 1
argv[0]: ./helloword

4.7 Linux的使用

在Linux系统运行之后,可以通过触摸屏进行操作,也可以通过终端串口进行操作,下面介绍如何通过终端操作Linux,如U盘、SD卡的挂载、网口的测试以及如何播放音乐等等。

4.7.1 触摸屏的校准

注意:MYD-SAM9X25和MYD-SAM9G25开发板不含触摸屏。

初次进入系统会有一个默认的校准参数配置,如果使用默认校准参数有偏差可通过以下步骤进行校准触摸屏:

(1)打开超级终端(波特率:115200,数据位:8,奇偶校验:无,停止位:1,数据流控制:无),Linux启动后,以root命令登录:

at91sam9x5ek login: root

(2)运行校准程序,此时在LCD屏上对应的5个校准点上点击,即可进行校准:

root@at91sam9x5ek:~$ ts_calibrate 
xres = 480, yres = 272
Took 33 samples...
Top left : X =  804 Y =  178
Took 40 samples...
Top right : X =  790 Y =  953
Took 31 samples...
Bot right : X =  301 Y =  950
Took 34 samples...
Bot left : X =  306 Y =  172
Took 30 samples...
Center : X =  550 Y =  562
-33.023254 -0.004476 0.489318
330.122131 -0.348463 -0.004259
Calibration constants: -2164212 -293 32067 21634884 -22836 -279 65536 

(3)完成校准后需要重启系统校准才会生效,操作如下:

root@at91sam9x5ek:~$ sync
root@at91sam9x5ek:~$ reboot

4.7.2 U盘的使用

(1)在通过终端进入Linux后,将U盘插入到开发板J15的任意一个USB host口,这时可以在超级终端上看到如下信息:

scsi0 : usb-storage 1-2:1.0
scsi 0:0:0:0: Direct-Access Kingston DT 101 G2 PMAP PQ: 0 ANSI: 0 CCS
sd 0:0:0:0: [sda] 7669824 512-byte logical blocks: (3.92 GB/3.65 GiB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Assuming drive cache: write through
sd 0:0:0:0: [sda] Assuming drive cache: write through
sda: detected capacity change from 0 to 3926949888
sda: sda4
sd 0:0:0:0: [sda] Assuming drive cache: write through
sd 0:0:0:0: [sda] Attached SCSI removable disk
FAT: invalid media value (0x01)
VFS: Can't find a valid FAT filesystem on dev sda.
EXT2-fs (sda): error: can't find an ext2 filesystem on dev sda.
FAT: invalid media value (0x01)
VFS: Can't find a valid FAT filesystem on dev sda.

注意:以上橙色的错误是系统尝试挂载USB设备sda失败,这个错误可以忽略,因为sda不是一个有效分区,如上红色字体所示的sda4才是我们挂载的有效分区。

(2)系统将自动挂载插入的U盘,输入以下命令查看U盘内容:

root@at91sam9x5ek:/$ ls /media/sda4/
9x5??.rar        GHOSTXP.GHO      NTLDR            helloworld
????????.TXT     MYD-S5PV210      PETOOLS          rootfs.tar
BOOT             NTDETECT.COM     WXPE             sam-ba_2.11.exe

(3)使用完成后,直接拔出U盘,系统会自动执行卸载。

4.7.3 SD卡的使用

(1)将MicroSD卡插到开发板的MicroSD卡接口中,系统将会自动挂载。

(2)把MicroSD卡插入后超级终端显示SD卡信息:

mmc0: host does not support reading read-only switch. assuming write-enable.
mmc0: new high speed SD card at address e624
mmcblk0: mmc0:e624 SU02G 1.84 GiB 
mmcblk0: detected capacity change from 0 to 1977614336
mmcblk0: retrying using single block read

(3)查看SD卡中的内容:

root@at91sam9x5ek:/$ ls /media/mmcblk0/
MyHeartWillGoOn.wav

(4)使用完成后,直接拔出SD卡,系统会自动执行卸载。

4.7.4 播放MP3音乐

在播放音乐之前,需要把耳机或音响接到开发板的音频输出接口J7,在U盘中存放一首mp3音乐,并把该U盘插入开发板上的USB接口。 在终端通过mplayer命令播放U盘中音乐:

root@at91sam9x5ek:/media/sda4$ mplayer thelastone.mp3

此时便可以从耳机中听到音乐,端终打印出来的信息如下所示,输入Ctrl + C结束音乐的播放:

MPlayer UNKNOWN-4.5.3 (C) 2000-2010 MPlayer Team
Playing thelastone.mp3.
Alignment trap: mplayer (1091) PC=0x002560a0 Instr=0xe1d130b0 Address=0x40a1c455 FSR 0x001
Alignment trap: mplayer (1091) PC=0x002560a0 Instr=0xe1d130b0 Address=0x40a1c455 FSR 0x001
Audio only file format detected.
Clip info:
 Title: 
 Artist: 
 Album: 
 Year: 
 Comment: 
 Genre: Unknown
================================================================
Forced audio codec: mad
Opening audio decoder: [libmad] libmad mpeg audio decoder
AUDIO: 44100 Hz, 2 ch, s16le, 224.0 kbit/15.87% (ratio: 28000->176400)
Selected audio codec: [mad] afm: libmad (libMAD MPEG layer 1-2-3)
================================================================
AO: [alsa] 48000Hz 2ch s16le (2 bytes per sample)
Video: no video
Starting playback...
A:   1.5 (01.4) of 239.0 (03:59.0) 19.7%

4.7.5 网口的测试

注意:MYD-SARM9G15不支持网络,MYD-SAM9G25/G35/X35支持一个网口,使用时连接J11,MYD-SAM9X25支持两个网口,使用时连接J11和J10都可以。

把开发板和PC机用交叉网线相连,或者把开发板用直通网线连接到交换机或路由器上。请注意,对于使用交叉线与PC机连接的方法,如果开发板需要访问外网要求PC端具有双网卡,其中网卡一与开发板连接,网卡二与外网连接,并将网卡一与网卡二设置为桥接模式。以下的测试用的就是交叉线连接+PC双网卡桥接的模式。

(1)在PC机的“网络连接”窗口中,选中需要桥接的两个网卡,右击并在右键菜单中选择“桥接”,将两个网卡进行桥接。

(2)通过超级终端,为开发板配置一个不被当前局域网其他设备占用的IP地址,本例中使用地址为:192.168.0.2:

root@at91sam9x5ek:/$ ifconfig eth0 192.168.0.2 up

(3)通过ping命令测试开发板与PC机网络是否成功连接(这里主机IP为192.168.0.3)。 在PC机上ping开发板:

在开发板中ping主机:

root@at91sam9x5ek:~$ ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3): 56 data bytes
64 bytes from 192.168.0.3: seq=0 ttl=64 time=3.767 ms
64 bytes from 192.168.0.3: seq=1 ttl=64 time=0.458 ms

4.7.6 Telnet测试

(1)配置IP地址

root@at91sam9x5ek:/$ ifconfig eth0 192.168.0.2 up

(2)配置网关 测试与网关的连接是否正常,如下所示:

root@at91sam9x5ek:/ $ ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1): 56 data bytes
64 bytes from 192.168.0.1: seq=0 ttl=64 time=5.776 ms
64 bytes from 192.168.0.1: seq=1 ttl=64 time=0.484 ms

设置192.168.0.1为默认网关:

root@at91sam9x5ek:/ $ route add  default  gw  192.168.0.1

测试与202.112.17.137的连接:

root@at91sam9x5ek:/ $ ping  202.112.17.137
PING 202.112.17.137 (202.112.17.137): 56 data bytes
64 bytes from 202.112.17.137: seq=0 ttl=52 time=26.592 ms
64 bytes from 202.112.17.137: seq=1 ttl=52 time=25.140 ms

(3)使用telnet访问BBS论坛:

root@at91sam9x5ek:/media$ telnet 202.112.17.137
 
华南木棉BBS 最近 (1,10,15) 分钟平均负荷为 0.00 0.00 0.00  [负荷正常]
Entering character mode
Escape character is '^]
 
★※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※★
※※
※欢迎莅临※
※中国教育和科研计算机网(CERNET)华南地区网络中心※
※电子公告牌华南网木棉站※
※※
※本站地址: bbs.gznet.edu.cn (202.112.17.137)             ※
※※
◇          Warmly Welcome to Bulletin Board Service(BBS) of            ◇
◇                  CERNET Southern Regional Center                     ◇
◇◇
◇          If you have any problems, please send email to              ◇
◇                         scutbbs@scut.edu.cn                          ◇
※※
◎请用户遵守国家法律和CERNET用户守则,谢谢合作!              ◎
※※
★※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※★
欢迎光临【华南木棉BBS 】 [ Add '.' after YourID to login for BIG5 ]
目前上站人数: [9/25000]。最高人数记录: [12970]。
请输入帐号(试用请输入 `guest'):

表示telnet测试成功。

(4)配置DNS服务器 在PC机上通过ipconfig /all命令可以查看当前PC机使用的DNS服务器地址,本机使用的DNS为202.103.24.68,设置目标板的DNS(根据具体情况设置):

root@at91sam9x5ek:/$ echo "nameserver 202.103.24.68" | tee /etc/resolv.conf

使用ping www.baidu.com测试外网访问:

root@at91sam9x5ek:/$ ping www.baidu.com
PING 119.75.217.56 (119.75.217.56): 56 data bytes
64 bytes from 119.75.217.56: seq=0 ttl=54 time=60.990 ms
64 bytes from 119.75.217.56: seq=1 ttl=54 time=59.644 ms

访问外网成功。

4.7.7 RTC使用

(1)将钮扣电池安装到开发板上。

(2)系统在第一次启动时会将时间设置为初始值,因此第一次系统启动后需要进行时间设置。

注意:由于X11的系统启动了计划任务服务(atd),如果直接用hwclock命令写入硬件RTC将会提示设备忙的错误,此时可以先停止atd服务,测试完之后再启动。

停止atd服务:

root@at91sam9x5ek:/$ /etc/init.d/atd stop

设置系统时间:

root@at91sam9x5ek:/$ date -s 2012.07.08-10:36:00 ; hwclock -w
Sun Jul  8 10:36:00 BST 2012

查询系统时间和硬件RTC时间:

root@at91sam9x5ek:/$ date
Sun Jul  8 10:37:13 BST 2012
root@at91sam9x5ek:/$ hwclock -r
Sun Jul  8 10:36:22 2012  0.000000 seconds

恢复atd服务:

root@at91sam9x5ek:/$ /etc/init.d/atd start

4.8 Linux驱动程序开发实例

本小节讲述在linux系统上开发一个简单的字符设备驱动,实现的功能是控制LED灯的亮灭。通过这样一个例子简单介绍linux下的驱动开发流程。

4.8.1 硬件原理



图4-15

如上图4-15所示,利用PD21口通过IRLML2502控制D2,高电平LED亮,而PB18口直接控制D1,低电平LED亮。

4.8.2 驱动源程序

(1)在内核中新建驱动程序源文件

在kernel文件夹下的driver/char/目录,新建驱动程序源文件:

$ cd linux-2.6.39
$ vi drivers/char/ledtest.c 

(2)驱动源代码ledtest.c 如下:

#include <linux/string.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <mach/gpio.h>     //包含管脚操作的相关函数
#include <linux/device.h>  //包含创建设备文件的相关函数
 
#define DEVICE_NAME "MY-SAM9X5-ledtest"
 
static int LED_Major = 0;
struct cdev cdev;  /** 应用程序执行 ioctl(fd, cmd, arg)时的第 2 个参数 **/
 
#define  LED_OFF      0
#define  LED_ON       1
static unsigned long led_table [] = {
	AT91_PIN_PB18,  /**led_blue**/
	AT91_PIN_PD21,  /**led_red**/
};
 
/*应用程序对设备文件/dev/leds 执行 open()时,  *就会调用MY_SAM9X5_ledtest_open */
static int MY_SAM9X5_ledtest_open(struct inode *inode, struct file *file) {
	printk("MY-SAM9X5-ledtest Driver Open Called!\n");
	return 0;
}
 
static long MY_SAM9X5_ledtest_ioctl(struct file *filp,unsigned int cmd,unsigned long arg)
{  
	if((cmd != 1 && cmd != 0) || (arg != 1 && arg != 0))
		return -1;
 
	switch(cmd) {
	case LED_ON:
		if(arg) {
			at91_set_gpio_value(led_table[arg], 1);
		}
		else {
			at91_set_gpio_value(led_table[arg], 0);
		}
		break;
	case LED_OFF:
		if(arg) {
			at91_set_gpio_value(led_table[arg], 0);
		} else {
			at91_set_gpio_value(led_table[arg], 1);
		}
		break;
	default:
		return -EINVAL;
	}
 
	return 0;
}
 
static int MY_SAM9X5_ledtest_release(struct inode *inode, struct file *file) {
     printk("MY_SAM9X5_LED Driver Release Called!\n");
     return 0;
}
 
/*这个结构是字符设备驱动程序的核心    *当应用程序操作设备文件时调用的 open、read等函数,    *最终会调用这个结构中指定的对应函数 */
static struct file_operations MY_SAM9X5_ledtest_fops = {
    .owner  	     =   THIS_MODULE,
	.open   	     =   MY_SAM9X5_ledtest_open,
	.release 	     =   MY_SAM9X5_ledtest_release,
	.unlocked_ioctl    =   MY_SAM9X5_ledtest_ioctl,
};
 
static struct class *MY_SAM9X5_ledtest_class = NULL;  /**模块的初始化函数**/
 
static int __init MY_SAM9X5_ledtest_init(void) {
 	int result,err;
	dev_t devno  =  MKDEV(LED_Major, 0);      	 /**采用自动分配主设备号**/
   	if (LED_Major) {
		result = register_chrdev_region(devno, 1, DEVICE_NAME);
 		printk("Got the Major number by register_chrdev_region !\n ");
	} else {
		result = alloc_chrdev_region(&devno, 0, 1, DEVICE_NAME);
  		LED_Major=MAJOR(devno);
 		printk("Got the Major number by alloc_chrdev_region !\n");
	}
 
	if (result < 0) {
		printk(DEVICE_NAME " can't register major number\n");
 	    return result;
	}
 
	printk("register MY_SAM9X5_ledtest Driver OK! Major = %d\n", LED_Major);
 
	/**初始化cdev结构**/
	cdev_init(&cdev,&MY_SAM9X5_ledtest_fops);
	cdev.owner=THIS_MODULE;
	cdev.ops=&MY_SAM9X5_ledtest_fops;
 
	/**注册字符设备**/
	err=cdev_add(&cdev, MKDEV(LED_Major, 0), 1);
	if (err) {
		printk("error %d adding led \n ", err);
 		goto fail_cdev_add;
	}
 
	/**自动创建设备文件**/
	MY_SAM9X5_ledtest_class = class_create(THIS_MODULE, DEVICE_NAME);
	if(IS_ERR(MY_SAM9X5_ledtest_class)) {
		printk("Err: failed in MY_SAM9X5_ledtest class. \n");
 		goto fail_create_class;
	}
 
	device_create(MY_SAM9X5_ledtest_class, NULL, MKDEV(LED_Major, 0), NULL, DEVICE_NAME);
 
	/**初始化PB18,PD21引脚**/
	at91_set_gpio_output(AT91_PIN_PB18, 1); 
	at91_set_gpio_output(AT91_PIN_PD21, 1);
	at91_set_deglitch(AT91_PIN_PB18, 1);
	at91_set_deglitch(AT91_PIN_PD21, 1);
 
	printk(DEVICE_NAME " initialized\n");
 
	return 0;
fail_create_class:
	cdev_del(&cdev);
fail_cdev_add:
	unregister_chrdev_region(devno, 1);
 
  	return -1;
}
 
/**模块的撤销函数**/
static void __exit MY_SAM9X5_ledtest_exit(void) {
 	printk("MY_SAM9X5 LED DRIVER MODULE EXIT\n");
 	device_destroy(MY_SAM9X5_ledtest_class, MKDEV(LED_Major, 0));
 	class_destroy(MY_SAM9X5_ledtest_class);
 	cdev_del(&cdev);
 	unregister_chrdev(LED_Major, DEVICE_NAME);
}
 
/**指定驱动程序的初始化函数和卸载函数**/
module_init(MY_SAM9X5_ledtest_init);
module_exit(MY_SAM9X5_ledtest_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Alvin");
MODULE_DESCRIPTION("This is an example of MY_SAM9X5_LEDTEST drivers");
MODULE_ALIAS("A simplest module.");

4.8.3 驱动程序的编译

(1)修改driver/char/目录Kconfig和Makefile文件

① Kconfig

用vi编辑器打开Kconfig文件:

$ vi drivers/char/Kconfig

在该文件最后(endmenu之前)加上如下内容:

config LEDTEST
tristate "ledtest for MYD-SAM9X5"
default n
help
this is a driver for MYD-SAM9X5

然后保存退出。

② Makefile 用vi编辑器打开Makefile文件:

$ vi drivers/char/Makefile

在该文件末尾添加如下内容:

obj-$(CONFIG_LEDTEST)           += ledtest.o

然后保存退出。

(2)将驱动配置成模块形式进行编译:

$ make ARCH=arm menuconfig

在弹出的配置表中选 Device Drivers —> Character devices —> <M> ledtest for MYD-SAM9X5,然后按下PC键盘上的M表示以模块形式编译。具体操作截图如图4-16、图4-17、图4-18所示:

图4-16



图4-17



图4-18

(3)编译驱动模块

操作如下所示:

$ touch drivers/char/ledtest.c
$ make ARCH=arm modules CROSS_COMPILE=/usr/local/arm-2010q1/bin/arm-none-linux-gnueabi-

编译完成后将在drivers/char/目录下生成驱动文件ledtest.ko。

4.8.4 将驱动加载到目标开发板

将成功编译出来的ledtest.ko文件用SD卡或U盘拷贝到开发板的相应目录下进行加载,具体操作如下所示:

(1)取消开发板上其它驱动对两个测试LED灯的触发

root@at91sam9x5ek:/$ cd /sys/class/leds/d1
root@at91sam9x5ek:/sys/class/leds/d1$ echo none > trigger
root@at91sam9x5ek:/sys/class/leds/d1$ cd ../d2
root@at91sam9x5ek:/sys/class/leds/d2$ echo none > trigger

(2)将驱动模块加载到内核

root@at91sam9x5ek:/$ cd /media/sda4/MYD-SAM9X5
root@at91sam9x5ek:/$ ls
ledtest.ko   ledtest_app
 
root@at91sam9x5ek:/$ insmod  ledtest.ko 
MYD_SAM9X5_LEDTEST DRIVER MODULE INIT
register MYD_SAM9X5_ledtest Driver OK! Major = 249
MYD-SAM9X5-ledtest initialized

至此,LED的驱动已经成功加载到内核中,在下一节我们将编写一个简单的应用程序来测试这个驱动,验证该驱动是否工作正常。

4.9 Linux上层应用开发实例

本小节讲述linux系统的上层应用程序的开发,并以一个简单的实例来讲述应用程序的开发流程和驱动程序的调用。实例实现的功能是:当运行应用程序时,可以控制开发板上的两个LED灯的亮灭,具体哪个LED灯亮或灭通过传递给应用程序的参数进行控制。

4.9.1 源码的编写

在系统上新建一个目录,然后用vi编辑器在该目录下新建一个ledtest_app.c文件或直接将编写好的文件拷到当前目录中,以下为ledtest_app.c的源码 :

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#define LED_DEV "/dev/MYS-SAM9X5-ledtest" 
 
int main(int argc, char **argv) {
	int fd, ret, led_num, led_status;
	if (argc!=3 || sscanf(argv[1],"%d", &led_num)!=1
	|| sscanf(argv[2],"%d", &led_status)!=1)
	{
		printf("\r\nPlease input correct parameters !\r\n\n");
		printf("usage:\r\n%s <led_num> <led_status>\r\n", argv[0]);
 		printf("\r\nOptions:\r\n");
		printf("  led_num\t-  1 for red led, 0 for blue led.\r\n  led_status\t-  1 for ON, 0 for OFF.\r\n\n");
		exit(1);
	}
	if((led_status!=1 && led_status!=0) || (led_num!=0 && led_num!=1))
	{
		printf("\r\nError: The parameter value must be '0' or '1' !\r\n");
		printf("\r\nPlease try again !!! !\r\n\n");
		exit(1);
	}
	fd = open(LED_DEV, 0);
	if (fd < 0)
	{
		printf("\r\nFail to open device '%s'!\r\n\n", LED_DEV);
		exit(1);
	}
 
	ret = ioctl(fd, led_status, led_num);
	if(ret < 0)
	{
		printf("\r\nFail calling ioctl !\r\n\n");
	}
	close(fd);
	return 0;
 }

4.9.2 编译

因为在这里编译的源文件只有一个,所以没有编写Makefile文件,如果要编译的源文件较多时,建议编写Makdfile文件,这样能更好地管理这些文件。

添加交叉编译工具路径到PATH中:

$ export PATH=$PATH:/usr/local/arm-2010q1/bin/

利用交叉编译工具进行编译:

$ arm-none-linux-gnueabi-gcc -o ledtest_app ledtest_app.c

执行以上操作后,如果没有出现错误,在当前目录下生成一个名为ledtest_app的可执行文件。

4.9.3 应用程序的使用

完成编译之后,将生成的可执行文件ledtest_app通过SD卡或U盘拷到开发板上,然后在终端上运行该文件。在运行应用程序的时候需要传递两个参数,该参数用于控制两个LED灯的亮灭,其中第一个参数为控制LED灯的亮灭(”0”为ON,”1”为OFF)。第二个参数为对哪个LED灯进行控制(”0”为blue led,”1”为red led),具体操作如下:

root@at91sam9x5ek:~$ /media/sda4/ledtest_app 1 0
MYD-SAM9X5-ledtest Driver Open Called!
MYD_SAM9X5_LED Driver Release Called!

执行以上操作后开发板上的蓝色的LED灯处于熄灭状态。

4.10 Qt 使用教程

本小节描述在MYD-SAM9X5上使用Qt进行GUI程序开发的方法和步骤,包括两大部分,第一部分讲述光盘中提供的Qt交叉编译工具链的使用方法,一般的Qt程序开发使用光盘中提供的Qt交叉工具链即可;第二部分讲述如何从Qt-Embedded源码中编译生成Qt交叉工具链以及相关的库文件,当光盘中提供的Qt库不能满足Qt开发程序需求时才需要自己制定Qt开发环境。

注意:这里开发板上以下载02-Images/Linux/4.3 LCD/Qt目录下的镜像为例说明,具体下载步骤请参照4.3.3 自动下载 或 4.3.4 手动下载。这里PC环境为Ubuntu 10.04。

4.10.1 使用Qt交叉编译工具链

对于一般的Qt程序开发可以直接使用光盘中提供的Qt交叉工具链,在光盘02-Images/Linux/4.3 LCD/Qt目录下的烧写镜像已经包含了该工具链对应的Qt库,所以用此工具链编译出来的Qt程序可直接在板子上运行。光盘中提供的Qt交叉工具链详细配置如下表所示:

配置项
Build libs
Debug no
Qt 3 compatibility yes
QtDBus module no
QtScriptTools module yes
QtXmlPatterns module no
Phonon module no
SVG module yes
WebKit module yes
STL support yes
PCH support yes
MMX/3DNOW/SSE/SSE2 no/no/no/no
iWMMXt support no
IPv6 support yes
IPv6 ifname support yes
getaddrinfo support yes
getifaddrs support yes
Accessibility yes
NIS support yes
CUPS support no
Iconv support no
Glib support no
GStreamer support no
Large File support yes
GIF support plugin
TIFF support plugin (qt)
JPEG support plugin (qt)
PNG support yes (qt)
MNG support plugin (qt)
zlib support yes
Session management no
Embedded support arm
Freetype2 support yes
Graphics (qt) linuxfb multiscreen linuxfb
Graphics (plugin)
Decorations (qt) styled windows default
Decorations (plugin)
Keyboard driver (qt) tty usb
Keyboard driver (plugin)
Mouse driver (qt) pc linuxtp pc linuxtp tslib
Mouse driver (plugin)
OpenGL support no
SQLite support qt (qt)
OpenSSL support no

表 4-2

(1)安装Qt交叉编译工具到系统的/usr/local/目录下

建立Qt工作目录qt-arm,拷贝Qt交叉编译工具到该目录并解压:

$ cd ~
$ mkdir qt-arm
$ cd qt-arm
$ cp /media/cdrom/05-Linux_Source/Qt_Arm/Qt-4.5.3_Tslib-1.4.tar.gz ./
$ sudo tar xvzf  Qt-4.5.3_Tslib-1.4.tar.gz -C /usr/local/

解压完成后,/usr/local目录下会多出两个目录:Qt和tslib,其中Qt 目录包含交叉编译Qt程序时用到的工具、库和头文件等;tslib目录包含触摸屏测试程序、触摸时所用到的链接库、配置文件等。

(2)设置系统环境变量

① 如果还没有将arm-none-linux-gnueabi-交叉编译器的路径添加到PATH,要先把该路径添加到PATH中,本文使用的交叉编译器路径为/usr/local/arm-2010q1/bin,则执行以下命令:

$ export PATH=$PATH:/usr/local/arm-2010q1/bin

② 设置Qt程序开发相关的环境变量

解压出来的setenv文件包含环境变量设置,只要执行以下命令就可以完成环境变量的设置:

$ source /usr/local/Qt/setenv

或者手动输入设置:

$ export PATH=$PATH:/usr/localQt/bin
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/Qt/lib

(3)烧写含Qt库的镜像

参照 4.3.3 自动下载 或 4.3.4 手动下载 来烧写光盘02-Images/Linux/4.3 LCD/Qt目录下的镜像,该目录下的镜像已经搭建好Qt运行环境,并已经包含Qt程序运行时所需的常用库文件,所支持的功能模块如表4-2所示。如果镜像所提供的功能不能满足实际需求,请参考下一小节 4.10.2 从源代码交叉编译Qt开发环境 来配置所需的功能模块。

(4)Qt应用程序的编译和运行

在光盘目录05-Linux_Source/Qt_Arm/Qt_Examples/下有几个Qt示例程序,这里以masterdetail为例说明使用Qt交叉编译工具链编译Qt应用程序的方法,并在目标板上运行。

① 拷贝示例程序到Qt工作目录qt-arm并解压:

$ cd ~/qt-arm
$ cp /media/cdrom/05-Linux_Source/Qt_Arm/Qt_Examples/masterdetail.tar.gz ./
$ tar xvzf masterdetail.tar.gz
$ cd masterdetail

② 编译Qt项目(编译之前确保Qt交叉编译工具链已正确安装并已经设置好相关的环境变量):

$ qmake
$ make

③ 执行完以上命令后,将生成的可执行文件masterdetail可以拷贝到开发板上运行:

$ ls
masterdetail
$ chmod 0777 masterdetail
$ ./masterdetail -qws

运行结果如下图所示:

图4-19

4.10.2 从源代码交叉编译Qt开发环境

本小节讲述如何从Qt-Embedded源码中编译生成Qt交叉工具链以及相关的arm-qt库。当光盘中提供的Qt库不能满足实际开发需求时可通过此方法制定Qt开发、运行环境。

Qt的源代码和Tslib的源代码都在光盘目录05-Linux_Source/Qt_Arm/Qt_Source下。

(1)建立工作目录

$ cd ~
$ mkdir qt-arm
$ cd qt-arm

(2)编译安装tslib

① 解压:

$ cp /media/cdrom/05-Linux_Source/tslib.tar.gz ./
$ tar xvzf tslib.tar.gz
$ cd tslib

② 编译安装:

如果还没有将arm-none-linux-gnueabi-交叉编译器的路径添加到PATH,要先把该路径添加到PATH中,本文使用的交叉编译器的路径为/usr/local/arm-2010q1/bin,则执行以下命令:

$ export PATH=$PATH:/usr/local/arm-2010q1/bin

先安装automake、libtool两个工具:

$ sudo apt-get install automake libtool

配置tslib,安装路径可以自己设置,这里安装到/usr/local/tslib:

$ ./autogen.sh
$ ./configure CC=arm-none-linux-gnueabi-gcc CXX=arm-none-linux-gnueabi-g++ --prefix=/usr/local/tslib --host=arm-linux ac_cv_func_malloc_0_nonnull=yes

编译安装:

$ make
$ sudo make install

(2)编译安装qt-embedded:

① 解压:

在工作目录qt-arm下执行以下命令:

$ cp /media/cdrom/05-Linux_Source/qt-embedded-linux-opensource-src-4.5.3.tar.gz ./
$ tar xvzf qt-embedded-linux-opensource-src-4.5.3.tar.gz
$ cd qt-embedded-linux-opensource-src-4.5.3

② 指定交叉编译器:

打开mkspecs/qws/linux-arm-g++/qmake.conf:

$ vi mkspecs/qws/linux-arm-g++/qmake.conf

用 vi 打开 qmake.conf 后,输入以下命令,将 arm-linux- 全部替换为 arm-none-linux-gnueabi-,然后保存退出。

%s/arm-linux-/arm-none-linux-gnueabi-/g

③ 配置Qt:

$ ./configure -prefix /usr/local/Qt -xplatform qws/linux-arm-g++ -release -opensource -qt-zlib -qt-libtiff -qt-libpng -qt-libmng -qt-libjpeg -make libs -nomake docs -embedded arm -little-endian -qt-freetype -depths 8,16,24 -qt-gfx-linuxfb -qt-kbd-usb -qt-mouse-pc -qt-mouse-linuxtp -qt-mouse-tslib -qt-sql-sqlite -qt3support -I/usr/local/tslib/include -L/usr/local/tslib/lib -confirm-license

可以执行./configure –help查看参数的详细说明,根据需要来配置合适的参数。

④ 编译安装:

$ make
$ sudo make install

⑤ 设置环境变量:

在当前终端下执行以下命令:

$ export PATH=$PATH:/usr/local/Qt/bin
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/Qt/lib

或将以上命令添加到/etc/profile文件中,这样系统登录时就自动设置好这些环境变量。

(3)移植Qt到开发板

① 拷贝库到开发板

Qt 安装完成之后,为解决符号链接的问题,可以利用先打包,然后直接解压到开发板的做法:

$ cd /usr/local/Qt/
$ tar -zcf lib.tar.gz lib

将打包好的压缩文件lib.tar.gz复制到开发板,然后解压到/usr/local/Qt:

$ mkdir -p /usr/local/Qt
$ tar xzvf lib.tar.gz -C /usr/local/Qt

② 设置开发板上的环境变量

开发板上的环境变量设置已经写到/etc/setqtenv文件中,只要在开发板上执行以下命令就可以完成环境变量的设置:

$ sourch /etc/setqtenv

或者手动输入设置:

$ export QT_QWS_FONTDIR=/usr/local/Qt/lib/fonts
$ export QWS_MOUSE_PROTO=tslib:/dev/input/ touchscreen0
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/Qt/lib

(4)Qt应用程序的编译和运行

请参考4.10.1节中的(4)Qt应用程序的编译和运行

4.11 资源下载

打印/导出
语言
本页面的其他翻译: