欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Ubuntu交叉编译tslib并移植到嵌入式Linux

程序员文章站 2022-07-14 09:38:02
...

一、交叉编译器

交叉编译器用于在Linux PC上编译嵌入式Linux平台上的项目(tslib),此处采用交叉工具链压缩包(gcc-4.4.4-glibc-2.11.1-multilib-1.0_EasyARM-iMX283.tar.bz2),在Ubuntu虚拟机上的安装配置步骤如下:

交叉编译工具链:https://cloud.189.cn/t/MRzQb2beeEFf(访问码:ph5h)

(1)安装交叉编译器

将gcc-4.4.4-glibc-2.11.1-multilib-1.0_EasyARM-iMX283.tar.bz2拷贝到Ubuntu虚拟机上,解压到指定目录(添加环境变量会使用该目录),此处目录为/home/user/tools/,在压缩包目录下打开终端,执行以下命令:

tar -jxvf gcc-4.4.4-glibc-2.11.1-multilib-1.0_EasyARM-iMX283.tar.bz2 –C /home/user/tools/

解压完成后可在gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin目录下看到交叉编译器。

(2)设置环境变量

打开全局配置文件,在终端中执行以下命令:

sudo vim /etc/profile

在文件末尾将交叉编译器所在的路径添加到全局环境变量中,需要添加的文本如下:

export PATH=$PATH:/home/user/tools/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/

执行修改过后的全局配置文件,在终端中执行以下命令(点+空格+文件名):

. /etc/profile

执行完毕后重启虚拟机,检查交叉编译器是否成功添加至全局变量,在终端中输入“arm-”,然后按下键盘上的TAB键,若添加成功,则可以看见很多“arm-fsl-linux-gnueabi”、 “arm-linux”、“arm-none-linux-gnueabi”开头的命令,如下图所示:
Ubuntu交叉编译tslib并移植到嵌入式Linux

(3)测试交叉编译器

在终端中输入交叉编译器命令,例如arm-none-linux-gnueabi-gcc,然后回车,能够得到以下信息,说明交叉编译器能够正常工作:

arm-none-linux-gnueabi-gcc
arm-none-linux-gnueabi-gcc: no input files

若输出以下信息,则交叉编译器仍然存在问题,无法正常工作:

arm-none-linux-gnueabi-gcc
bash:/home/user/tools/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-none-linux-gnueabi-gcc: 没有那个文件或目录

此时请确认:
a、在安装目录的bin文件下确实有arm-none-linux-gnueabi-gcc文件;
b、在终端输入arm-none-linux-gnueabi-,按下键盘的TAB键,能找到该命令。
如果以上两个条件都确认无误,那么问题就好解决了。这种问题主要发生在64位操作系统上,原因在于大多数交叉编译器为了适应性,通常以32位发布,而实际操作系统是64位的,存在架构差异,所以无法执行。
解决方案是在64位的Ubuntu上安装32位兼容库,在终端中执行以下命令:

sudo apt-get install lib32z1

安装完成后,再重复以上测试步骤,即可输出正常结果。

二、tslib-1.4

tslib是一个开源程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖动、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一接口。

tslib-1.4源码:https://cloud.189.cn/t/VRv2qmFfqmIz(访问码:t0ov)

此处在Ubuntu虚拟机上安装并编译tslib-1.4,再将生成的tslib文件夹整个拷贝到嵌入式Linux平台。
在Ubuntu虚拟机中安装并编译tslib-1.4的步骤如下:
(1)在Ubuntu上安装autoconf、automake和libtool,在终端中执行以下命令:

sudo apt-get install autoconf
sudo apt-get install automake
sudo apt-get install libtool

(2)将tslib-1.4.tar.gz拷贝到Ubuntu虚拟机上,解压,在压缩包目录下打开终端,执行以下命令:

sudo tar -zxvf tslib-1.4.tar.gz

(3)进入解压目录,在终端中执行以下命令(可复制到Ubuntu上再修改路径):

cd tslib-1.4
sudo ./autogen.sh
sudo ./configure --prefix=/home/user/tools/tslib --host=arm-fsl-linux-gnueabi CC=/home/user/tools/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-none-linux-gnueabi-gcc ac_cv_func_malloc_0_nonnull=yes
a、--prefix指定安装路径,可自行指定tslib的安装目录;
b、--host指定交叉编译器,此处指定交叉编译器是arm-fsl-linux-gnueabi;
c、CC指使用的交叉编译器,请与本地安装的交叉编译器路径一致。

