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

唐吉訶德

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

常用鏈接

留言簿(2)

我參與的團(tuán)隊(duì)

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

轉(zhuǎn)載請注明出處

作者:小馬


 

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


一 硬件部分


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


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


二 驅(qū)動部分

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


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


DdsiTouchPanelEnable是首先被調(diào)用的一個(gè)外部接口, 它的實(shí)現(xiàn)可參見源程序,  它主

要做了下面幾個(gè)事情:

1 通過調(diào)用TSP_VirtualAlloc函數(shù)為驅(qū)動所用的IO,中斷等硬件中斷分配內(nèi)存空間. 


2 通過調(diào)用KernelIoControl向系統(tǒng)申請兩個(gè)中斷,如果申請成功,賦予相應(yīng)的邏輯中斷號. KernelIoControl向底層是調(diào)用OEMIoControl函數(shù), OEMIoControl根據(jù)KernelIoControl傳進(jìn)來的IOCTL代碼,做相應(yīng)的操作,比如這里, IOCTL是IOCTL_HAL_REQUEST_SYSINTR, 它是向內(nèi)核申請一個(gè)物理中斷和邏輯中斷的映射. 


3 通過調(diào)用TSP_PowerOn來初始化中斷控制器,ADC寄存器,定時(shí)器等, 在TSP_PowerOn的實(shí)現(xiàn)中,有幾點(diǎn)要說明一下:

ADCDLY 這個(gè)值在不同的模式下意義不同, 因?yàn)榍懊嫱ㄟ^ADCTSC已經(jīng)配置為wait for interrupt mode, 所以這個(gè)值的意義和你的觸筆按下時(shí),  從產(chǎn)生中斷信號到開始自動轉(zhuǎn)換X,Y時(shí)的時(shí)間間隔是相關(guān)的,它的單位是ms


v_pPWMregs->TCNTB3  = g_timer3_sampleticks

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


當(dāng)我們按下的觸摸屏?xí)r,會產(chǎn)生一個(gè)ADC的中斷, 同時(shí)我們的驅(qū)動還會啟動一個(gè)定時(shí)器, 這個(gè)定時(shí)器觸發(fā)一個(gè)事件做數(shù)據(jù)采集, 在我們的手或觸筆抬起來前,這個(gè)定時(shí)器不斷的觸發(fā)采集事件,直到它被關(guān)閉, 而它什么時(shí)候會被關(guān)閉呢,就是在觸筆的抬起來時(shí). 下面截取的代碼很好的說明的這個(gè)原理:

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的值是這樣計(jì)算出來的. 

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); 

可知定時(shí)器1/2分頻, 所以,很容易計(jì)算出,所設(shè)置的定時(shí)器是每10ms產(chǎn)生一次定時(shí)器中斷

而觸摸屏中斷是在你按下和抬起時(shí)產(chǎn)生的. 


DdsiTouchPanelGetPoint是采樣的主要實(shí)現(xiàn)函數(shù),當(dāng)MDD檢測到中斷事件發(fā)生時(shí),該函數(shù)會被調(diào)用. 觸摸屏的中斷是SYSINTR_TOUCH, 而定時(shí)器的中斷是SYSINTR_TOUCH_CHANGED 

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

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

{

    ……

}


else        /*定時(shí)器中斷 */

{

}

DdsiTouchPanelGetPoint函數(shù)的實(shí)現(xiàn)代碼中,調(diào)用了兩個(gè)很重要的函數(shù)TSP_TransXY和TSP_GetXY

需要說明的是,這兩個(gè)函數(shù)的實(shí)現(xiàn)跟LCD本身的分辨率是沒有關(guān)系的.

TSP_GetXY用來獲到AD采樣值,TSP_TransXY把它轉(zhuǎn)化為屏上的坐標(biāo). 我移植touch驅(qū)動時(shí),遇到過點(diǎn)屏幕上面,下面有反應(yīng),或者點(diǎn)左上角,右上角有反應(yīng)等類似的問題, 都是因?yàn)檫@兩個(gè)函數(shù)沒實(shí)現(xiàn)好.


