本文档基于ICETEK-OMAPL138-KB-EZ开发套件,主要参考开发套件中的ICETEK-OMAPL138-KB-EZ使用手册和ICETEK-OMAPL138-KB-EZ-DS使用手册。本文档讲述在ICETEK-OMAPL138-KB-EZ开发板上建立嵌入式Linux操作系统和嵌入式QT图形用户界面开发环境的流程与相关注意事项。
一、 宿主机软件开发环境概述
操作系统:WINDOWS XP SP3、运行在虚拟机中的Linux系统Ubuntn V9.04
应用软件:虚拟机软件VirtualBox、超级终端
1. 设置超级终端
连接使用COM1,属性设定:每秒位数=115200,数据位=8,奇偶校验=无,停止位=1,数据流控制=无;退出时存储连接
2. 安装VirtualBox
3. 安装虚拟机系统Ubuntn9.04
安装NFS服务,启动NFS服务
安装TFTP服务,启动TFTP服务
4. 安装Linux开发环境
安装OMAPL138开发环境,从Ti网站下载Ti原始安装包或者使用ICETEK提供的开发包
5. 设置Linux开发环境(使用超级用户权限)
设置ip地址:修改/etc/network目录下的interfaces文件,添加需要的ip配置,重启系统
设置NFS服务:修改/etc/exports文件,把ip修改为目标机使用的网段或地址,重新启动NFS服务(/etc/init.d/目录下的portmap服务、nfs-kernel-server服务)
二、 目标机嵌入式系统的建立
系统启动需要执行的程序依次为:RBL,UBL,UBoot,Linux Kernel,Linux Filesystem。
1. UBoot的烧写
获取UBoot的源代码,使用交叉编译器环境编译ARM架构下的UBoot,在windows中通过CCS软件用Nandflash烧写程序以uboot的格式烧写到开发板的Nandflash里面。
2. Linux内核的移植
获取Linux Kernel2.6.33的源代码
在内核目录树根目录下使用make menuconfig 进行内核的配置修改
需要修改的配置参考使用手册更新版2中的修改内核部分(可以修改一项测试一项,从而确定每一项的修改是否可行及有误;也可以一次性全部修改完毕后再进行测试,但这样如果编译出错不方便查错)。
使用交叉编译器arm-none-linux-gnueabi-编译ARM架构下的Linux内核映像:make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage
编译需要动态加载的内核模块:make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- modules
安装编译好的内核模块到文件系统中
3. NFS文件系统的建立
使用NFS服务进行目标机的文件系统的挂载,加快程序的调试和修改过程。
在Linux开发环境中建议一个NFS服务的目录挂载点,把目标机的文件系统复制到该挂载点下。设置目标机的uboot启动参数:setenv bootargs ‘console=ttyS2,115200n8 noinitrd rw ip=192.168.1.3 root=/dev/nfs nfsroot=192.168.1.103:/home/realtimedsp/workdir/filesys,nolock mem=64M’;saveenv【必须制定目标机的终端ip,否则无法挂载nfs】
三、 嵌入式QT图形界面开发环境的建立
1. 修改内核配置以支持图形界面的显示(LCD)和触摸屏的操作
对内核的配置参考ICETEK-OMAPL138-KB-DS使用手册中的修改内核。(不同的开发板对内核的配置不一样,涉及相关硬件的型号等。)
2. 安装触摸屏支持库tslib
(1)介绍:tslib是一个开源程序,为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。
tslib的作用:从驱动程序处获得原始的设备坐标数据,通过一系列的去噪、去抖、坐标变换等算法操作去除触摸屏操作噪声,并将原始的设备坐标转换为相应的屏幕坐标给GUI库(如Qt)使用
(2)获取:从互联网下载tslib-1.4库
(3)安装
a 解压缩文件:tar –zxvf tslib-1.4.tar.gz
b 进入tslib目录 :cd tslib 产生配置文件:./autogen.sh
c 产生缓冲文件:echo “ac_cv_func_malloc_0_nonnull=yes”>arm-linux.cache
f 编译、安装tslib:make ;make install
在安装目录下有四个目录:bin etc include lib
g 修改配置文件:进入安装目录下cd /home/realtimedsp/workdir/filesys/opt/tslib,修改配置目录下的配置文件:gedit etc/ts.conf文件;去掉#module_raw input的注释,保存退出
h 添加脚本配置文件,以方便加载tslib库使用时需要的环境变量:在目标机文件系统的root目录下建立loadModules.sh文件,添加如下tslib库相关的环境变量:
I 把tslib/lib目录下的共享库复制到目标机的lib库目录下,使系统可以搜索到
j 在需要使用tslib的支持之前,在目标板上通过执行source loadModules.sh来配置需要的环境变量
k 在目标板上第一次使用时使用tslib/bin/ts_calibrate程序进行触摸屏的五点校对,校对文件保存在tslib安装目录的配置目录下,即tslib/etc/pointercal文件
校对完,建立etc下的链接:输入ln –s /opt/tslib/etc/pointercal /etc/pointercal
m 校对后,可以使用tslib/bin/ts_test程序进行测试
3. 嵌入式图形用户界面库QT的移植
(1) 介绍:Qt是一个跨平台应用程序框架,使用Qt,可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统中,而无需重复编写源代码。
(2) 获取:从互联网官方网站上下载或者从下面的路径中拷贝Qt/Embedded版本:\\192.1.1.156\doc\产品资料\电能质量开发板资料\QT\qt-everywhere-opensource-src-4.7.4[embedded].tar.gz
(3) 把文件包拷贝到虚拟机Ubuntn中的某个目录下,解压缩:
tar –zxvf qt-everywhere-opensource-src-4.7.4[embedded].tar.gz
(3) 复制编译配置目录,进入解压缩后的qt主目录:
cp mkspecs/qws/linux-arm-g++/ mkspecs/qws/linux-omapl138-g++/ -R
(4) 修改上面的linux-omapl138-g++配置目录下的qmake.conf配置文件,主要是修改交叉编译器和添加tslib支持,修改文件中下面的变量:
(6) 安装:make; make install,qt会安装到上面prefix选项指定的目录下面
(7) 设置一个到prefix指定路径的连接以保证以NFS运行时正常运行Qt
在使用Qt库之前,通过执行source loadModules.sh添加需要的环境变量
在执行Qt程序时,在程序名后加上-qws选项,比如./demo -qws
四、 相关的注意事项
1. 在Ubuntu9.04系统的终端中进行相关的操作,包括执行命令、脚本、修改配置文件、编译安装程序等动作时,尽量使用超级用户权限,即在命令前加上sudo,以避免一些莫名奇妙的错误或者被忽略的错误。
2. 宿主机和目标机的ip地址的设置影响着TFTP、NFS服务的正常使用,根据实际的情况进行ip地址的配置,保证宿主机中虚拟系统的ip和目标机中的ip处于同一个网段之中。
3. Qt应用程序移植的注意事项
尽量使用IDE工具(如CodeBlocks)进行开发和移植程序的构建
应用程序移植时应使用Qt-Embedded库,且与开发板上的Qt相同的版本
使用交叉编译器进行编译:arm-none-linuxe-gnueabi-gcc/g++
使用arm-none-linux-gnueabi-gcc进行连接
注意代码中的中文编码调整,在嵌入式环境中可能乱码
在嵌入式环境中执行Qt应用程序时,在程序名后面加-qws选项
4. 如果在构建的过程中所有的步骤都确定无误,但是无法得到手册中的测试结果且不明白可能的原因时,建议重新复位开发板后再进行测试。
5. 如果串口终端在加载根文件系统成功后,没有出现登录提示,则原因应该是inittab中的设置与启动参数的设置不一致:S:2345:respawn:/sbin/getty 115200 ttyS2,这行语句的作用是把控制终端定向到串口2终端,请检查最后一个参数,即串口号与bootloader中设置的bootargs参数是否一致,不一致则把它改为与bootargs中的console使用的串口号一致。
6. 内核模块编译安装的前提:/lib/modules目录中对应内核版本号的内核源码树的安装。在编译生成内核uImage镜像后,make modules以编译内核模块,然后通过export环境变量INSTALL_MOD_PATH的值来指定模块使用的内核源码树的安装路径,最后执行make modules_install命令安装模块使用内核源码树。
7. Qt图形界面库的使用:当进行嵌入式qt应用程序的开发时,必须安装完整的qt-embedded版本库【不一定要安装到开发板的文件系统上,但是建议安装到开发板的NFS文件系统上,这样利于进行程序的调试】;当产品已经开发完毕时,应该只在文件系统上保留qt应用程序运行需要的动态库(lib/),以降低文件系统的大小,有效利用存储空间,删除其它不必要的qt库组件。
一、 宿主机软件开发环境概述
操作系统:WINDOWS XP SP3、运行在虚拟机中的Linux系统Ubuntn V9.04
应用软件:虚拟机软件VirtualBox、超级终端
1. 设置超级终端
连接使用COM1,属性设定:每秒位数=115200,数据位=8,奇偶校验=无,停止位=1,数据流控制=无;退出时存储连接
2. 安装VirtualBox
3. 安装虚拟机系统Ubuntn9.04
安装NFS服务,启动NFS服务
安装TFTP服务,启动TFTP服务
4. 安装Linux开发环境
安装OMAPL138开发环境,从Ti网站下载Ti原始安装包或者使用ICETEK提供的开发包
5. 设置Linux开发环境(使用超级用户权限)
设置ip地址:修改/etc/network目录下的interfaces文件,添加需要的ip配置,重启系统
设置NFS服务:修改/etc/exports文件,把ip修改为目标机使用的网段或地址,重新启动NFS服务(/etc/init.d/目录下的portmap服务、nfs-kernel-server服务)
二、 目标机嵌入式系统的建立
系统启动需要执行的程序依次为:RBL,UBL,UBoot,Linux Kernel,Linux Filesystem。
1. UBoot的烧写
获取UBoot的源代码,使用交叉编译器环境编译ARM架构下的UBoot,在windows中通过CCS软件用Nandflash烧写程序以uboot的格式烧写到开发板的Nandflash里面。
2. Linux内核的移植
获取Linux Kernel2.6.33的源代码
在内核目录树根目录下使用make menuconfig 进行内核的配置修改
需要修改的配置参考使用手册更新版2中的修改内核部分(可以修改一项测试一项,从而确定每一项的修改是否可行及有误;也可以一次性全部修改完毕后再进行测试,但这样如果编译出错不方便查错)。
使用交叉编译器arm-none-linux-gnueabi-编译ARM架构下的Linux内核映像:make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage
编译需要动态加载的内核模块:make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- modules
安装编译好的内核模块到文件系统中
3. NFS文件系统的建立
使用NFS服务进行目标机的文件系统的挂载,加快程序的调试和修改过程。
在Linux开发环境中建议一个NFS服务的目录挂载点,把目标机的文件系统复制到该挂载点下。设置目标机的uboot启动参数:setenv bootargs ‘console=ttyS2,115200n8 noinitrd rw ip=192.168.1.3 root=/dev/nfs nfsroot=192.168.1.103:/home/realtimedsp/workdir/filesys,nolock mem=64M’;saveenv【必须制定目标机的终端ip,否则无法挂载nfs】
三、 嵌入式QT图形界面开发环境的建立
1. 修改内核配置以支持图形界面的显示(LCD)和触摸屏的操作
对内核的配置参考ICETEK-OMAPL138-KB-DS使用手册中的修改内核。(不同的开发板对内核的配置不一样,涉及相关硬件的型号等。)
2. 安装触摸屏支持库tslib
(1)介绍:tslib是一个开源程序,为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。
tslib的作用:从驱动程序处获得原始的设备坐标数据,通过一系列的去噪、去抖、坐标变换等算法操作去除触摸屏操作噪声,并将原始的设备坐标转换为相应的屏幕坐标给GUI库(如Qt)使用
(2)获取:从互联网下载tslib-1.4库
(3)安装
a 解压缩文件:tar –zxvf tslib-1.4.tar.gz
b 进入tslib目录 :cd tslib 产生配置文件:./autogen.sh
c 产生缓冲文件:echo “ac_cv_func_malloc_0_nonnull=yes”>arm-linux.cache
d 配置编译安装选项:
./configure –preifx=/home/realtimedsp/workdir/filesys/opt/tslib
–host=arm-linux –target=arm-linux CC=arm-none-linux-gnueabi-gcc
CXX=arm-none-gnueabi-g++ --with-gnu-ld –cache-file=arm-linux.cache
note:prefix选项指定tslib在目标板上的安装目录,host和target指定目标板CPU指令集和操作系统,CC和CXX指定交叉编译器
e 修改libtool文件以保证make无误:sed –I ‘s/\$echo/\$ECHO/g’ libtool
f 编译、安装tslib:make ;make install
在安装目录下有四个目录:bin etc include lib
g 修改配置文件:进入安装目录下cd /home/realtimedsp/workdir/filesys/opt/tslib,修改配置目录下的配置文件:gedit etc/ts.conf文件;去掉#module_raw input的注释,保存退出
h 添加脚本配置文件,以方便加载tslib库使用时需要的环境变量:在目标机文件系统的root目录下建立loadModules.sh文件,添加如下tslib库相关的环境变量:
#!/bin/sh
export TSLIB_ROOT=/opt/tslib
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CALIBFILE=$TSLIB_ROOT/etc/pointercal
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_CONSOLEDEVICE=/dev/tty
export TSLIB_FBDEVICE=/dev/fb0
保存退出
I 把tslib/lib目录下的共享库复制到目标机的lib库目录下,使系统可以搜索到
j 在需要使用tslib的支持之前,在目标板上通过执行source loadModules.sh来配置需要的环境变量
k 在目标板上第一次使用时使用tslib/bin/ts_calibrate程序进行触摸屏的五点校对,校对文件保存在tslib安装目录的配置目录下,即tslib/etc/pointercal文件
校对完,建立etc下的链接:输入ln –s /opt/tslib/etc/pointercal /etc/pointercal
m 校对后,可以使用tslib/bin/ts_test程序进行测试
3. 嵌入式图形用户界面库QT的移植
(1) 介绍:Qt是一个跨平台应用程序框架,使用Qt,可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统中,而无需重复编写源代码。
(2) 获取:从互联网官方网站上下载或者从下面的路径中拷贝Qt/Embedded版本:\\192.1.1.156\doc\产品资料\电能质量开发板资料\QT\qt-everywhere-opensource-src-4.7.4[embedded].tar.gz
(3) 把文件包拷贝到虚拟机Ubuntn中的某个目录下,解压缩:
tar –zxvf qt-everywhere-opensource-src-4.7.4[embedded].tar.gz
(3) 复制编译配置目录,进入解压缩后的qt主目录:
cp mkspecs/qws/linux-arm-g++/ mkspecs/qws/linux-omapl138-g++/ -R
(4) 修改上面的linux-omapl138-g++配置目录下的qmake.conf配置文件,主要是修改交叉编译器和添加tslib支持,修改文件中下面的变量:
QMAKE_CC = arm-none-linux-gnueabi-gcc
QMAKE_CXX= arm-none-linux-gnueabi-g++
QMAKE_LINK= arm-none-linux-gnueabi-g++
QMAKE_LINK_SHLIB= arm-none-linux-gnueabi-
#tslib support
QMAKE_INCDIR=/home/realtimedsp/workdir/filesys/opt/tslib/include
QMAKE_LIBDIR=/home/realtimedsp/workdir/filesys/opt/tslib/lib
QMAKE_LFLAGS += -Wl, -rpath-link=/home/realtimedsp/workdir/filesys/opt/tslib/lib
QMAKE_AR= arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY=arm-none-linux-gnueabi-objcopy
QMAKE_STRIP= arm-none-linux-gnueabi-strip
(5) 产生编译脚本,回到解压缩的qt主目录下:
./configure –prefix /home/realtimedsp/workdir/filesys/opt/qt-embedded –embedded arm –platform /qws/linux-x86-g++ -xplatform /qws/linux-omapl138-g++ -depths 16,24,32 –no-cups –no-largefile –no-accessibility –no-openssl –qt-mouse-pc –qt-mouse-linuxtp –qt-mouse-linuxinput –plugin-mouse-linuxtp –plugin-mouse-pc –fast –qt-mouse-tslib
选择评估板进行安装,输入yes接收许可证条款。
(6) 安装:make; make install,qt会安装到上面prefix选项指定的目录下面
(7) 设置一个到prefix指定路径的连接以保证以NFS运行时正常运行Qt
cd /home/realtimedsp/workdir/filesys/home
sudo mkdir –p realtimedsp/workdir/filesys/opt
cd realtimedsp/workdir/filesys/opt
sudo ln –s /opt/qt-embedded qt-embedded
(8) 设定Qt使用的需要的环境变量,把下面变量添加到loadModules.sh配置文件中:
export QWS_MOUSE_PORTO=tslib:/dev/input/event0
export QWS_DISPLAY=LinuxFb:/dev/fb0
export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:/opt/qt-embedded/lib
保存退出
在使用Qt库之前,通过执行source loadModules.sh添加需要的环境变量
在执行Qt程序时,在程序名后加上-qws选项,比如./demo -qws
四、 相关的注意事项
1. 在Ubuntu9.04系统的终端中进行相关的操作,包括执行命令、脚本、修改配置文件、编译安装程序等动作时,尽量使用超级用户权限,即在命令前加上sudo,以避免一些莫名奇妙的错误或者被忽略的错误。
2. 宿主机和目标机的ip地址的设置影响着TFTP、NFS服务的正常使用,根据实际的情况进行ip地址的配置,保证宿主机中虚拟系统的ip和目标机中的ip处于同一个网段之中。
3. Qt应用程序移植的注意事项
尽量使用IDE工具(如CodeBlocks)进行开发和移植程序的构建
应用程序移植时应使用Qt-Embedded库,且与开发板上的Qt相同的版本
使用交叉编译器进行编译:arm-none-linuxe-gnueabi-gcc/g++
使用arm-none-linux-gnueabi-gcc进行连接
注意代码中的中文编码调整,在嵌入式环境中可能乱码
在嵌入式环境中执行Qt应用程序时,在程序名后面加-qws选项
4. 如果在构建的过程中所有的步骤都确定无误,但是无法得到手册中的测试结果且不明白可能的原因时,建议重新复位开发板后再进行测试。
5. 如果串口终端在加载根文件系统成功后,没有出现登录提示,则原因应该是inittab中的设置与启动参数的设置不一致:S:2345:respawn:/sbin/getty 115200 ttyS2,这行语句的作用是把控制终端定向到串口2终端,请检查最后一个参数,即串口号与bootloader中设置的bootargs参数是否一致,不一致则把它改为与bootargs中的console使用的串口号一致。
6. 内核模块编译安装的前提:/lib/modules目录中对应内核版本号的内核源码树的安装。在编译生成内核uImage镜像后,make modules以编译内核模块,然后通过export环境变量INSTALL_MOD_PATH的值来指定模块使用的内核源码树的安装路径,最后执行make modules_install命令安装模块使用内核源码树。
7. Qt图形界面库的使用:当进行嵌入式qt应用程序的开发时,必须安装完整的qt-embedded版本库【不一定要安装到开发板的文件系统上,但是建议安装到开发板的NFS文件系统上,这样利于进行程序的调试】;当产品已经开发完毕时,应该只在文件系统上保留qt应用程序运行需要的动态库(lib/),以降低文件系统的大小,有效利用存储空间,删除其它不必要的qt库组件。
来源:oschina
链接:https://my.oschina.net/u/195885/blog/122729