(4)由于本文使用的Linux开发板的触摸屏驱动没有提供ioctl接口,因此需要屏蔽tslib中ioctl相关代码(若触摸屏驱动有ioctl接口,则跳过该步骤),否则在Linux开发板上运行ts_calibrate会有如下图所示的错误,屏蔽方法为修改tslib-1.4/plugins/input-raw.c文件中的check_fb函数,将该函数修改为以下代码:

static int check_fd(struct tslib_input *i)
{
	i->using_syn = 1; 
	return 0;
}

Ubuntu交叉编译tslib并移植到嵌入式Linux
5)编译tslib,在终端中执行以下命令:

sudo make

若出现如下图所示的错误,是因为Ubuntu内核比较老,相关的宏定义在内核的头文件中没有,需要在tslib库中的头文件(src/tslib.h)声明。
打开解压目录下的src/tslib.h文件,在终端中输入以下指令:

sudo vim src/tslib.h

在src/tslib.h文件中添加以下宏定义,添加完成后保存,再编译即可:

#define ABS_MT_SLOT 		0x2f    /* MT slot being modified */
#define ABS_MT_PRESSURE		0x3a    /* Pressure on contact area */
#define ABS_MT_DISTANCE		0x3b    /* Contact hover distance */
#define ABS_MT_TOOL_X		0x3c    /* Center X tool position */
#define ABS_MT_TOOL_Y		0x3d    /* Center Y tool position */

Ubuntu交叉编译tslib并移植到嵌入式Linux
(6)安装tslib到第(3)步设置的目录中(–prefix指定的安装路径),在终端中执行以下命令:

sudo make install

若可以看到该指定路径下有4个文件夹:/bin、/ect、/lib、/include,则表示安装完成。

(7)为了在移植开发板的时候,可以制定输入模块,需要修改ts.conf文件,进入安装目录下的/ect/文件夹,打开终端,打开ts.conf文件,在终端中输入以下命令:

sudo vim ts.conf

找到#module_raw input那一行,去掉注释#,并检查ts.conf文件是否有以下定义,至此在Ubuntu上安装tslib完成。

module_raw input
module pthres pmin=1
module variance delta=30
module dejitter delta=100
module linear

(8)将生成的tslib文件夹整个拷贝到嵌入式Linux平台。比如此次拷贝到/usr/local/目录中

(9)打开Linux开发板的环境变量文件/etc/profile,在终端中执行以下命令:

vi /etc/profile

(10)在/etc/profile文件文件末尾添加如下内容:

export TSLIB_ROOT=/usr/local/tslib							  /* 指定tslib目录路径 */
export TSLIB_TSDEVICE=/dev/input/event0						  /* 指定触摸屏设备 */
export TSLIB_CALIBFILE=/etc/pointercal						  /* 指定校准文件的存放位置 */
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf				  /* 指定tslib配置文件的路径 */
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts					  /* 指定tslib插件文件的路径 */
export TSLIB_FBDEVICE=/dev/fb0							  	  /* 指定帧缓冲设备 */
export QWS_MOUSE_PROTO=tslib:/dev/input/event0				  /* 指定鼠标设备 */
export LD_LIBRARY_PATH=$TSLIB_ROOT/lib:$LD_LIBRARY_PATH	  	  /* 添加tslib库 */

其中TSLIB_ROOT更改为自己实际存放的tslib的绝对路径。
TSLIB_TSDEVICE和QWS_MOUSE_PROTO这两项需要查看自己的开发板触摸屏设备对应/dev/input下的文件。例如本文采用的iMX287A开发板中的触摸屏设备文件所在路径为/dev/input/event0。

(11)重新启动Linux开发板,使系统重新读取/etc/profile的环境变量,在终端执行以下命令:

reboot

(12)进入/usr/local/tslib/bin目录,运行ts_calibrate,测试tslib是否安装和移植完成,在终端中执行以下命令:

cd /usr/local/tslib/bin
./ts_calibrate

若Linux开发板出现如下图所示的界面,则tslib安装和移植完成。
Ubuntu交叉编译tslib并移植到嵌入式Linux