青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

唐吉訶德

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  5 Posts :: 75 Stories :: 3 Comments :: 0 Trackbacks

常用鏈接

留言簿(2)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

轉載請注明出處

作者:小馬


 

前段時間移植 6.0 BSP,目前已移植到觸摸屏部分了. 移植過程中學到了不少東西. 由其是關于觸摸屏這部分, 掌握了很多以前不會的東西. 覺得有必要把這些知識點整理一下. 


一 硬件部分


硬件上的原理不是本文的重點,只講一下大概的原理(主要是我也只知道大概的原理, 畢竟咱不是搞硬件的. 嘻嘻!)


我移植用的這個屏是320*240 的TFT屏, 四線電阻式觸屏. 這種觸屏的原理是由兩個電阻層組成, 一個實現X位置的測量,一個用于Y位置上的測量. 簡單來說,就是當用觸筆按下屏幕時,兩個電阻層接觸, 電阻發生變化,然后在X Y方向上產生信號, 這個信號是電壓信號, 再經過CPU內部分AD轉換為坐標值. 這個原理有點像高中物理課用的滑動電阻,有一個最大上限,滑動到不同的地方,阻值不同. 2410本身集成了touch的控制器,通過簡單的配置和讀取相關的寄存器,就可以實現觸摸屏的操作. 


二 驅動部分

Wince下的touch驅動跟很多其它的驅動一樣, 是分層的, 有MDD 和PDD兩層. MDD層被系統隱藏起來, 一般不用我們來修改. 而我們真正關心的是PDD 層. 也就是要由開發者來修改的這一層. 


分析touch驅動時,以我最近剛剛移植到一個基于2410的板子上的6.0的BSP包的觸屏驅動為例.到C:\WINCE600\PLATFORM\DEVICEEMULATOR\SRC\DRIVERS\TOUCH下. 找到s3c2410x_touch.cpp文件. 這里面正是PDD層的實現代碼. 容易發現這里面的函數分為兩類,一類是以TSP開頭的函數,一類是以DDSI開頭的函數. TSP開頭的函數為內部私有的函數,是被DDSI調用的, 而DDSI開頭的函數則是對外的接口, 也就是被MDD層的函數調用的接口. 


DdsiTouchPanelEnable是首先被調用的一個外部接口, 它的實現可參見源程序,  它主

要做了下面幾個事情:

1 通過調用TSP_VirtualAlloc函數為驅動所用的IO,中斷等硬件中斷分配內存空間. 


2 通過調用KernelIoControl向系統申請兩個中斷,如果申請成功,賦予相應的邏輯中斷號. KernelIoControl向底層是調用OEMIoControl函數, OEMIoControl根據KernelIoControl傳進來的IOCTL代碼,做相應的操作,比如這里, IOCTL是IOCTL_HAL_REQUEST_SYSINTR, 它是向內核申請一個物理中斷和邏輯中斷的映射. 


3 通過調用TSP_PowerOn來初始化中斷控制器,ADC寄存器,定時器等, 在TSP_PowerOn的實現中,有幾點要說明一下:

ADCDLY 這個值在不同的模式下意義不同, 因為前面通過ADCTSC已經配置為wait for interrupt mode, 所以這個值的意義和你的觸筆按下時,  從產生中斷信號到開始自動轉換X,Y時的時間間隔是相關的,它的單位是ms


v_pPWMregs->TCNTB3  = g_timer3_sampleticks

TCNTB3是timer3的count buffer, 當定時器啟動時, 0,這個值以一個設置好的頻率遞減,直到減到0, 這時會產生一個定時器中斷. 這個有什么用呢. 要理解它,得知道觸摸屏在中斷模式下是如何工作的. 


當我們按下的觸摸屏時,會產生一個ADC的中斷, 同時我們的驅動還會啟動一個定時器, 這個定時器觸發一個事件做數據采集, 在我們的手或觸筆抬起來前,這個定時器不斷的觸發采集事件,直到它被關閉, 而它什么時候會被關閉呢,就是在觸筆的抬起來時. 下面截取的代碼很好的說明的這個原理:

if ( (v_pADCregs->ADCDAT0 & (1 << 15)) |(v_pADCregs->ADCDAT1 & (1 << 15)) )

{

bTSP_DownFlag = FALSE;

DEBUGMSG(ZONE_TIPSTATE, (TEXT("up\r\n")));

v_pADCregs->ADCTSC &= 0xff;

        *pUncalX = x;

*pUncalY = y;

TSP_SampleStop();

            ……

}

