本文记录了QT4.8图形界面在全志A40I/T3 SDK平台上的移植过程,说明过程中可能会技术瑕疵,希望大家提供宝贵意见。
本文移植的平台来自于盈鹏飞嵌入式的CoM-X40I/T3A平台(处理器分别时是全志的A40I/T3)。
以下是盈鹏飞嵌入式CoM-X40I核心模块的简要介绍:
CoM-X40I产品特性:
采用Allwinner公司Cortex-A7四核A40i处理器,运行最高速度为1.2GHZ;
支持Mali-400MP2 GPU,支持OpenGL ES 2.0 / OpenVG 1.1 standard
支持1080P视频编码,支持H.264,VP8;多格式1080P 60fps视频解码 (H.265,H.264,VC-1, MPEG-1/2/4, VP8)
支持双屏异显;支持HDMI V1.4A/RGB888/LVDS,分辨率最高1920x1080;T3处理器不支持HDMI;
支持512-2G Bytes DDR3 SDRAM;
支持EMMC 4G-64G大容量电子盘,可启动;
支持SDIO3.0,USB2.0 HOST&OTG,2路I2C,6路UART,2路SPI,2路PWM
支持双路以太网,一路10/100M;一路10/100/1000M;
可定制宽温产品,替换AM335X
稳定的操作系统的支持,可预装Android7.0或者LINUX 3.10(可预装Preempt Linux系统);
超小体积,邮票孔设计160pins, 尺寸为:45*45MM
以下是以CoM-X40I为核心板主板-SBC-X40I的功能图:
以下为基于A40I/T3 SDK平台的QT4.8移植和应用开发连载(四)内容:
4 预制tslib、qt库运行的环境变量
什么是预制?我们目前移植tslib和qt库的工作都是预制,也叫移植。因为嵌入式开发本身就是相关代码在编译主机上编译好,编译好的库在目标板上运行。现在tslib和qt4.8都已经移植好,还差其运行时的环境要配置,因为linux和windows不同,linux的库如果要被发现,都需要告诉linux系统这个库位于哪里。
4.1明确qt和tslib运行时的路径
1)盈鹏飞嵌入式A40I的SDK中,最后打包到目标板根文件系统的qt4库目录是
<SDK>/out/sun8iw11p1/linux/common/buildroot/target/usr/local/Qt-4.8.7,这个目录在主板linux运行后,Qt-4.8.7库将位于/usr/local/目录下。
2)盈鹏飞嵌入式A40I的SDK中,最后打包到目标板根文件系统的tslib1.4库目录是
<SDK>/out/sun8iw11p1/linux/common/buildroot/target/usr/local/tslib1.4,这个目录在主板linux运行后,tslib1.4库将位于/usr/local/目录下。
说明:<SDK>指的是SDK存放的根目录,根据具体情况而定。
这些库的位置可以移动到别的目录,只要在预制他们的运行环境是更改对应路径即可。
4.2预制库运行环境放到什么地方?
为了方便定制目标板的根文件系统,例如:修改linux的一些库配置文件或者增加一些文件,A40I的SDK采用的办法是修改<SDK>/buildroot-201611/target/user_rootfs_extra目录下对应内容即可。
以下是user_rootfs_extra目录的内容:
重点说明:user_rootfs_extra目录对应的是未来目标板的根文件系统的/根目录;
以下是user_rootfs_extra/etc目录的内容:
重点说明:一般运行linux的配置文件都会放到/etc目录,例如mdev.conf文件。
该目录user_rootfs_extra下所有文件在执行./build.sh脚本(在<SDK>根目录下执行的编译脚本)后都会覆盖到<SDK>/out/sun8iw11p1/linux/common/buildroot/target目录,最后打包成根文件系统。
注意:<SDK>指的是SDK存放的根目录,根据具体情况而定。
4.3buildroot编译的linux设置环境变量的几种办法
不同的linux,设置环境变量的方法可能略有不同。Buildroot编译出来的linux系统,属于精简的linux, 设置环境变量方法比较简单,也是很多linux发行版本都可以使用的办法。
环境变量的设置一般分为全局配置和临时配置。我们都知道,linux是有用户管理的,所谓全局变量,就是所有用户都有效的变量,一般这种变量会采用更改/etc/profile文件的方式来实现,或者在/etc/profile.d目录下放置运行脚本来实现,脚本会在系统初始化profile文件时被调用,具体原理可参考如下/etc/profile脚本内容(如下画红色框的部分):
临时配置一般指的是只对当前终端有效的环境变量。只要退出当前终端,那么环境变量就会失效,以下是以更改PATH路径为例,说明几种更改环境变量的办法:
1)控制台中临时更改环境变量,这种方法仅仅是临时使用,以后要使用的时候需要重新设置。
这个只针对特定的shell;
$ PATH="$PATH:/my_new_path" (关闭shell,会还原PATH)
登陆root,在家目录(root)的.bashrc文件添加新路径到PATH
export PATH=$PATH:新增路径
例如:
$ PATH="$PATH:/my_new_path" (关闭shell,会还原PATH)
export PATH="/usr/local/go/bin:$PATH" //在原先的PTATH下添加新的一个路径/usr/local/go/bin,
echo $path
export PATH="/home/work/mygo/bin:/usr/lib/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin" //如果删除就echo一下,去掉要删除的路径,从新附上原剩余的路径
2)修改/etc/profile文件,如果你的计算机仅仅作为开发使用时推荐使用这种方法,因为所有用户的shell都有权使用这些环境变量,可能会给系统带来安全性问题。 这里是针对所有的用户的,所有的shell;
$ vi /etc/profile
在里面加入:
export PATH="$PATH:/my_new_path"
使用source命令使修改立刻生效:
source /etc/profile
3)修改.bashrc文件,这种方法更为安全,它可以把使用这些环境变量的权限控制到用户级别,这里是针对某一个特定的用户,如果你需要给某个用户权限使用这些环境变量,你只需要修改其个人用户主目录下的.bashrc文件就可以了,这种办法在buildroot定制的linux中并不适用。
$ vi /root/.bashrc
在里面加入:
export PATH="$PATH:/my_new_path"
source /root/.bashrc
后两种方法一般需要重新注销系统才能生效,也可以使用source 命令,使修改的配置立刻
最后可以通过echo命令测试一下:
$ echo $PATH 输出已经是新路径了。
4.4 A40I SDK配置linux固件环境变量的方法
A40I的SDK中可以使用更改全局变量的方式-更改/etc目录下profile的方式或者把设置变量脚本放到/etc/profile.d的目录下。在以下目录<SDK>/buildroot-201611/target/user_rootfs_extra/etc下面建立相应的profile或者建立一个*.sh文件放到<SDK>/buildroot-201611/target/user_rootfs_extra/etc/profile.d文件即可。
盈鹏飞嵌入式使用了终端临时有效的脚本方式,具体文件请查看<SDK>/buildroot-201611/target/user_rootfs_extra/目录下的qt4.8.sh和qt5.9.sh。qt4.8.sh是针对qt4.8库的脚本,该文件仅供参考。
4.5 qt库运行环境的说明
使用vi指令查看该脚本内容:$vi /qt4.8.sh
export QWS_DISPLAY=LinuxFb:/dev/fb0//LCD显示设备文件
export QWS_SW_CURSOR=1 //软件鼠标的光标将一直可用
export QWS_MOUSE_PROTO="tslib:/dev/input/event1" //指定触摸屏设备
export QT_ONSCREEN_PAINT=0//将控件显示在屏幕上
export QTDIR=/usr/local/Qt-4.8.7:$QTDIR //指定qt库安装目录
export LD_LIBRARY_PATH=/usr/local/Qt-4.8.7/lib:$LD_LIBRARY_PATH //设置qt库查找路径
export QT_QWS_FONTDIR=/opt/qtenv/QT-4.8.2-arm/lib/fonts //设置字体查找路径
注意:要使qt程序支持触摸屏和鼠标,可修改/etc/ qt4.8.sh中的QWS_MOUSE_PROTO,如下所示:
1)支持触摸屏
export QWS_MOUSE_PROTO=Tslib:/dev/input/event1
2)支持鼠标
export QWS_MOUSE_PROTO=MouseMan:/dev/input/mice
3)同时支持触摸屏和鼠标
export set QWS_MOUSE_PROTO="TSLIB:/dev/input/event1 Intellimouse:/dev/input/mice"
4)支持usb键盘
export QWS_KEYBOARD=USB:/dev/input/event2
注意这个event2根据具体输入节点而定,可在主板终端输入:cat /dev/input/eventX 命令,然后按下usb键盘任意按键,查看是终端有输出而定。
4.6 tslib库的运行环境的几点说明
使用vi指令查看该脚本内容:$vi /qt4.8.sh
export T_ROOT=/usr/local/tslib1.4 //指定tslib主目录位置
export TSLIB_CONSOLEDEVICE=none//设定控制台设备为none
export TSLIB_FBDEVICE=/dev/fb0//指定帧缓冲设备
export TSLIB_TSDEVICE=/dev/input/event1//指定触摸屏设备
export TSLIB_PLUGINDIR=$T_ROOT/ts//指定触摸屏插件所在路径
export TSLIB_CONFFILE= $T_ROOT/etc/ts.conf//指定TSLIB配置文件的位置
export TSLIB_CALIBFILE=/etc/pointercal//指定触摸屏校准文件pointercal存放位置
export LD_LIBRARY_PATH=$T_ROOT /lib:$LD_LIBRARY_PATH//指定TSLIB的库文件路径
export PATH=$T_ROOT/bin:$PATH//设置环境变量:方便执行/tslib/bin/ ts_calibrate校准程序
4.7相关注意事项
已经编译好的固件中,内核配置为同时支持电阻式触摸屏和电容式触摸屏(电容式触摸是USB接口,支持multitouch协议),已经通过办法(电阻式触摸屏编译到内核,电容式触摸采用在rcS文件中插入模块)保证了它们的节点顺序,在主板上执行evtest指令查看如下:
root@T3/A40i-Embfly:~# evtest
No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0: sunxi-ths
/dev/input/event1: sunxi-keyboard
/dev/input/event2: TSC2007 Touchscreen
/dev/input/event3: axp22-powerkey
/dev/input/event4: wch.cn USB2IIC_CTP_CONTROL
Select the device event number [0-4]:
电阻式触摸屏(tsc2007控制器)设备节点为:/dev/input/event2 ;
电容式触摸屏设备节点为:/dev/input/event4。
此时,若使用电容式触摸屏,需要指定/qt4.8.sh脚本中TSLIB_TSDEVICE和QWS_MOUSE_PROTO参数为/dev/input/event4。如下所示:
export TSLIB_TSDEVICE=/dev/input/event4
export QWS_MOUSE_PROTO="tslib:/dev/input/event4"