版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
移植所遇到的問(wèn)題分析與總結(jié)(elephant半原創(chuàng))一:移植環(huán)境1:主機(jī)環(huán)境:RetHatEnterprise52:交叉工具鏈:開(kāi)發(fā)平臺(tái):友善之臂mini2440+統(tǒng)寶寸屏4:所需的軟件資源:(QT的移植是參考網(wǎng)上找到一篇較好的移植手冊(cè),但是此手冊(cè)的作者不知道是無(wú)心之失還是咋的,給的資料有所保留。不過(guò)思路比較清晰以及解析的比較詳細(xì),還是非常值得參考的)參照的文章鏈接地址為:二:交叉編譯在移植好觸摸屏的驅(qū)動(dòng)后(在移植內(nèi)核的時(shí)候完成),一般都要移植一個(gè)tslib來(lái)配合,在用戶層對(duì)觸摸屏的數(shù)據(jù)進(jìn)行濾波和矯正,同時(shí)也可以給應(yīng)用程序一個(gè)統(tǒng)一的接口,很多GUI都支持tslib的接口。我移植到開(kāi)發(fā)板的QT版本是QT4,所以用進(jìn)行觸摸屏校正,因?yàn)镼T4只是支持(目前最新版),QT2支持的是版本,所以在移植過(guò)程中先要看清楚自己移植的是什么版本。簡(jiǎn)單描述tslib校正觸摸屏原理:Tslib是觸摸屏驅(qū)動(dòng)和應(yīng)用層之間的適配層,它從觸摸屏驅(qū)動(dòng)處獲得原始的設(shè)備坐標(biāo)數(shù)據(jù),通過(guò)一系列的去噪、去抖、坐標(biāo)變換等操作,來(lái)去除噪聲并將原始的設(shè)備坐標(biāo)轉(zhuǎn)換為相應(yīng)的屏幕坐標(biāo)。通過(guò)tslib/src/文件可以看出,在tslib中為應(yīng)用層提供了2個(gè)主要的接口ts_open(),ts_close();ts_read()和ts_read_raw(),其中ts_read()為正常情況下的接口,ts_read_raw()為校準(zhǔn)情況下使用的接口。從tslib默認(rèn)的文件中可以看出包括如下基本插件:(強(qiáng)烈建議通讀這個(gè)配置文件并理解這個(gè)文件所寫(xiě)的內(nèi)容)??pthres為T(mén)slib提供的觸摸屏靈敏度門(mén)檻插件;??variance為T(mén)slib提供的觸摸屏濾波算法插件;??dejitter為T(mén)slib提供的觸摸屏去噪算法插件;??linear為T(mén)slib提供的觸摸屏坐標(biāo)變換插件。tslib從觸摸屏驅(qū)動(dòng)采樣到的設(shè)備坐標(biāo)進(jìn)行處理再提供給應(yīng)用端的過(guò)程大體如下:??rawdevice-->variance-->dejitter-->linear-->application
???module????????module??????module?????module
再來(lái)看看ts_calibrate主要做了哪些事情,校準(zhǔn)情況下,tslib對(duì)驅(qū)動(dòng)采樣到的數(shù)據(jù)進(jìn)行處理的一般過(guò)程如下:
??1。讀取屏上5個(gè)點(diǎn)的坐標(biāo)(TopLeft,TopRight,BottomLeft,BottomRight,Center),在進(jìn)行一系列的變換,取樣的5個(gè)點(diǎn),實(shí)際上是包含3個(gè)不同的X值,3個(gè)不同的Y值。和scaling值一共7個(gè)值,一起保存到/etc/pointercal中.(觸摸屏校準(zhǔn)文件)??2.這個(gè)/etc/pointercal文件主要是供linear插件使用。而我們每次的觸摸的操作都進(jìn)行多次觸摸坐標(biāo)變換。至此已經(jīng)找到解決問(wèn)題的大體的方法了。在校準(zhǔn)觸摸屏后只需及時(shí)的讓linear插件再次讀取新的/etc/pointeracal文件,這樣新校準(zhǔn)的坐標(biāo)信息就及時(shí)的更新到上層應(yīng)用。下面就要考慮具體實(shí)現(xiàn)的問(wèn)題了。1。從文件可以看出在該模塊初始化時(shí)讀取了/etc/pointercal文件。只要在linear_read()中讀取新的/etc/pointercal文件即可。2。校準(zhǔn)后保存了一個(gè)新的pointercal文件,但ts_lib怎么知道當(dāng)前的pointercal文件是應(yīng)該讀取的新文件。剛開(kāi)始的時(shí)候我們?cè)诘膌inear_read()函數(shù)中采取計(jì)數(shù)輪詢的方式查看/etc/poinercal文件的最后更新時(shí)間,如果當(dāng)前的更新時(shí)間大于上次更新時(shí)間,就去讀取下pointercal文件。我們暫且不說(shuō)在一臺(tái)剛下流水線的機(jī)器,它的rtc時(shí)間是不確定,再進(jìn)行時(shí)間比較時(shí)會(huì)出現(xiàn)錯(cuò)誤。另外始終的輪詢的方式和ts_lib的采樣間隔時(shí)間值很小。這樣用戶在進(jìn)行觸摸屏常按操作時(shí),會(huì)非常明顯的消耗系統(tǒng)資源。3。此時(shí)想到的辦法就是進(jìn)程通信,ts_lib是個(gè)動(dòng)態(tài)庫(kù)運(yùn)行于系統(tǒng)中,他存在系統(tǒng)中不是以進(jìn)程方式,但可以采取折衷方法,將調(diào)用ts_lib的進(jìn)程號(hào)(實(shí)際上就是X的進(jìn)程號(hào))保存到一個(gè)配置文件中。這樣在使用ts_calibrate校準(zhǔn)觸摸屏后,利用信號(hào)的方式給ts_lib發(fā)送用戶自定義信號(hào),ts_lib的中加一個(gè)簡(jiǎn)單的信號(hào)處理函數(shù)。在接受到信號(hào)后就去讀取下新的pointercal文件。正常情況下不做任何的輪詢和讀取操作。
從上說(shuō)的3個(gè)步驟中完全解決了校準(zhǔn)后應(yīng)用端觸摸及時(shí)生效的問(wèn)題。還有個(gè)次要問(wèn)題就是如何鎖屏?這需要從內(nèi)核入手了,查看內(nèi)核/drivers/input/從該驅(qū)動(dòng)提供的ioctl中看到對(duì)基于evdev的輸入設(shè)備都提供EVIOCGRAB實(shí)現(xiàn)。顧名思義,grab就是將當(dāng)前的輸入操作抓取到當(dāng)前的操作中,讓當(dāng)前操作之外的所有應(yīng)用端讀不到觸摸屏的觸摸操作。由驅(qū)動(dòng)源碼就很容易知道該如何實(shí)現(xiàn)鎖屏解鎖操作了。源碼如下:
tructtsdev*ts;
char*tsdevice="/dev/input/event0";
ts=ts_open(tsdevice,0);
intts_tmpfd=ts_fd(ts);
if(ts_tmpfd==-1)
{
???perror("ts_open");
???exit(1);
}
unsignedlongval=1;
intioctl_ret=ioctl(ts_tmpfd,EVIOCGRAB,&val);
printf("nowlockthetsioctlretis:%d\n",ioctl_ret);
if(ioctl_ret!=0)
{
???printf("Error:%s\n",strerror(errno));
???exit(1);
}
printf("lockthetssuccess\n");現(xiàn)在開(kāi)始交叉編譯tslib,在開(kāi)始編譯前需要確定自己的開(kāi)發(fā)環(huán)境是否安裝了autoconf、automake和libtool等軟件包。之前我的虛擬機(jī)并不是完全安裝,在編譯過(guò)程中出現(xiàn)很多問(wèn)題,在這里我建議大家虛擬機(jī)完全安裝。不過(guò)如果確實(shí)不想重裝系統(tǒng)的話,也可以手動(dòng)安裝,之前我自己就是手動(dòng)安裝的,雖然成功安裝了tslib軟件,但是在后續(xù)的QT移植過(guò)程中出現(xiàn)很多不可預(yù)知的錯(cuò)誤,因此還是建議大家的虛擬機(jī)是完全安裝的。可以利用命令查看自己虛擬機(jī)上的autoconf版本:autoconf–V在開(kāi)始編譯tslib前還有一個(gè)問(wèn)題需要特別注意:就是要確定在編譯時(shí)所用的工具是交叉工具鏈而不是PC平臺(tái)下的GCC工具,因?yàn)槲乙\(yùn)行的平臺(tái)是嵌入式ARM架構(gòu)而不是PC的X86架構(gòu)。關(guān)于這一點(diǎn),在網(wǎng)上找到很多資料都沒(méi)有說(shuō)明,幾經(jīng)尋找之下,終于在CSDN博客上看到網(wǎng)友yihui8的文章,對(duì)這一點(diǎn)作了說(shuō)明。(還是網(wǎng)友yihui8厚道)。網(wǎng)友yihui8博客地址(詳細(xì)解析交叉編譯):第一步:解壓源碼包:tarxvzftslib第二步:進(jìn)入tslib之后關(guān)鍵是要設(shè)置交叉編譯環(huán)境(下面是根據(jù)我自己的實(shí)際情況所添加的)——如果不設(shè)置交叉編譯環(huán)境,在移植到開(kāi)發(fā)板時(shí),執(zhí)行./ts_calibrate程序時(shí)會(huì)出現(xiàn)以下錯(cuò)誤:./ts_calibrate:line1:syntaxerror:”(”unexpected.$exportPATH=$PATH:/usr/local/arm/CC=arm-linux-gcc$exportCXX=arm-linux-g++設(shè)置好交叉編譯環(huán)境后就可以開(kāi)始安裝了:執(zhí)行./執(zhí)行./之后可能會(huì)有上述信息出現(xiàn),但是我的機(jī)器上灰常不給力,只是顯示出其中幾行信息,一開(kāi)始以為是出錯(cuò),但是最后還是移植成功,證明這步就算只出現(xiàn)幾行信息并無(wú)多大關(guān)系。接著執(zhí)行以下命令:./configure--prefix=/usr/local/tslib/--host=arm-linuxac_cv_func_malloc_0_nonnull=yes(1)有些開(kāi)發(fā)板在執(zhí)行此命令時(shí)需要添加—enableinputapi=no或者—enableinput=no,至于是哪一個(gè)就需要根據(jù)tslib目錄下的configure文件才可以知道。(建議這個(gè)文件還是看一下)。由于友善之臂mini2440的觸摸屏驅(qū)動(dòng)是支持ioctl操作的(在內(nèi)核移植時(shí)做觸摸屏驅(qū)動(dòng)時(shí)可以看到源碼中是支持ioctl的),因此我在這里并沒(méi)有加上—enableinputapi=no.(2)如果沒(méi)有加上ac_cv_func_malloc_0_nonnull=yes會(huì)出現(xiàn)交叉編譯錯(cuò)誤:undefinedreferenceto`rpl_malloc'.這是由ac_cv_func_malloc_0_nonnull檢查引起的,為了不讓它檢查,產(chǎn)生一個(gè)cache文件,欺騙configure再執(zhí)行:因此為了編譯的順利進(jìn)行,在配置的時(shí)候需要加上這一句:ac_cv_func_malloc_0_nonnull=yes最后執(zhí)行make&makeinstall就可以在指定的路徑上成功安裝tslib。我的指定路徑是/usr/local/tslib/,在這個(gè)文件下安裝成功的話會(huì)有四個(gè)目錄:lib/etc/include/bin/.安裝好tslib之后將動(dòng)態(tài)鏈接庫(kù)文件拷貝到根文件系統(tǒng)中,(注意tslib依賴的是動(dòng)態(tài)鏈接庫(kù)文件),如果忘記拷貝動(dòng)態(tài)鏈接庫(kù)的話會(huì)出現(xiàn)以下錯(cuò)誤:拷貝進(jìn)去之后需要在自己的根文件系統(tǒng)的/etc/profile(在文件的一開(kāi)始添加下面的內(nèi)容)設(shè)置tslib的環(huán)境變量(要根據(jù)自己的實(shí)際情況來(lái)設(shè)置),下面是我的開(kāi)發(fā)板所設(shè)置的有關(guān)tslib的環(huán)境變量:#?Ashprofile#vimsyntax=sh#Nocorefilesbydefaultecho"SetENVfortslib......"export?QTDIR=/usr/local/Trolltech/文件系統(tǒng)中QT的安裝目錄)exportTSLIB_ROOT=/usr/local/tslib(tslib的目錄)export?TSLIB_CONSOLEDEVICE=noneexport?TSLIB_FBDEVICE=/dev/fb0export?TSLIB_TSDEVICE=/dev/input/event0export?TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/tsexport?TSLIB_CONFFILE=$TSLIB_ROOT/etc/export?TSLIB_CALIBFILE=$TSLIB_ROOT/etc/pointercalexportPOINTERCAL_FILE=$TSLIB_ROOT/etc/pointercalexportQWS_DISPLAY=LinuxFb:dev/fb0exportsetQWS_SIZE=320x240export?QWS_MOUSE_PROTO=Tslib:/dev/input/event0
export?LD_LIBRARY_PATH=$TSLIB_ROOT/lib:$QTDIR/lib:/usr/local/lib:$LD_LIBRARY_PATHecho“theenvissuccessful”當(dāng)配置好這些環(huán)境變量后下載到開(kāi)發(fā)板,執(zhí)行./ts_calibrate時(shí)如果出現(xiàn):ts_open:Nosuchfileordirectory說(shuō)明環(huán)境變量設(shè)置有問(wèn)題,可以用env命令查看一下有沒(méi)有你剛才設(shè)置的環(huán)境變量。在設(shè)置環(huán)境變量這一個(gè)環(huán)節(jié)上是比較重要的,要保證在每一個(gè)目錄下都存在你需要用到的文件。補(bǔ)充:tslib環(huán)境變量配置說(shuō)明:在采用觸摸屏的移動(dòng)終端中,觸摸屏性能的調(diào)試是個(gè)重要問(wèn)題之一,因?yàn)殡姶旁肼暤木壒剩|摸屏容易存在點(diǎn)擊不準(zhǔn)確、有抖動(dòng)等問(wèn)題。
Tslib是一個(gè)開(kāi)源的程序,能夠?yàn)橛|摸屏驅(qū)動(dòng)獲得的采樣提供諸如濾波、去抖、校準(zhǔn)等功能,通常作為觸摸屏驅(qū)動(dòng)的適配層,為上層的應(yīng)用提供了一個(gè)統(tǒng)一的接口。在Qtopia4.*版本中,默認(rèn)的Tslib版本為T(mén)slib。在Qtopia2.*版本中,默認(rèn)的Tslib版本為T(mén)slib。在嵌入式中,由于觸摸屏的種類多樣、質(zhì)量不一,采用Tslib的參考配置往往無(wú)法獲得較好的觸摸屏觸摸效果,同樣需要經(jīng)過(guò)大量的測(cè)試才能得到滿意的配置參數(shù),惡劣情況下,甚至需要對(duì)Tslib的算法進(jìn)行進(jìn)一步的優(yōu)化。下面就Tslib的環(huán)境變量、配置文件等進(jìn)行簡(jiǎn)要的介紹。環(huán)境變量
為了實(shí)現(xiàn)Tslib的正確運(yùn)行,需要對(duì)如下的Tslib的環(huán)境變量進(jìn)行配置:TSLIB_TSDEVICEts_calibrate或./ts_test)可能出現(xiàn)的錯(cuò)誤:1:運(yùn)行./ts_testNorawmodulesloaded.ts_config:Nosuchfileordirectory出現(xiàn)這樣的錯(cuò)誤提示,可以很明確的告訴你,你的庫(kù)缺少了一些*.so文件()文件中應(yīng)該有一行(在配置文件上有很多的raw,但是全部是被注釋掉的,但是至少需要打開(kāi)一個(gè)。因?yàn)橛|摸屏是使用input子系統(tǒng)的,所以將module_rawinput前面的#號(hào)去掉,并且前面不留空格,千萬(wàn)別留空格啊,有一個(gè)網(wǎng)友就是因?yàn)檫@個(gè)小小的空格搞到他郁悶了很久,幸好我比他醒目,絕不留空格,哈哈。。。。)module_rawinput/nand1/lib/ts目錄下應(yīng)該有個(gè)文件叫
(這個(gè)文件比較重要,我第二次移植過(guò)程中不小心把input裁剪掉了,當(dāng)插件庫(kù)$TSLIB_ROOT/lib/ts目錄下沒(méi)有這個(gè)文件時(shí)會(huì)提示如下錯(cuò)誤)Norawmodulesloaded.ts_config:Nosuchfileordirectory2:在做測(cè)試的時(shí)候,運(yùn)行./ts_calibrate出現(xiàn)了經(jīng)典的錯(cuò)誤:(出現(xiàn)這個(gè)錯(cuò)誤你不要沮喪,反而應(yīng)該高興,說(shuō)明你之前的步驟已經(jīng)全部沒(méi)錯(cuò)了,只要把這個(gè)經(jīng)典的錯(cuò)誤解決就萬(wàn)事大吉了。很慶幸,這個(gè)錯(cuò)誤有很多網(wǎng)友都已經(jīng)有辦法解決了)經(jīng)典錯(cuò)誤:CouldntloadmoduleinputNorawmodulesloadedtsconfig:Success錯(cuò)誤分析:那么錯(cuò)誤就定位在ts_config里。并且可以進(jìn)一步確定是在加載插件模塊時(shí)出的錯(cuò)。閱讀了tslib的源代碼,知道了cstdlib庫(kù)里的一個(gè)函數(shù):getenv是用來(lái)得到指定系統(tǒng)環(huán)境變量的值。是為了測(cè)試tslib是否得到正確的環(huán)境變量。其環(huán)境變量默認(rèn)的值在readme中有注明。加載插件模塊時(shí)出出錯(cuò)分析:ts_calibrate會(huì)打開(kāi)ts_configts_config函數(shù)里首先會(huì)讀取tslib配置文件(,由TSLIB_CONFFILE環(huán)境變量指定,在tslib/etc下面),然后根據(jù)這個(gè)文件逐個(gè)加載插件庫(kù),版本的內(nèi)容為:Module_rawinput(讀readme文件可以找到這個(gè)字符串)modulepthrespmin=1modulevariancedelta=30moduledejtterdelta=100modulelinearts_config又會(huì)調(diào)用ts_load_module加載庫(kù)。從這個(gè)函數(shù)里,程序先是得到配置文件中指定加載的模塊名,然后根據(jù)模塊名構(gòu)造了一個(gè)so文件文件名,然后調(diào)用了系統(tǒng)函數(shù)dlopen加載庫(kù)!Linux下的加載dlopen類似于Windows下動(dòng)態(tài)鏈接庫(kù)的函數(shù):dlopen錯(cuò)誤就應(yīng)該出在構(gòu)造的庫(kù)文件名是錯(cuò)誤的---其指定的文件不存在---從而導(dǎo)致dlopen無(wú)法加載。所以才提示找不到文件或目錄!那么這樣就是應(yīng)該把需要的應(yīng)該復(fù)制到/tslib/plugins中(上面修正后作了這一步,就可以拉,就不會(huì)出現(xiàn)錯(cuò)誤拉)3:[~#]./此時(shí)會(huì)加載tslib中的插件模塊,且會(huì)拋出Segementfault的錯(cuò)誤。仔細(xì)分析tslib的源碼之后,得知在加載時(shí),中__ts_attach_raw()函數(shù)中使用NULL指針,導(dǎo)致
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度酒店管理公司股權(quán)收購(gòu)及運(yùn)營(yíng)管理合同3篇
- 2025年全球健康保險(xiǎn)合同
- 2025年二手車買賣合同解除協(xié)議
- 2025年農(nóng)山扶貧設(shè)備租賃合同
- 2025年合作政治經(jīng)濟(jì)書(shū)籍出版協(xié)議
- 二零二五版賓館住宿+SPA服務(wù)合同范本3篇
- 二零二五版家居裝修項(xiàng)目環(huán)保監(jiān)測(cè)保密合同3篇
- 2025年度化肥生產(chǎn)設(shè)備租賃合同4篇
- 導(dǎo)演與編劇2025年度合作合同2篇
- 二零二五年度媒體平臺(tái)內(nèi)容更新合作協(xié)議4篇
- 2025年下半年貴州高速公路集團(tuán)限公司統(tǒng)一公開(kāi)招聘119人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 資產(chǎn)評(píng)估服務(wù)房屋征收項(xiàng)目測(cè)繪實(shí)施方案
- 2025年經(jīng)濟(jì)形勢(shì)會(huì)議講話報(bào)告
- 北師大版小學(xué)三年級(jí)上冊(cè)數(shù)學(xué)第五單元《周長(zhǎng)》測(cè)試卷(含答案)
- 國(guó)家安全責(zé)任制落實(shí)情況報(bào)告3篇
- 2024年度順豐快遞冷鏈物流服務(wù)合同3篇
- 六年級(jí)下冊(cè)【默寫(xiě)表】(牛津上海版、深圳版)(漢譯英)
- 合同簽訂培訓(xùn)
- 電工基礎(chǔ)知識(shí)培訓(xùn)課程
- 鐵路基礎(chǔ)知識(shí)題庫(kù)單選題100道及答案解析
- 金融AI:顛覆與重塑-深化理解AI在金融行業(yè)的實(shí)踐與挑戰(zhàn)
評(píng)論
0/150
提交評(píng)論