上面的代碼,if判斷的正是是否抬起. 

而g_timer3_sampleticks的值是這樣計算出來的. 

g_timer3_freq        = (g_s3c2410_pclk / TIMER3_DIVIDER);

g_timer3_sampleticks = (g_timer3_freq / TSP_SAMPLE_RATE_LOW); 

TIMER3_DIVIDER 的值是2, TSP_SAMPLE_RATE_LOW的值是100, 由

v_pPWMregs->TCFG1  &= ~(0xf << 12);  

v_pPWMregs->TCFG1  |=  (0   << 12); 

可知定時器1/2分頻, 所以,很容易計算出,所設置的定時器是每10ms產生一次定時器中斷

而觸摸屏中斷是在你按下和抬起時產生的. 


DdsiTouchPanelGetPoint是采樣的主要實現函數,當MDD檢測到中斷事件發生時,該函數會被調用. 觸摸屏的中斷是SYSINTR_TOUCH, 而定時器的中斷是SYSINTR_TOUCH_CHANGED 

該函數用if else分別處理兩種中斷, 如下:

if (v_pINTregs->SUBSRCPND & (1<<IRQ_SUB_TC))      /* 觸摸屏中斷*/

{

    ……

}


else        /*定時器中斷 */

{

}

DdsiTouchPanelGetPoint函數的實現代碼中,調用了兩個很重要的函數TSP_TransXY和TSP_GetXY

需要說明的是,這兩個函數的實現跟LCD本身的分辨率是沒有關系的.

TSP_GetXY用來獲到AD采樣值,TSP_TransXY把它轉化為屏上的坐標. 我移植touch驅動時,遇到過點屏幕上面,下面有反應,或者點左上角,右上角有反應等類似的問題, 都是因為這兩個函數沒實現好.


先來看TSP_GetXY函數.它的實現如下:

TSP_GetXY(INT *px, INT *py)

{

INT i;

INT xsum, ysum;

INT x, y;

INT dx, dy;

xsum = ysum = 0;

for (i = 0; i < TSP_SAMPLE_NUM; i++)

{

v_pADCregs->ADCTSC =   (0      <<  8) |        /* UD_Sen*/

(1      <<  7) |        /* YMON  1 (YM = GND)*/

(1      <<  6) |        /* nYPON 1 (YP Connected AIN[n])*/

(0      <<  5) |        /* XMON  0 (XM = Z)*/

(1      <<  4) |        /* nXPON 1 (XP = AIN[7])*/

(1      <<  3) |        /* Pull Up Enable*/

(1      <<  2) |        /* Auto ADC Conversion Mode*/

(0      <<  0);         /* No Operation Mode*/


v_pADCregs->ADCCON |= (1 << 0);  /* Start Auto conversion*/


while (v_pADCregs->ADCCON & 0x1);               /* check if Enable_start is low*/

while (!(v_pADCregs->ADCCON & (1 << 15)));      /* Check ECFLG*/


y = (0x3ff & v_pADCregs->ADCDAT1);

x = (0x3ff & v_pADCregs->ADCDAT0);

xsum += x;

ysum += y;

}

*px = xsum / TSP_SAMPLE_NUM;

*py = ysum / TSP_SAMPLE_NUM;


v_pADCregs->ADCTSC =    (1      <<  8) |            /* UD_Sen*/

(1      <<  7) |            /* YMON  1 (YM = GND)*/

(1      <<  6) |            /* nYPON 1 (YP Connected AIN[n])*/

(0      <<  5) |            /* XMON  0 (XM = Z)*/

(1      <<  4) |            /* nXPON 1 (XP = AIN[7])*/

(0      <<  3) |            /* Pull Up Disable*/

(0      <<  2) |            /* Normal ADC Conversion Mode*/

(3      <<  0);             /* Waiting Interrupt*/


dx = (*px > x) ? (*px - x) : (x - *px);

dy = (*py > y) ? (*py - y) : (y - *py);


return((dx > TSP_INVALIDLIMIT || dy > TSP_INVALIDLIMIT) ? FALSE : TRUE);

}


關于這個函數有幾點要說明. 

根據2410的手冊, ADCDAT0 保存是X方向上采樣的結果,  ADCDAT1 保存是Y方向上采樣的結果,  所以, 我們看到下面的兩行代碼

y = (0x3ff & v_pADCregs->ADCDAT1);

