換了個10.4寸的新屏,同樣的解析度,點起來後,觸摸完全不準。由於android系統還沒有移植tslib,所以只能在底層的驅動中把觸摸原始點上報android讀取。
底層核心版本2.6.27
首先從點擊觸控螢幕的現象來看好像是左右反了,那就先把座標值列印出來看看,點擊觸控螢幕4個頂點,結果顯示如下,
(823,20) (0,16)
(810,596) (1,601)
正確的應該是:
(0,20) (823,16)
(1,596) (810,601)
以上是觸摸座標轉換後的LCD座標,可以看出應該是X值左右反了,看下這部分的驅動:
//設定觸摸的最大範圍<br />#define TS_X_SZ800<br />#define TS_Y_SZ600</p><p>//定時器服務程式<br />static void touch_timer_fire(unsigned long data)<br />{<br />unsigned long data0;<br />unsigned long data1;<br />int updown;</p><p>#ifdef ANDROID_TS<br />int a0,a1,a2,a3,a4,a5,a6;<br />int x,y;</p><p>a0=<br />a1=<br />a2=<br />a3=<br />a4=<br />a5=<br />a6=<br />#endif</p><p>data0 = readl(ts_base+S3C_ADCDAT0);<br />data1 = readl(ts_base+S3C_ADCDAT1);</p><p>updown = (!(data0 & S3C_ADCDAT0_UPDOWN)) && (!(data1 & S3C_ADCDAT1_UPDOWN));</p><p>if (updown) {<br />if (ts->count) {</p><p>#ifdef CONFIG_TOUCHSCREEN_S3C_DEBUG<br />{<br />struct timeval tv;<br />do_gettimeofday(&tv);<br />printk(KERN_INFO "T: %06d, X: %03ld, Y: %03ld/n", (int)tv.tv_usec, ts->xp, ts->yp);//如果編譯核心的時候選上了 則會列印出這個座標<br />}<br />#endif</p><p>#ifdef ANDROID_TS<br /> x=(int) ts->xp;<br /> y=(int) ts->yp;</p><p>ts->xp = ((x - 964)*800)/(3088-964);<br />ts->yp = ((y - 1012)*600)/(2840-1012);<br />//這裡使用了這個方式來傳換成LCD座標,這裡的964/1012/3088/2840這4個值,也是LCD屏上4個頂點觸摸值,然後再根據LCD屏的4個頂點LCD座標值,建立4個4個未知數的方程即可。算出上面4個值。<br /> //ts->xp=(long) ((a2+(a0*x)+(a1*y))/a6);<br /> //ts->yp=(long) ((a5+(a3*x)+(a4*y))/a6);<br /> //printk("x=%d, y=%d/n",(int) ts->xp,(int) ts->yp);<br />//這裡還有種方式是用前面定義的7個值來轉換成LCD座標。關於a0~a6這些值的定義,網上也有很多方法,都是需要先把LCD屏上4個頂點的觸摸座標先列印出來,然後根據v<br />This implementation is a linear transformation using 7 parameters<br />(a, b, c, d, e, f and s) to transform the device coordinates (Xd, Yd)<br />into screen coordinates (Xs, Ys) using the following equations:</p><p>s*Xs = a*Xd + b*Yd + c<br />s*Ys = d*Xd + e*Yd + f<br />來計算出a0~a6這些值。這個計算用到了大1時候學的線性代數克萊姆法則哦,算起來煩!<br /> if(ts->xp!=ts->xp_old || ts->yp!=ts->yp_old)<br /> {<br /> input_report_abs(ts->dev, ABS_X, ts->xp);// /*報告X、Y的絕對座標值*/<br /> input_report_abs(ts->dev, ABS_Y, ts->yp);<br /> //input_report_abs(ts->dev, ABS_Z, 0);</p><p> input_report_key(ts->dev, BTN_TOUCH, 1);// /*報告觸控螢幕的狀態,1表明觸控螢幕被按下*/<br /> // input_report_abs(ts->dev, ABS_PRESSURE, 1);<br /> input_sync(ts->dev);//同步<br /> }<br /> ts->xp_old=ts->xp;<br /> ts->yp_old=ts->yp;<br />#else</p><p>input_report_abs(ts->dev, ABS_X, ts->xp);<br />input_report_abs(ts->dev, ABS_Y, ts->yp);</p><p>input_report_key(ts->dev, BTN_TOUCH, 1);<br />input_report_abs(ts->dev, ABS_PRESSURE, 1);<br />input_sync(ts->dev);<br />#endif<br />}</p><p>ts->xp = 0;<br />ts->yp = 0;<br />ts->count = 0;<br />//設定觸控螢幕初始以及*啟動ADC轉換*/<br />writel(S3C_ADCTSC_PULL_UP_DISABLE | AUTOPST, ts_base+S3C_ADCTSC);<br />writel(readl(ts_base+S3C_ADCCON) | S3C_ADCCON_ENABLE_START, ts_base+S3C_ADCCON);<br />}<br />else {<br />//這裡是抬起狀態了</p><p>ts->count = 0;<br />#ifdef ANDROID_TS<br />input_report_abs(ts->dev, ABS_X, ts->xp_old);<br />input_report_abs(ts->dev, ABS_Y, ts->yp_old);<br />input_report_abs(ts->dev, ABS_Z, 0);<br />#endif</p><p>input_report_key(ts->dev, BTN_TOUCH, 0);<br />#ifndef ANDROID_TS<br />input_report_abs(ts->dev, ABS_PRESSURE, 0);<br />#endif<br />input_sync(ts->dev);</p><p>writel(WAIT4INT(0), ts_base+S3C_ADCTSC);<br />}<br />}<br />
已經可以判斷出X座標左右反了,那麼只需調整下,即可
ts->xp = ((x - 964)*800)/(3088-964);這個是LCD X座標,所有只需
ts->xp = (800-((x - 964)*800)/(3088-964));就可以了
重新編譯後檢驗 可以了~僅此記錄下