先來看TSP_GetXY函數(shù).它的實(shí)現(xiàn)如下:

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);

}


關(guān)于這個(gè)函數(shù)有幾點(diǎn)要說明. 

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

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

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

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

當(dāng)然上在那種計(jì)算方法并不是絕對的 , 根據(jù)硬件構(gòu)造的不同, 比如有可能你x方向的坐標(biāo)值和采樣值成反比,就要按下面的方式計(jì)算:

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


再看TSP_TransXY函數(shù). 我移植的版本的實(shí)現(xiàn)如下:

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;


}

這個(gè)實(shí)現(xiàn)是我在模擬器的實(shí)現(xiàn)代碼基礎(chǔ)上修改的. 這個(gè)函數(shù)計(jì)算X,Y的坐標(biāo)用的是一個(gè)公式,至于這個(gè)公式是怎么來的,我就不太清楚了. 只說明一點(diǎn).

#define TSP_MINX 88

#define TSP_MINY 84


#define TSP_MAXX 952

#define TSP_MAXY 996

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

    

posted on 2011-03-01 11:50 心羽 閱讀(903) 評論(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>
            亚洲在线视频观看| 中文亚洲免费| 亚洲色诱最新| 亚洲高清久久| 亚洲国产综合91精品麻豆| 亚洲国产欧美久久| 亚洲精品免费在线| 一区二区毛片| 欧美亚洲在线| 久久亚洲私人国产精品va媚药| 久久精品女人的天堂av| 免费成人性网站| 91久久在线| 欧美v日韩v国产v| 亚洲欧洲一区二区天堂久久| 亚洲国产精品精华液2区45| 亚洲人妖在线| 午夜精品国产更新| 美腿丝袜亚洲色图| 国产精品二区影院| 激情综合色综合久久综合| 亚洲高清免费在线| 亚洲午夜精品| 久久九九99| 欧美激情一区二区三区在线视频观看| 亚洲精品国偷自产在线99热| 99在线观看免费视频精品观看| 欧美在线一二三四区| 欧美国产日韩视频| 韩国亚洲精品| 亚洲免费视频成人| 欧美成人精品一区二区| 一本一本久久a久久精品综合麻豆| 久久国产精品99国产精| 国产精品99免视看9| 亚洲黄色一区二区三区| 久久精品伊人| 一区二区三区欧美亚洲| 男同欧美伦乱| 激情久久中文字幕| 欧美一区二区三区喷汁尤物| 亚洲国产欧美在线人成| 久久久久久一区二区三区| 国产精品久久久久av| 亚洲激情偷拍| 久久男人资源视频| 亚洲视频香蕉人妖| 欧美成人影音| 亚洲日本成人| 久久青草欧美一区二区三区| 亚洲色图制服丝袜| 欧美日韩国产综合一区二区| 亚洲精品在线免费| 免费观看一区| 久久久久久国产精品mv| 国产一区二区中文| 欧美一级二级三级蜜桃| 中文亚洲字幕| 国产精品日韩二区| 亚洲在线视频| 亚洲综合清纯丝袜自拍| 国产精品美腿一区在线看| 亚洲少妇自拍| 中文亚洲免费| 国产乱码精品一区二区三区五月婷 | 欧美在线播放视频| 国产精品午夜国产小视频| 亚洲欧美国产日韩天堂区| 国产精品99久久久久久www| 国产精品二区影院| 欧美影院在线播放| 欧美一区二区三区四区高清| 国产一区二区三区的电影 | 久久久久五月天| 欧美伊人久久久久久午夜久久久久| 国产精品久久综合| 欧美在线一区二区| 久久超碰97中文字幕| 国一区二区在线观看| 免费日韩av片| 欧美丰满少妇xxxbbb| 中文无字幕一区二区三区| 亚洲一区二区三区在线视频| 国产婷婷精品| 欧美激情国产高清| 欧美日韩国产成人在线| 午夜精品福利一区二区三区av| 亚洲自拍啪啪| 国模私拍一区二区三区| 欧美激情一区二区三区在线视频观看| 欧美成人国产va精品日本一级| 日韩午夜精品| 午夜视频一区二区| 亚洲国产小视频| 9人人澡人人爽人人精品| 国产日韩一区| 亚洲国产你懂的| 国产精品卡一卡二| 欧美成人免费全部观看天天性色| 欧美精品乱码久久久久久按摩| 性欧美超级视频| 久久黄色级2电影| 9色精品在线| 性刺激综合网| 亚洲天堂男人| 乱码第一页成人| 校园激情久久| 欧美精品在线一区二区| 久久成人av少妇免费| 欧美—级在线免费片| 久久久久久69| 欧美激情视频一区二区三区在线播放| 午夜精品久久| 欧美日韩一区二区在线播放| 欧美成人精品在线播放| 国产麻豆精品在线观看| 亚洲欧洲一区二区在线观看 | 免费成人性网站| 亚洲欧美激情四射在线日 | 欧美视频四区| 欧美国产日本韩| 国产在线视频欧美一区二区三区| 亚洲欧洲精品天堂一级| 尤物精品在线| 国产精品地址| 日韩视频精品在线观看| 亚洲精品一区在线观看香蕉| 开元免费观看欧美电视剧网站| 亚洲综合不卡| 欧美日韩午夜在线| 亚洲毛片在线观看| 最新国产成人av网站网址麻豆| 久久久久久婷| 久久综合精品一区| 国内精品久久久久久久影视蜜臀| 亚洲一区在线免费| 亚洲欧美国产高清va在线播| 欧美人与禽性xxxxx杂性| 欧美成人黑人xx视频免费观看 | 亚洲视频播放| 欧美另类久久久品| 亚洲人成绝费网站色www| 亚洲精品少妇30p| 欧美自拍丝袜亚洲| 美女91精品| 亚洲国产欧美不卡在线观看| 久久婷婷蜜乳一本欲蜜臀| 久久综合给合久久狠狠狠97色69| 国户精品久久久久久久久久久不卡| 午夜一区不卡| 久久影院午夜论| 激情久久久久久久| 美女视频黄 久久| 亚洲福利视频专区| 亚洲少妇最新在线视频| 国产精品每日更新在线播放网址| 亚洲一区二区三区乱码aⅴ| 欧美专区亚洲专区| 在线观看一区视频| 欧美日韩福利在线观看| 一区二区久久久久| 久久精品日产第一区二区三区| 国产一区二区三区久久久| 久久免费国产| 99国产精品久久久久久久| 性做久久久久久| 在线视频成人| 国产精品毛片| 亚洲欧美中日韩| 国产一区二区三区久久| 免费精品视频| 亚洲永久免费av| 欧美电影在线观看| 亚洲小说欧美另类婷婷| 黑人一区二区三区四区五区| 欧美激情视频一区二区三区在线播放| 一区二区三区欧美在线观看| 久久久午夜精品| 亚洲精品在线视频| 国内一区二区三区| 欧美日韩在线另类| 久久黄色影院| 亚洲美女精品一区| 久久综合色88| 亚洲制服丝袜在线| 亚洲经典在线看| 国内欧美视频一区二区| 欧美午夜欧美| 欧美激情精品久久久久久黑人| 性欧美大战久久久久久久免费观看| 欧美激情五月| 久久夜色精品国产欧美乱| 亚洲一区在线观看视频| 亚洲精品自在久久| 韩国av一区二区三区| 国产精品久久久久久久久久尿| 欧美二区不卡| 久久一区免费| 欧美一区1区三区3区公司| 在线综合+亚洲+欧美中文字幕|