x = (0x3ff & v_pADCregs->ADCDAT0);

與上0x3ff, 是因為, ADCDAT寄存器只用了前面 10位來保存AD采樣的結果, 而這和2410內部的AD模塊只有10位精度是相一致的.所以,AD轉換后的最大值不會超過1024-1. 

當然上在那種計算方法并不是絕對的 , 根據硬件構造的不同, 比如有可能你x方向的坐標值和采樣值成反比,就要按下面的方式計算:

x = 0x3ff - (0x3ff & v_pADCregs->ADCDAT0);


再看TSP_TransXY函數. 我移植的版本的實現如下:

PRIVATE void

TSP_TransXY(INT *px, INT *py)

{

*px = (*px >= TSP_MAXX) ? (TSP_MAXX) : *px;

*py = (*py >= TSP_MAXY) ? (TSP_MAXY) : *py;


*px = (*px - TSP_MINX);

*py = (*py - TSP_MINY);


*px = (*px >= 0) ? *px : 0;

*py = (*py >= 0) ? *py : 0;


*px = *px * TSP_LCDY / (TSP_MAXX - TSP_MINX);

*py = *py * TSP_LCDX / (TSP_MAXY - TSP_MINY);


*px = (*px >= TSP_LCDY)? (TSP_LCDY - 1) : *px;

*py = (*py >= TSP_LCDX)? (TSP_LCDX - 1) : *py;


*px = TSP_LCDY - *px - 1;

*py = TSP_LCDX - *py - 1;


}

這個實現是我在模擬器的實現代碼基礎上修改的. 這個函數計算X,Y的坐標用的是一個公式,至于這個公式是怎么來的,我就不太清楚了. 只說明一點.

#define TSP_MINX 88

#define TSP_MINY 84


#define TSP_MAXX 952

#define TSP_MAXY 996

上面四個值是定義X+, X-, Y+, Y-四個有效的采樣值, 理論上應該是0和1023(10 bit ADC), 但實際肯定有偏差,準確來講, 換了不同的硬件平臺,這四個值應該是要重新測過的. 我就直接沿用原BSP中的值了. 

    

