PIXNET Logo登入

立你斯學習記錄

跳到主文

歡迎光臨 立你斯 在痞客邦的小天地..這裡主要轉貼我工作上有遇過的問題或看過的查過的資料....盡量轉成正體..留存

部落格全站分類:數位生活

  • 相簿
  • 部落格
  • 留言
  • 名片
  • 12月 13 週二 201113:55
  • TsLib的重要模块

http://hi.baidu.com/dos2004/blog/item/ce330bde7fd3f45294ee37a2.html
【转】Tslib主要滤波算法分析 Tslib解析
Author:Jiujin.hong
转载请说明出处:http://blog.csdn.net/hongjiujing or www.linuxforum.net嵌入式linux版块
tslib背景:
在采用触摸屏的移动终端中,触摸屏性能的调试是个重要问题之一,因为电磁噪声的缘故,触摸屏容易存在点击不准确、有抖动等问题。
Tslib是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。
tslib插件:
pthres 为Tslib 提供的触摸屏灵敏度门槛插件;variance 为Tslib 提供的触摸屏滤波算法插件;dejitter 为Tslib 提供的触摸屏去噪算法插件;linear 为Tslib 提供的触摸屏坐标变换插
件。
触摸屏驱动为与硬件直接接触部分,为上层的Tslib 提供最原始的设备坐标数据,并可以配置采样间隔、屏幕灵敏度等。采样间隔决定了单位时间内的采样数量,在其他参数不变的
情况下,采样间隔越小意味着单位时间内的采样数量越多,也就意味着采样越逼真、越不容易出现采样信息丢失如输入法书写时丢笔划的情况,但因为噪声的影响,采样间隔越小同时
也意味着显示出来的图形的效果越差。
Tslib 为触摸屏驱动和应用层之间的适配层,其从驱动处获得原始的设备坐标数据,通过一系列的去噪、去抖、坐标变换等操作,来去除噪声并将原始的设备坐标转换为相应的屏幕
坐标。
tslib接口:
在tslib 中为应用层提供了2 个主要的接口ts_read()和ts_read_raw(),其中ts_read()为正常情况下的借口,ts_read_raw()为校准情况下的接口。
正常情况下,tslib 对驱动采样到的设备坐标进行处理的一般过程如下:
raw device --> variance --> dejitter --> linear --> application
module module module
校准情况下,tslib 对驱动采样到的数据进行处理的一般过程如下:
raw device--> Calibrate
由于各种相关期间的影响,在不同的硬件平台上,相关参数可能需要调整。以上参数的相互关系为:采样间隔越大,采样点越少,采样越失真,但因为信息量少,容易出现丢笔划
等丢失信息情况,但表现出来的图形效果将会越好;去噪算法跟采样间隔应密切互动,采样间隔越大,去噪约束应越小,反之采样间隔越小,去噪约束应越大。去抖算法为相对独立的
部分,去抖算法越复杂,带来的计算量将会变大,系统负载将会变重,但良好的去抖算法可以更好的去除抖动,在进行图形绘制时将会得到更好的效果;灵敏度和ts 门槛值为触摸屏的
灵敏指标,一般不需要进行变动,参考参考值即可。
过滤插件分析:
Variance:触摸屏滤波算法
问题:一些触摸屏取样非常粗略,因此,即使你持着笔不放,样本可能不同,有时会大幅增加。最坏的情况是由于采样的时候电噪声的干扰,可大大脱离现实笔的位置不同,这会导致鼠标光标移动“跳”起来,然后返回回来。
解 决方法:延迟一个时隙采样数据。如果我们看到最后采样读出来的数据太多的不同,我们将其标示为“可疑”。如果下一个采样读取的数据接近“可疑” 情况出现之前的数据,“可疑”数据将被丢弃。否则我们认为笔正在进行一个快速的笔移动动作,“可疑”数据的采样和出现”可疑”数据之后的采样都将通过。
重要算法分析:
static int variance_read(struct tslib_module_info *info, struct ts_sample *samp, int nr)
{
struct tslib_variance *var = (struct tslib_variance *)info;
struct ts_sample cur;
int count = 0, dist;
while (count < nr) {
如果采样数据被标记为“提交噪音”状态,将当前采样数据相关结构体赋予噪音状态,将清除标志位。
if (var->flags & VAR_SUBMITNOISE) {
cur = var->noise;
var->flags &= ~VAR_SUBMITNOISE;
} else {
如果如果采样数据没有被标记为“提交噪音”,继续采样数据。
if (info->next->ops->read(info->next, &cur, 1) < 1)
return count;
}
如果当前没有压力值,处于没有笔触摸或者笔释放状态,但是却收到笔按下消息,表明为收到噪音干扰,
所有当笔一释放就立即清除队列,否则之前的层将捕抓到笔起来的消息,但是已经太晚,如果
info->next->ops->read()出现堵塞,将出现这种情况。
if (cur.pressure == 0) {
/* Flush the queue immediately when the pen is just
* released, otherwise the previous layer will
* get the pen up notification too late. This
* will happen if info->next->ops->read() blocks.
*/
if (var->flags & VAR_PENDOWN) {
var->flags |= VAR_SUBMITNOISE;
var->noise = cur;
}
/* Reset the state machine on pen up events. */
复位笔起来事件状态标记位
var->flags &= ~(VAR_PENDOWN | VAR_NOISEVALID | VAR_LASTVALID);
goto acceptsample;通知接受采样数据
} else
var->flags |= VAR_PENDOWN;通知笔按下
如果标记位与“VAR_LASTVALID"状态不同,进行下一个采样。
if (!(var->flags & VAR_LASTVALID)) {
var->last = cur;
var->flags |= VAR_LASTVALID;
continue;
}
如果为笔按下事件
if (var->flags & VAR_PEN DOWN) {
/* Compute the distance between last sample and current */
计算上一次的采样数据与当前采样数据的距离
dist = sqr (cur.x - var->last.x) +
sqr (cur.y - var->last.y);
if (dist > var->delta) {如果误差大于默认值,比如30。
视之前的采样为噪音?可疑?
/* Do we suspect the previous sample was a noise? */
if (var->flags & VAR_NOISEVALID) {
但是如果之前的采样已经是可疑状态,视为快速的笔移动触发动作。
/* Two "noises": it's just a quick pen movement */
samp [count++] = var->last = var->noise;
var->flags = (var->flags & ~VAR_NOISEVALID) |
VAR_SUBMITNOISE;
} else
如果之前的采样并不是可疑状态,视为可疑状态.
var->flags |= VAR_NOISEVALID;
/* The pen jumped too far, maybe it's a noise ... */
var->noise = cur;
continue;
} else
var->flags &= ~VAR_NOISEVALID;采样的数据属于正常数据.
}
acceptsample:
#ifdef DEBUG
fprintf(stderr,"VARIANCE----------------> %d %d %d\n",
var->last.x, var->last.y, var->last.pressure);
#endif
samp [count++] = var->last;
var->last = cur;
}
return count;
}
dejitter 去噪插件分析:
问题:一些触摸屏从ADC获取X/Y坐标采样值,他们的最低位带有很大的噪音干扰,这就导致了触摸屏输出值的抖动。
比如我们保持着按某一点,我们会得到许多的X/Y坐标采样,他们相近但是不相等。同时如果我们试图在一个画图程序里面去画一个直线,
我们将得到一个充满“毛刺“的直线。
解决:我们对最后几个值应用一个重量平滑滤波,从而去除输出“毛刺”。我们发现坐标发生重大变化,我们会重新设置笔位置的积压,从而
避免平滑不应该要平滑的坐标。当然,这些都是假设所有噪音都已经由底端过滤器滤波过了,例如variance模块。
工作原理:
该过滤器的工作原理如下:我们掌握最新的N样本轨道,我们不断跟踪最新的N个采样,根据一定的重量求平均。最旧的数据有最少的重量,最近的数据
有最大的重量。这有助于消除抖动,同时不影响响应时间,因为我们为每一个输入采样输出一个输出样本,笔移动会变得更加顺畅。
重要算法分析:
为了让事情简单(避免误差),我们确保SUM(重量)=2次方。同时当我们有不到默认采样数量的时候,我们必须知道怎么去近似测试。
static const unsigned char weight [NR_SAMPHISTLEN - 1][NR_SAMPHISTLEN + 1] =
{
/* The last element is pow2(SUM(0..3)) */
{ 5, 3, 0, 0, 3 }, /* When we have 2 samples ... */
{ 8, 5, 3, 0, 4 }, /* When we have 3 samples ... */
{ 6, 4, 3, 3, 4 }, /* When we have 4 samples ... */
};
static void average (struct tslib_dejitter *djt, struct ts_sample *samp)
{
const unsigned char *w;
int sn = djt->head;
int i, x = 0, y = 0;
unsigned int p = 0;
w = weight [djt->nr - 2];找出与重量数组相对应的数据,例如如果是第一次采样就没有,如果是第二次采样,就对应{ 5, 3, 0, 0, 3 },依此类推。
for (i = 0; i < djt->nr; i++) {
x += djt->hist [sn].x * w [i];
y += djt->hist [sn].y * w [i];
p += djt->hist [sn].p * w [i];
sn = (sn - 1) & (NR_SAMPHISTLEN - 1);记录每一次采样的序号
}
samp->x = x >> w [NR_SAMPHISTLEN];求出平均值
samp->y = y >> w [NR_SAMPHISTLEN];
samp->pressure = p >> w [NR_SAMPHISTLEN];
#ifdef DEBUG
fprintf(stderr,"DEJITTER----------------> %d %d %d\n",
samp->x, samp->y, samp->pressure);
#endif
}
static int dejitter_read(struct tslib_module_info *info, struct ts_sample *samp, int nr)
{
struct tslib_dejitter *djt = (struct tslib_dejitter *)info;
struct ts_sample *s;
int count = 0, ret;
ret = info->next->ops->read(info->next, samp, nr);
for (s = samp; ret > 0; s++, ret--) {
if (s->pressure == 0) {
/*
* Pen was released. Reset the state and 如果笔释放,复位状态标准,同时丢弃所有历史事件。
* forget all history events.
*/
djt->nr = 0;
samp [count++] = *s;
continue;
}
/* If the pen moves too fast, reset the backlog. */ 如果笔移动太快,复位积压
if (djt->nr) {
int prev = (djt->head - 1) & (NR_SAMPHISTLEN - 1);
if (sqr (s->x - djt->hist [prev].x) +
sqr (s->y - djt->hist [prev].y) > djt->delta) { 如果之前的x的平方距离值与之前的y的平方距离值加入门槛值,提示超过门槛值,丢弃,复位。
#ifdef DEBUG
fprintf (stderr, "DEJITTER: pen movement exceeds threshold\n");
#endif
djt->nr = 0;
}
}
djt->hist[djt->head].x = s->x;
djt->hist[djt->head].y = s->y;
djt->hist[djt->head].p = s->pressure;
if (djt->nr < NR_SAMPHISTLEN) 如果采样数小于默认采样数,继续执行
djt->nr++;
/* We'll pass through the very first sample since
* we can't average it (no history yet).
*/
if (djt->nr == 1) 如果这是第一次采样,没有历史或者旧采样数据,直接赋值。
samp [count] = *s;
else { 如果不是第一次采样,就执行平均函数,求得经过平均后的采样值。
average (djt, samp + count);
samp [count].tv = s->tv;
}
count++;
djt->head = (djt->head + 1) & (NR_SAMPHISTLEN - 1);记录采样的序号
}
return count;
}
总结:经过分析varience滤波模块插件和dejitter去抖模块插件,我们知道如下:
1:varience是最低层滤波插件,方差滤波器,试图做得最好,过滤掉由ADC采样过来的随机噪音,通过限制某些采样的运动速度,例如:
笔不应该比一些门槛值快一些。
主要参数:门槛值delta
求出之前的采样点和当前的采样点的平方距离(X2-X1)^2 + (Y2-Y1)^2),用来确定两个样本是“近”还是“远”。如果以前和目前的样本之间的距离是'远',
样品被标记为'潜在噪音'或者“可疑“,但这并不意味着它将被丢弃。如果下次的采样接近于它,我们将视是一次普通的快速移动动作。同时如果“潜在噪音"之后的采样比之前讨论的
采样都“远”,也将认为出现了一次普通的快速移动动作。如果出现“潜在噪音”之后的采样和出现“潜在噪音“之前的采样相近,我们将丢弃”潜在噪音 “这次数据,认为它为要过滤的噪音。
2:dejitter去抖模块插件
去除X/Y坐标的抖动,这是通过使用一个加权平滑滤波器实现的。最近的采样有最重的重量,早期的采样有重量轻的重量,这使得实现1:1的输入-输出速率。
主要参数:门槛值delta
两个采样之间的平方距离,(X2-X1)^2 + (Y2-Y1)^2),即定义了'快速运动'的门槛。如果笔移动快,平滑笔的动作是不合适的,另外,快速运动任何时候都不是准确的。所以如果检测到了快速运动,
该过滤模块只是简单地丢弃积压和复制输入到输出。
(繼續閱讀...)
文章標籤

