54.5 Tslib 移植和使用 ft5426 觸摸驅動(dòng)添加成功后,發(fā)現觸摸可能不太準確,這時(shí)可以使用一個(gè)第三方開(kāi)源庫 tslib 來(lái)調試觸摸屏。下面來(lái)看一下 tslib 源碼如何移植。 54.5.1 獲取 tslib 源碼 tslib 源碼可以從官方地址獲。https://github.com/libts/tslib,打開(kāi)網(wǎng)址可以看到最新的版本是 1.21,可以從官網(wǎng)獲取,也可以從網(wǎng)盤(pán)資料中獲取,資料路徑:i.MX6UL 終結者光盤(pán)資料/06_Linux 驅動(dòng)例程/第三方庫源碼/tslib-1.21.tar.bz2。獲取到 tslib 源碼后,拷貝到 Ubuntu 系統下并解壓,得到 tslib-1.21 文件夾。 54.5.2 編譯 tslib 獲取到 tslib 源碼后,可以編譯 tslib 源碼,具體有下面幾個(gè)步驟。 1、修改 tslib 源碼所屬用戶(hù) 修改解壓得到的 tslib-1.21 目錄所屬用戶(hù)為當前用戶(hù),如果不修改可能會(huì )在稍后的編譯中會(huì )遇到各種問(wèn)題。我當前 ubuntu 的登錄用戶(hù)名為“topeet”,那么修改命令如下: sudo chown topeet:topeet tslib-1.21 -R修改后如圖 54.5.2.1 所示: ![]() 2、Ubuntu 工具安裝 編譯 tslib 的時(shí)候需要先在 ubuntu 中安裝一些文件,防止編譯 tslib 過(guò)程中出錯,命令如下所示: sudo apt-get install autoconf sudo apt-get install automake sudo apt-get install libtool 3、編譯 tslib 首先創(chuàng )建一個(gè) tslib 文件夾,用于存放編譯結果。比如文件路徑為:/home/topeet/tslib 然后使用下列命令配置并編譯 tslib: cd tslib-1.21/ //進(jìn)入 tslib 源碼目錄 ./configure --host=arm-none-linux-gnueabi --prefix=/home/topeet/tslib make //編譯 make install //安裝 注意,在使用./configure 配置 tslib 的時(shí)候“--host”參數指定編譯器,指定的編譯器要和編譯文件系統使用同一個(gè)編譯器,否則在開(kāi)發(fā)板下不能正常使用!--prefix”參數指定編譯完成以后的 tslib 文件安裝到哪里,這里肯定是安裝到我們剛剛創(chuàng )建的“tslib”目錄下。 編譯完成后 tslib 目錄如圖 54.5.2.2 所示: ![]() 然后將 tslib 目錄下的所有文件拷貝到開(kāi)發(fā)板的根文件系統下。如果直接拷貝的話(huà)會(huì )出現符號鏈接文件不能拷貝的現象,可以先使用 tar 命令進(jìn)行打包,然后解壓到根文件系統下。命令如下: tar -czvf lib.tar.gz * //打包生成 lib.tar.gz 壓縮包 tar -xvf lib.tar.gz / //解壓到開(kāi)發(fā)板根文件目錄下 54.5.3 測試 tslib 當把編譯好的 tslib 拷貝到開(kāi)發(fā)板后,進(jìn)行命令測試。 1、配置 tslib 打開(kāi)/etc/ts.conf 文件,找到下面這一行: module_raw input 如果上面這句前面有“#”的話(huà)就刪除掉“#”。 打開(kāi)/etc/profile 文件,在里面加入如下內容: 1 export TSLIB_TSDEVICE=/dev/input/event1 2 export TSLIB_CALIBFILE=/etc/pointercal 3 export TSLIB_CONFFILE=/etc/ts.conf 4 export TSLIB_PLUGINDIR=/lib/ts 5 export TSLIB_CONSOLEDEVICE=none 6 export TSLIB_FBDEVICE=/dev/fb0 第 1 行,TSLIB_TSDEVICE 表示觸摸設備文件,這里設置為/dev/input/event1,這個(gè)要根據具體情況設置,如果你的觸摸設備文件為 event2 那么就應該設置為/dev/input/event2,以此類(lèi)推。 第 2 行,TSLIB_CALIBFILE 表示校準文件,如果進(jìn)行屏幕校準的話(huà)校準結果就保存在這個(gè)文件中,這里設置校準文件為/etc/pointercal,此文件可以不存在,校準的時(shí)候會(huì )自動(dòng)生成。 第 3 行,TSLIB_CONFFILE 表示觸摸配置文件,文件為/etc/ts.conf,此文件在移植 tslib 的時(shí)候會(huì )生成。 第 4 行,TSLIB_PLUGINDIR 表示 tslib 插件目錄位置,目錄為/lib/ts。 第 5 行,TSLIB_CONSOLEDEVICE 表示控制臺設置,這里不設置,因此為 none。 第 6 行,TSLIB_FBDEVICE 表示 FB 設備,也就是屏幕,根據實(shí)際情況配置,我的屏幕文件為/dev/fb0,因此這里設置為/dev/fb0。 全部配置好以后重啟開(kāi)發(fā)板,然后就可以進(jìn)行測試了。 2、 測試 tslib 開(kāi)發(fā)板重新啟動(dòng)后,可以先進(jìn)行校準,使用下面的命令: ts_calibrate 校準完成后,會(huì )生成/etc/pointercal 文件,如果想重新校準,可以直接刪除/etc/pointercal 文件,重新執行校準命令。 然后可以使用 ts_test_mt 這個(gè)命令來(lái)測試觸摸屏工作是否正常,以及多點(diǎn)觸摸是否有效,執行如下所示命令: ts_test_mt 命令執行后會(huì )打開(kāi)一個(gè)測試界面,如圖 54.5.3.1 所示: ![]() 上圖中有三個(gè)按鈕“Drag”、“Draw”和“Quit”,這三個(gè)按鈕的功能如下: Drag:拖拽按鈕,默認就是此功能,大家可以看到屏幕中間有一個(gè)十字光標,我們可以通過(guò)觸摸屏幕來(lái)拖拽此光標。一個(gè)觸摸點(diǎn)一個(gè)十字光標,對于 5 點(diǎn)電容觸摸屏,如果 5 個(gè)手指都放到屏幕上,那么就有 5個(gè)光標,一個(gè)手指一個(gè)。 Draw:繪制按鈕,按下此按鈕我們就可以在屏幕上進(jìn)行簡(jiǎn)單的繪制,可以通過(guò)此功能檢測多點(diǎn)觸摸工作是否正常。 Quit:退出按鈕,退出 ts_test_mt 測試軟件。 54.6 使用 Linux 內核自帶的 ft5426 驅動(dòng) 在 Linux 內核中集成了許多電容觸摸芯片的驅動(dòng),其中就包括我們使用的 ft5426 的驅動(dòng)。所以我們來(lái)使用一下 Linux 內核自帶的 ft5426 驅動(dòng)文件。在使用之前需要先將前面我們添加的 ft5426.c 驅動(dòng)文件去除掉,只 需 要 修 改 drivers/input/touchscreen/Makefile 這個(gè)文件即可,將下面這一行刪除掉: obj-y += ft54266.o 內核自帶的 ft5426 的驅動(dòng)文件為 drivers/input/touchscreen/edt-ft5x06.c。 1、使能內核 ft5426 驅動(dòng)配置 要使用 Linux 內核自帶的驅動(dòng),需要添加 Linux 內核配置。首先打開(kāi)圖形化配置界面,命令如下: make ARCH=arm menuconfig 配置路徑如下: Device Drivers ---> Input device support ---> Touchscreens ---> <*> EDT FocalTech FT5x06 I2C Touchscreen support 配置如圖 所示: ![]() 配置完成后重新編譯 Linux 內核,生成 zImage 鏡像。 2、 修改設備樹(shù)文件 我們要根據 edt-ft5x06.c 文件中的 compatible 屬性修改設備樹(shù)下 ft5426 設備節點(diǎn)的 compatible 屬性值edt-ft5x06.c 所支持的 compatible 屬性列表如下所示: static const struct of_device_id edt_ft5x06_of_match[] = { { .compatible = "edt,edt-ft5206", }, { .compatible = "edt,edt-ft5306", }, { .compatible = "edt,edt-ft5406", }, { /* sentinel */ } }; 可以看出,edt-ft5x06.c 文件默認支持的 compatible 屬性只要三個(gè)“edt,edt-ft5206”、“edt,edt-ft5306”和“edt,edt-ft5406”。我們可以修改設備樹(shù)中的 ft5426 節點(diǎn),在 compatible 屬性值添加一條“edt,edt-ft5406”,或者在 edt-ft5x06.c 文件中的 edt_ft5x06_of_match 表,在里面添加一條: { .compatible = "edt,edt-ft5426", } 總之一句話(huà),讓 ft5426 這個(gè)設備和 edt-ft5x06.c 這個(gè)驅動(dòng)匹配起來(lái)。這里我們修改設備樹(shù)下的 ft5426設備節點(diǎn),修改后如下所示; 1 ft5426: ft5426@38 { 2 compatible = "edt,edt-ft5426","edt,edt-ft5406"; 3 reg = <0x38>; 4 pinctrl-names = "default"; 5 pinctrl-0 = <&pinctrl_tsc>; 6 interrupt-parent = <&gpio1>; 7 interrupts = <9 0>; 8 reset-gpios = <&gpio5 9 GPIO_ACTIVE_LOW>; 9 interrupt-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; 10 }; 在 compatible 屬性中添加"edt,edt-ft5406"兼容值。 設備樹(shù)修改完成后,重新編譯。然后使用新的 zImage 和 dtb 設備樹(shù)文件啟動(dòng)開(kāi)發(fā)板。驅動(dòng)正常的情況,有如下啟動(dòng)信息: ![]() 然后可以使用下面的命令查看 input 設備的具體情況: cat /proc/bus/input/devices 結果如圖: ![]() 然后可以使用 hexdump 或者 ts_test_mt 命令進(jìn)行測試。 ![]() ![]() |