posted on 2011-03-01 11:50 心羽 閱讀(916) 評論(0)  編輯 收藏 引用 所屬分類: wince
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲男同1069视频| 亚洲国产精品久久人人爱蜜臀 | 欧美亚洲一区| 日韩一区二区电影网| 欧美影院在线| 性做久久久久久久免费看| 欧美不卡视频一区发布| 久久精品国产欧美激情| 国产精品大全| 一区二区三区四区五区视频| 亚洲免费播放| 欧美精品激情在线观看| 欧美aa在线视频| 国模精品一区二区三区色天香| 中文日韩欧美| 亚洲欧美精品在线观看| 欧美日韩免费观看一区二区三区| 亚洲国产精品一区制服丝袜| 国产亚洲成av人在线观看导航| 亚洲视频狠狠| 亚洲综合视频网| 欧美视频精品一区| 一区二区高清在线| 亚洲图片在线观看| 欧美色欧美亚洲另类二区 | 免费91麻豆精品国产自产在线观看| 欧美性jizz18性欧美| 日韩视频不卡| 国产精品99久久99久久久二8| 欧美激情综合在线| 亚洲免费电影在线| 亚洲永久免费精品| 国产欧美一区二区三区沐欲| 亚洲欧美在线一区二区| 欧美中文日韩| 黄色成人小视频| 久久午夜精品一区二区| 亚洲高清不卡在线| av成人天堂| 国产精品视频网站| 欧美尤物巨大精品爽| 美日韩精品免费| 亚洲人成网站999久久久综合| 欧美精品 国产精品| 亚洲视屏在线播放| 久久精品网址| 亚洲国产高潮在线观看| 欧美伦理一区二区| 亚洲制服av| 欧美不卡福利| 一本色道88久久加勒比精品| 国产精品久久久久影院色老大 | 亚洲精品看片| 国产精品久久久亚洲一区| 亚洲嫩草精品久久| 欧美二区在线播放| 一区二区三区四区五区精品视频| 国产精品呻吟| 久久在精品线影院精品国产| 亚洲精品一级| 久久久噜噜噜久久人人看| 亚洲韩国青草视频| 国产精品久久亚洲7777| 久久久久久久久久久久久久一区| 亚洲免费观看高清完整版在线观看熊 | 久久三级福利| 一区二区三区三区在线| 久久漫画官网| 亚洲午夜av电影| 在线日韩视频| 国产精品一区二区三区久久| 欧美xart系列高清| 午夜在线精品偷拍| 亚洲精品少妇网址| 麻豆国产精品va在线观看不卡 | 一本大道av伊人久久综合| 国产一区二区三区在线观看免费视频 | 91久久精品美女| 国产拍揄自揄精品视频麻豆| 欧美精品videossex性护士| 久久精品国产99精品国产亚洲性色| 日韩一区二区免费高清| 免费成人你懂的| 久久精品二区亚洲w码| 在线视频日韩精品| 在线日韩中文| 狠狠综合久久av一区二区小说| 欧美午夜久久| 欧美久久成人| 欧美岛国在线观看| 免费精品视频| 老色鬼精品视频在线观看播放| 亚洲欧美激情视频| 亚洲图色在线| 亚洲午夜激情网页| 亚洲精品欧美一区二区三区| 亚洲承认在线| 欧美成人精品在线观看| 久久麻豆一区二区| 久久精品最新地址| 久久福利毛片| 久久国内精品自在自线400部| 亚洲一区二区欧美日韩| 在线综合视频| 亚洲视频欧美在线| 亚洲午夜一二三区视频| 中文日韩在线| 亚洲视频久久| 午夜精品久久久久久久男人的天堂 | 午夜精品理论片| 亚洲欧美国产毛片在线| 亚洲综合久久久久| 午夜精品一区二区三区在线| 亚洲欧美电影院| 欧美一区二区三区免费观看视频| 香蕉久久夜色精品| 欧美专区日韩视频| 久久嫩草精品久久久精品一| 开元免费观看欧美电视剧网站| 久久日韩精品| 欧美国产日韩一区| 亚洲三级色网| 亚洲视频欧美在线| 欧美一级夜夜爽| 麻豆精品精品国产自在97香蕉| 美女日韩在线中文字幕| 欧美日产一区二区三区在线观看 | 国产一区二区三区直播精品电影 | 久久综合亚洲社区| 欧美激情亚洲国产| 欧美色大人视频| 国产午夜精品全部视频在线播放| 好看的av在线不卡观看| 亚洲高清三级视频| 一区二区三区视频在线看| 欧美一站二站| 欧美大片在线观看一区| 日韩视频一区二区在线观看| 午夜精品福利一区二区三区av| 久久精品99国产精品| 欧美精品大片| 国产美女一区| 亚洲精品久久久久久一区二区| 亚洲欧美资源在线| 狂野欧美激情性xxxx欧美| 91久久精品国产91性色| 亚洲午夜一区二区| 久久亚洲欧洲| 欧美日韩一区二区三区在线视频| 国产曰批免费观看久久久| 亚洲欧洲另类国产综合| 亚洲欧美日韩高清| 欧美激情国产日韩精品一区18| 亚洲一区精品视频| 欧美国产综合| 韩日精品视频| 亚洲女性裸体视频| 欧美福利一区二区三区| 亚洲直播在线一区| 欧美另类极品videosbest最新版本| 国产精品有限公司| 一区二区三区久久精品| 久久视频在线看| 亚洲淫片在线视频| 欧美sm视频| 尤物99国产成人精品视频| 亚洲欧美日韩国产另类专区| 最新国产成人在线观看| 久久精品一区二区三区不卡牛牛| 国产精品白丝av嫩草影院| 亚洲精品久久久久久下一站| 久久久久久综合| 亚洲综合成人在线| 欧美性片在线观看| 亚洲美女电影在线| 亚洲大片在线| 免费成人在线观看视频| 韩国女主播一区二区三区| 亚洲女同性videos| 一本色道久久综合狠狠躁篇怎么玩| 免费人成网站在线观看欧美高清| 黑人巨大精品欧美黑白配亚洲| 欧美一级一区| 亚洲一区二区三区视频播放| 欧美性色aⅴ视频一区日韩精品| 一本久道久久综合婷婷鲸鱼| 亚洲国产精品一区二区www在线 | 牛人盗摄一区二区三区视频| 尤物yw午夜国产精品视频| 久久久国产午夜精品| 亚洲欧美精品在线| 国产伦精品一区二区三区视频黑人| 亚洲字幕一区二区| 亚洲网址在线| 国产欧美精品日韩精品| 久久aⅴ乱码一区二区三区| 亚洲曰本av电影| 国产裸体写真av一区二区| 久久av二区| 欧美在线中文字幕|