立你斯 發表在 痞客邦 留言(0) 人氣(90)

  • 個人分類:tslib
▲top
  • 7月 05 週二 201111:35
  • 分析calibrate_delay過程


 
在啟動過程中,內核會計算處理器在一個jiffy時間內運行一個內部的延遲循環的次數。jiffy的含義是系統定時器 2個連續的節拍之間的間隔。正如所料,該計算必須被校準到所用CPU的處理速度。校準的結果被存儲在稱為loops_per_jiffy的內核變量中。使用loops_per_jiffy的一種情況是某設備驅動程序希望進行小的微秒級別的延遲的時候。
為了理解延遲—循環校​​準代碼,讓我們看一下定義於init/calibrate.c文件中的calibrate_ delay()函數。該函數靈活地使用整型運算得到了浮點的精度。如下的代碼片段(有一些註釋)顯示了該函數的開始部分,這部分用於得到一個loops_per_jiffy的粗略值
1 #define LPS_PREC 8    
  //定義計算BogoMIPS的精度,這個值越大,則計算出的BogoMIPS越精確。
2 void __init calibrate_delay(void)
3 {
4 unsigned long ticks,loopbit;
5 int lps_precision=LPS_PREC
6
7 loops_per_sec=(1<<12);
  //loops_per_sec為每秒鐘執行一個極短的循環的次數。
8
9 printk(「Calibrating delay loop…」); 
10 while(loops_per_sec<<=1) {
  //第10至21行,是第一次計算loops_per_sec的值,這次計算只是一個粗略的計算,為下面的計算打好基礎。
11 /* wait for 「start of」 clock tick */
   /*第11 至16行,是用於等待一個新的定時器滴答(它大概是百萬分之一秒)的開始。
   可以想像我們要計算loops_per_sec的值,可以在一個滴答的開始時,立即重複執行一個極短的循環,
   當一個滴答結束時,這個循環執行了多少次就是我們要求的初步的值,再用它乘以一秒鐘內的滴答數就是loops_per_sec的值。
   */
12 ticks=jiffies;
12 系統用jiffies全局變量記錄了從系統開始工作到現在為止,所經過的滴答數。它會被內核自動更
   新。這行語句用於記錄當前滴答數到tick變量中。
13 while(ticks==jiffies)
13 注意這是一個沒有循環體得空循環,第14行僅有一個「;」號。這條循環語句是通過判斷tick的
   值與jiffies的值是否不同,來判斷jiffies是否變化,即是否一個新的滴答開始了
14 /* nothing */;
15 /* Go… */
16 ticks=jiffies;
16 記錄下新的滴答數以備後用。
17 __delay(loops_per_sec);
17 根據loops_per_sec值進行延時(及執行loop_per_sec次極短循環)。
18 ticks=jiffies-ticks;
18 以下三行用於判斷執行的延時是否超過一個滴答。一般loops_per_sec的初始值並不大,
   所以循環會逐步加大loops_per_sec的值,直到延時超過一個滴答。我們可以看出,前
   一次loops_per_sec的值還因太小不合適時,經過一次增大,它提高了兩倍,滿足了循環
   條件,跳出循環,而這個值實在是誤差太大,所以我們還要經過第二次計算。這裡還要注
   意的是通過上面的分析,我們可以知道更加精確的loops_per_sec的值應該在現在的值與它的
   一半之間。
19 if(ticks)
20 break;
21 }
22
23 /* Do a binary approximation to get loops_per_second set
24 * to equal one clock (up to lps_precision bits) */
23 這裡開始就是第二次計算了。它用折半查找法在我們上面所說的範圍內計算出了更精確的loops_per_sec的值。
25 loops_per_sec >>=1;
25 義查找範圍的最小值,我把它稱為起點。
26 loopbit=loop_per_sec;
26 定義查找範圍,這樣我們就可以看到loop_per_sec的值在「起點」與「起點加範圍(終點)」之間。
27 while(lps_precision-- && (loopbit >>=1) ) {
27 進入循環,將查找範圍減半。
28 loops_per_sec |= loopbit;
28 重新定義起點,起點在「原起點加27行減半範圍」處,即新起點在原先起點與終點的中間。這時我們可以
   看出loops_per_sec在「新起點」與「新起點加減半範圍(新終點)」之間。
29 ticks=jiffies;
29 第29至32行與第12至17行一致,都是等待新的滴答,執行延時。
30 while(ticks==jiffies);
31 ticks=jiffies;
32 __delay(loops_per_sec);
33 if(jiffies!=ticks) /* longer than 1 tick */
33 如果延時過短,說明loops_per_sec的值小了,將會跳過這部分,再次進入循環。它將是通過不斷的折
   半方式來增大。如果延時過長,說明loops_per_sec的值大了,將起點重新返回原起點,當再次進入循環,
   由於範圍減半,故可以達到減小的效果。
34 loops_per_sec &=~loopbit;
35 }
36 /* finally,adjust loops per second in terms of seconds
37 * instead of clocks */
38 loops_per_sec *= HZ;
38 計算出每秒執行極短循環的次數。從這裡我們可以看出它好像是個死循環,所以加入了lps_precision變量
   ,來控制循環,即LPS_PREC越大,循環次數越多,越精確。可能這些不太好懂,總的說來,它首先將loop_per_sec
   的值定為原估算值的1/2,作為起點值(我這樣稱呼它),以估算值為終點值.然後找出起點值到終點值的中間值.用上面
   相同的方法執行一段時間的延時循環.如果延時超過了一個tick,說明loop_per_sec值偏大,則仍以原起點值為起點值,
   以原中間值為終點值,以起點值和終點值的中間為中間值繼續進行查找,如果沒有超過一個tick,說明loop_per_sec偏
   小,則以原中間值為起點值,以原終點值為終點值繼續查找。
(繼續閱讀...)
文章標籤

立你斯 發表在 痞客邦 留言(0) 人氣(251)

  • 個人分類:tslib
▲top
  • 6月 28 週二 201117:28
  • fw_printenv-control u-boot enviroment variables under linux

http://daydreamer.idv.tw/rewrite.php/read-60.html
u-boot可以設定的環境變數,例如tftp server ip, eth ip…等,如果要在進入linux後還能隨意操縱這些enviroment variable,就必需藉由fw_printenv這個小程式,這支小程式能顯示和設定u-boot的環境變數
因為小弟的板子是nand flash,所以我下載目前最新的u-boot,並試著用make env指令把fw_printenv編出來(最新板的fw_printenv可以自動切換nand與nor flash的操作方式)

(繼續閱讀...)
文章標籤

立你斯 發表在 痞客邦 留言(0) 人氣(796)

  • 個人分類:tslib
▲top
  • 3月 10 週四 201116:35
  • 查看/dev/input/eventX是什麼類型的事件, cat /proc/bus/input/devices

查看/dev/input/eventX是什麼類型的事件, cat /proc/bus/input/devices
 設備有著自己特殊的按鍵鍵碼,我需要將一些標準的按鍵,比如0-9,X-Z等模擬成標準按鍵,比如KEY_0,KEY-Z等,所以需要用到按鍵模擬,具體方法就是操作/dev/input/event1文件,向它寫入個input_event結構體就可以模擬按鍵的輸入了。
linux/input.h中有定義,這個文件還定義了標準按鍵的編碼等
struct input_event {
    struct timeval time; //按鍵時間
    __u16 type; //類型,在下面有定義
    __u16 code; //要模擬成什麼按鍵
    __s32 value;//是按下還是釋放
};
(繼續閱讀...)
文章標籤

立你斯 發表在 痞客邦 留言(0) 人氣(7,532)

  • 個人分類:tslib
▲top
  • 2月 09 週三 201119:26
  • touch 校正原理

触摸屏校正原理


(1)觸摸屏為什麼需要校正?
    觸摸屏與LCD顯示屏是兩個不同的物理器件。 LCD處理的像素,例如我們通常所說的分辨率是600x800,實際就是指每行 的寬度是600個像素,高度是800個像素,而觸摸屏處理的數據是點的物理坐標,該坐標是通過觸摸屏控制器採集到的。兩者之間需要一定的轉換。
(繼續閱讀...)
文章標籤

立你斯 發表在 痞客邦 留言(0) 人氣(1,178)

  • 個人分類:tslib
▲top
  • 2月 09 週三 201119:19
  • tslib 分析

tslib ,其實從他的名字就可以看出它的,它是 touchscreen 的 lib, 其實這樣還不夠具體,其實它開始確實是為了 touchscreen 的鼠標驅動而發展起來的,且只是一個中間處理庫,即將原始數據進行調整,比如觸摸屏定位。 只不過後來不知道什麼原因,它火了,其他圖形都支持這種方式,像高級版本的 minigui , qt 等成熟嵌入式圖形系統。 正因為如此,它也就不再局限於 touchsrceen, 只要是輸入設備,只需在 tslib 裡實現,標準的圖形系統只需調用 tslib 的函數即可。
    剛開始時,我曾認為 tslib 屬於驅動層,它將其他的輸入設備數據處理後成為一個虛擬設備的數據,其他的圖形系統只需使用這個虛擬的設備即可實現輸入設備的讀寫操作了。 後來發現 tslib 只不過是一個應用程軟件,其他的圖形系統使用的是 tslib 的函數,因此需要依賴這個庫 . 如果大家移植過 qt, 估計還記得 -no-mouse-linuxtp -qt-mouse-tslib - I/mnt/nfs/tslib/include -L/mnt/nfs/tslib/lib
其實這裡就是用到 tslib 的庫及頭文件。
   下面說一下 ,tslib 的原理。
  首先來看下 tslib 的源碼結構
.
(繼續閱讀...)
文章標籤

立你斯 發表在 痞客邦 留言(0) 人氣(1,329)

  • 個人分類:tslib
▲top
  • 1月 28 週五 201115:15
  • tslib 1.4 在ARM板上移植


1.首先從網上下載的tslib-1.4.tar.gz
2.解壓tar xvzf tslib-1.4.tar.gz ; cd tslib
3.生成configure,這裡比一般的開源項目少做一步,要先運行解壓目錄下的腳本
  ./autogen.sh
4.用configure 生成Makefile.
(繼續閱讀...)
文章標籤

立你斯 發表在 痞客邦 留言(0) 人氣(723)

  • 個人分類:tslib
▲top
  • 1月 27 週四 201117:19
  • linux的觸摸屏之一:原理及APK調試

(1)原理:本文拋開技術層次上來說說LINUX觸摸屏設備驅動原理。 觸摸屏,就是用一塊AD轉換模塊來將屏幕上的觸摸信號轉成數字信號。 觸摸屏常用的是四線電阻,當觸摸時候,功能模塊會將模擬信號轉換成數字信號,就是通常說的AD轉換。 在LINUX中,通常是通過中斷來讀取這些數字的。 觸摸屏幕的時候,中斷發生,LINUX通過串口或者I2C,SPI或者內部數據通道等去讀取轉換後的數字,然後把數值傳給INPUT層。
      為什麼要校驗? 原因A,觸摸屏與LCD顯示屏是兩個不同的物理器件。 LCD處理的像素,例如我們通常所說的分辨率是600x800,實際就是指每行的寬度是600個像素,高度是800個像素,而觸摸屏處理的數據是點的物理坐標,該坐標是通過觸摸屏控制器採集到的。 兩者之間需要一定的轉換。 B,其次在安裝觸摸屏時,不可避免的存在著一定的誤差,如旋轉,平移的,這同樣需要校正解決。 C,再次,電阻式觸摸屏的材料本身有差異而且隨著時間的推移,其參數也會有所變化,因此需要經常性的校正(電容式觸摸屏只需要一次校正即可)。
                                   
      比較常用的校驗程序是TSLIB。 通過TSLIB校驗後,應用程序讀取TSLIB裡的數值,這個時候就能準確定位了。 校正原理:觸摸屏的校正過程一般為:依次在屏幕的幾個不同位置顯示某種標記(如"+"),用觸摸筆點擊這些標記,完成校正。 如果P T (x, y)表示觸摸屏上的一個點,P L (x, y)表示LCD上的一個點,校正的結果就是得到一個轉換矩陣M,使P L (x, y) = M· P T (x, y)。 最終,假設LCD三個點的坐標為(XL1, YL1),(XL2, YL2),(XL2, YL2),對應觸摸屏上的三個點是(XT1, YT1),(XT2, YT2),(XT3 , YT3),則聯立兩個方程組為:
     
(繼續閱讀...)
文章標籤

立你斯 發表在 痞客邦 留言(0) 人氣(1,428)

  • 個人分類:tslib
▲top
  • 12月 08 週三 201014:19
  • [Linux]tslib


執行 autogen.sh (需要安裝 automake libtool)
./autogen.sh
configure.ac:25: error: possibly undefined macro: AC_DISABLE_STATIC
      If this token and others are legitimate, please use m4_pattern_allow.
      See the Autoconf documentation.
configure.ac:26: error: possibly undefined macro: AC_ENABLE_SHARED
configure.ac:27: error: possibly undefined macro: AC_LIBTOOL_DLOPEN
configure.ac:28: error: possibly undefined macro: AC_PROG_LIBTOOL
autoreconf2.50: /usr/bin/autoconf failed with exit status: 1
root@ubuntu:/nfs/pc9223/filesystem/rootfilesystem/rootfs/home/kdiag/kdiag8006/code/tslib/tslib-1.0# apt-get inhref="apt://m4,autoconf,automake,libtool" stall m4 autoconf automake libtool
E: 無效的操作 inhref=apt://m4,autoconf,automake
(繼續閱讀...)
文章標籤

立你斯 發表在 痞客邦 留言(0) 人氣(1,945)

  • 個人分類:tslib
▲top
1

熱門文章

  • (2,695)GCC 4.6 warning: variable set but not used
  • (61,985)GPS資料格式
  • (9,021)DDC及EDID内容簡介
  • (17,632)嵌入式經典面試題 
  • (21,572)Linux中Workqueue機制分析
  • (5,262)[轉載]Linux HAL (Hardware Abstraction Layer)的工作原理
  • (2,056)vmware-mount 掛載虛擬磁碟機
  • (61,962)NAND Flash和NOR Flash的比較
  • (8,517)MISRA--作為工業標準的C編程規範(1)
  • (3,838)航海王無限巡航 第一章 浪中的祕寶

文章分類

toggle 程式語言 (17)
  • openCL (2)
  • C++ (1)
  • 8051 (5)
  • GPS (4)
  • BarCode (3)
  • 多媒體 (7)
  • 網路相關 (23)
  • 程式設計 (20)
  • ARM (22)
  • u-boot (19)
  • 各種規格 (41)
  • 程式心得 (34)
  • 程式工具 (18)
  • 版本控制 (13)
  • RTOS (5)
  • uC/OS 筆記 (12)
  • Objective-C (3)
toggle 其他 (8)
  • SCRATCH (1)
  • 三國風雲 (4)
  • 產業消息 (2)
  • 未分類資料夾 (12)
  • 娛樂 (13)
  • 語文學習 (8)
  • 理財 (7)
  • 幼教 (2)
toggle Linux Driver (9)
  • PCI (6)
  • driver 教學 (17)
  • driver 問題修正 (11)
  • 嵌入式 driver 相關 (10)
  • USB (8)
  • I2C (7)
  • V4L2 (8)
  • Driver 其他 (29)
  • Alsa (15)
toggle Linux (19)
  • yocto (4)
  • WIFI (14)
  • GUI (10)
  • CentOS (4)
  • Linux system programming (8)
  • 工作使用 (2)
  • 模擬-VM (3)
  • 編譯相關 (26)
  • tslib (9)
  • 檔案系統 (18)
  • 嵌入式相關 (10)
  • 系統相關 (21)
  • LINUX (57)
  • 模擬-colinux (6)
  • 模擬-cygwin (10)
  • Android (21)
  • Mplayer (11)
  • tool chain (6)
  • 系統指令 (6)
  • NV (1)
  • 未分類文章 (1)

最新文章

  • C語言學習
  • Could not resolve host: source.codeaurora.org
  • NVIDIA_Jetson_ISP (ORIN)
  • AP6275S 相關
  • rtl8822cs 相關
  • LINUX 解決package ~ is not configured yet
  • Ubuntu 22.04 安裝 VMWare 16.2.3 後無法啟動
  • How To Access Your Google Drive on Ubuntu
  • xinput
  • gsettings 取得 KEY 值

文章精選

文章搜尋

參觀人氣

  • 本日人氣:
  • 累積人氣:

個人資訊

立你斯
暱稱:
立你斯
分類:
數位生活
好友:
累積中
地區:

誰來我家