亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于S3C2410和LINUX的觸摸屏驅(qū)動

        2011-06-02 01:33:54內(nèi)蒙古電子信息職業(yè)技術(shù)學(xué)院馬麗潔李占嶺
        電子世界 2011年15期
        關(guān)鍵詞:驅(qū)動程序字符內(nèi)核

        內(nèi)蒙古電子信息職業(yè)技術(shù)學(xué)院 馬麗潔 李占嶺

        Linux設(shè)備驅(qū)動程序?qū)儆贚inux內(nèi)核的一部分,并在Linux內(nèi)核中扮演著十分重要的角色。它們像一個個“黑盒子”使某個特定的硬件響應(yīng)一個定義良好的內(nèi)部編程接口,同時完全隱蔽了設(shè)備的工作細節(jié)。用戶通過一組標準化的調(diào)用來完成相關(guān)操作,這些標準化的調(diào)用是和具體設(shè)備驅(qū)動無關(guān)的,而驅(qū)動程序的任務(wù)就是把這些調(diào)用映射到具體設(shè)備對于實際硬件的特定操作上。

        可以把設(shè)備驅(qū)動作為內(nèi)核的一部分,直接編譯到內(nèi)核中,即靜態(tài)編譯,也可以單獨作為一個模塊編譯,在需要它的時候再動態(tài)的把它插入到內(nèi)核中。在不需要時也可把它從內(nèi)核中刪除,即動態(tài)連接。顯然動態(tài)連接比靜態(tài)連接有更多的好處,但在嵌入式開發(fā)領(lǐng)域往往要求進行靜態(tài)連接,尤其是像S3C44BO這種不帶MMU的芯片。但在S3C241O等帶MMU的ARM芯片中我們依然可以使用動態(tài)連接。

        一、Linux設(shè)備分類

        目前Linux支持的設(shè)備驅(qū)動可分為三種:字符設(shè)備,塊設(shè)備,網(wǎng)絡(luò)接口設(shè)備。當(dāng)然它們之間的也并不是要嚴格的加以區(qū)分。

        1.字符設(shè)備:所有能夠像字節(jié)流一樣訪問的設(shè)備比如文件等在Linux中都通過字符設(shè)備驅(qū)動程序來實現(xiàn)。在Linux中它們也被映射為文件系統(tǒng)的一個節(jié)點,常在/dev目錄下。字符設(shè)備驅(qū)動程序一般要包含open,close,read,write等幾個系統(tǒng)調(diào)用。

        2.塊設(shè)備:Linux的塊設(shè)備通常是指諸如磁盤,內(nèi)存,F(xiàn)lash等可以容納文件系統(tǒng)的存儲設(shè)備。與字符設(shè)備類似,塊設(shè)備也是通過文件系統(tǒng)來進行訪問,它們之間的區(qū)別僅僅在于內(nèi)核內(nèi)部管理數(shù)據(jù)的方式不同。它也允許像字符設(shè)備一樣的訪問,可以一次傳遞任意多的字節(jié)。Linux中的塊設(shè)備包含整數(shù)個塊,每個塊包含2的幾次冪的字節(jié)。

        3.網(wǎng)絡(luò)接口設(shè)備:網(wǎng)絡(luò)接口設(shè)備是Linux中比較復(fù)雜的一種設(shè)備,通常它們指的是硬件設(shè)備,但有時也可是一個軟件設(shè)備。它們由內(nèi)核中網(wǎng)絡(luò)子系統(tǒng)驅(qū)動,負責(zé)發(fā)送和接收數(shù)據(jù)包,而且它并不需要了解每一項事務(wù)是如何映射到實際傳送的數(shù)據(jù)包的。它們的數(shù)據(jù)傳送往往并不是面向流的,所以不容易把它們映射到一個文件系統(tǒng)的節(jié)點上。在Linux中采用給網(wǎng)絡(luò)接口設(shè)備分配一個唯一名字的方法來訪問該設(shè)備。

        二、Linux關(guān)于字符設(shè)備的管理

        驅(qū)動程序在Linux內(nèi)核中往往是以模塊形式出現(xiàn)的。與應(yīng)用程序的執(zhí)行過程不同,模塊通常只是預(yù)先向內(nèi)核注冊自己,當(dāng)內(nèi)核需要時響應(yīng)請求。模塊中包含兩個重要的函數(shù):init_module和cleanup_module。前者是模塊的入口,它為模塊調(diào)用做好準備工作,而后者則是在模塊即將卸載時被調(diào)用,做一些清掃工作。

        驅(qū)動程序模塊通過函數(shù):int register_chrdev(unsigned int major,const char *name,struct file_operations*fops);來完成向內(nèi)核注冊的。其中unsi-gned int major為主設(shè)備號,const char *name為設(shè)備名,結(jié)構(gòu)指針struct file_operations *fops內(nèi)核就是通過這個結(jié)構(gòu)來訪問驅(qū)動程序的。

        在Linux中字符設(shè)備是通過文件系統(tǒng)中的設(shè)備名來進行訪問的。這些名稱通常放在/dev目錄下,通過命令ls-l/dev我們可以看到該目錄下的一大堆設(shè)備文件,其中第一個字母是“C”的為字符設(shè)備,而第一個字母是“b”的為塊設(shè)備文件。其中每個設(shè)備文件都具有一個主設(shè)備號和一個次設(shè)備號。當(dāng)驅(qū)動程序調(diào)用open系統(tǒng)調(diào)用時,內(nèi)核就是利用主設(shè)備號把該驅(qū)動與具體設(shè)備對應(yīng)起來的。而次設(shè)備號內(nèi)核并不關(guān)心,它是給主設(shè)備號已經(jīng)確定的驅(qū)動程序使用的,一個驅(qū)動程序往往可以控制多個設(shè)備,如一個硬盤的多個分區(qū),這時該硬盤擁有一個主設(shè)備號,而每個分區(qū)擁有自己的次設(shè)備號。

        我們編寫好一個驅(qū)動程序模塊后,按傳統(tǒng)的主次設(shè)備號的方法來進行設(shè)備管理,則我們應(yīng)手工為該模塊建立一個設(shè)備節(jié)點。命令:mknod /dev/ts c 254 O其中/dev/ts表示我們的設(shè)備名是ts,“C”說明它是字符設(shè)備,“254”是主設(shè)備號,“O”是次設(shè)備號。一旦通過mknod創(chuàng)建了設(shè)備文件,它就一直保留下來,除非我們手工刪除它。我們用register_chrdev注冊模塊時,給major賦值為O,則系統(tǒng)就采用動態(tài)方式分配設(shè)備號。它會在所有未被使用的設(shè)備號中為我們選定一個,作為函數(shù)返回值返回給我們。一旦分配了設(shè)備號,我們就可以在/proc/devices中看到相關(guān)內(nèi)容。/proc在前面關(guān)于操作系統(tǒng)移植的實驗中我們已經(jīng)提到,它是一個偽文件系統(tǒng),它實際并不占用任何硬盤空間,而是在內(nèi)核運行時在內(nèi)存中動態(tài)生成的。它可以顯示當(dāng)前運行系統(tǒng)的許多相關(guān)信息。顯然這一點對我們動態(tài)分配主設(shè)備號是非常有意義的。因為,正如我們前面提到的一樣,我們采用主次設(shè)備號的方式管理設(shè)備文件,我們要在/dev目錄下為我們的設(shè)備創(chuàng)建一個設(shè)備名,可我們的設(shè)備號卻是動態(tài)產(chǎn)生的,每次都不一樣,這樣我們就不得不每次都從新運行一次mknod命令。這個過程我們通常通過編寫自動執(zhí)行腳本來完成,而其中的主設(shè)備號我們就可以通過/proc/devices中獲得。

        三、觸摸屏的控制

        本系統(tǒng)觸摸屏的控制是使用的S3c241O處理器自帶的觸摸屏控制器,這部分的開發(fā)主要參考S3c241O處理器的芯片手冊。這部分的控制主要是設(shè)置觸摸屏的采樣模式,處理器提供的模式:

        1.正常的轉(zhuǎn)換模式

        2.手動的x/y位置轉(zhuǎn)換模式

        3.自動的x/y位置轉(zhuǎn)換模式

        我們這里使用的是第3種轉(zhuǎn)換模式。需要注意的是在完成一次x/y坐標采樣的過程中需要一次模式轉(zhuǎn)換即在點擊觸摸屏之前是等待中斷模式,當(dāng)有觸摸動作產(chǎn)生觸摸屏中斷以后,在x/y的坐標采集驅(qū)動中設(shè)置成自動的x/y位置轉(zhuǎn)換模式,在完成采集以后再轉(zhuǎn)換回等待中斷模式,準備下一次的觸摸采樣。

        四、程序分析

        剖析S3C241O的觸摸屏驅(qū)動程序,部分代碼及注釋如下:

        static ssize_t s3c241O_ts_read(str-uct file *filp,char *buffer,size_t count,loff_t *ppos)/*設(shè)備讀函數(shù),各參數(shù)含義:*filp打開的文件,*buffer數(shù)據(jù)緩存,count請求傳送數(shù)據(jù)長度,*ppos用戶在文件中進行存儲操作的位置。*/

        驅(qū)動程序運行在內(nèi)核空間,而應(yīng)用程序運行在用戶空間。用戶空間內(nèi)存頁是可被換出的。當(dāng)內(nèi)核空間訪問用戶空間時有可能當(dāng)前頁并不存在而造成錯誤。所以當(dāng)我們要從內(nèi)核空間拷貝整段數(shù)據(jù)到用戶空間時只能借助于內(nèi)核函數(shù):

        unsigned long copy_to_user(void*to,const void *from,unsigned long count)

        同樣從用戶空間往內(nèi)核空間拷貝數(shù)據(jù)也只能借助于內(nèi)核函數(shù):

        unsigned long copy_from_user(void*to,const void *from,unsigned long count)它將在驅(qū)動程序?qū)懞瘮?shù)中用到。

        //在該函數(shù)中添加自己的濾波算法,注意函數(shù)中對硬件寄存器操作的部分語句和函數(shù)static void s3c241O_isr_tc(int irq,void *dev_id,struct pt_regs*reg)//這是中斷處理函數(shù),當(dāng)觸摸屏事件發(fā)生時觸發(fā)中斷,內(nèi)核捕捉該中斷后交由該函數(shù)處理。

        static int s3c241O_ts_open(struct inode *inode,struct file *filp)//打開設(shè)備,該函數(shù)中往往要完成設(shè)備初始化和使用記數(shù)增值。

        static int s3c241O_ts_release(str-uct inode *inode,struct file *filp)//設(shè)備釋放函數(shù)。

        s3c241O_isr_adc、S3c241O_isr_tc:它是一個唯一的標志符,通過該指針多個設(shè)備可以共享信號線。驅(qū)動程序也可以用它指向自己的私有數(shù)據(jù)區(qū),用來識別哪個設(shè)備產(chǎn)生了中斷。

        由于設(shè)備驅(qū)動是溝通底層硬件與上層應(yīng)用程序的橋梁,它所涉及的內(nèi)容相當(dāng)多。要編寫一個完整的驅(qū)動程序,要求你不僅對硬件設(shè)備及其工作原理要相當(dāng)熟悉,同時必需具備一定的內(nèi)核結(jié)構(gòu)的知識,此外對上層應(yīng)用程序及開發(fā)語言也具有比較過硬的開發(fā)能力。

        [1]毛德操,胡希明.Linux內(nèi)核源代碼情景分析(上冊)[M].浙江:浙江大學(xué)出版社.

        [2]劉淼.嵌入式系統(tǒng)接口設(shè)計與Linux驅(qū)動程序開發(fā)[M].北京:北京航空航天大學(xué),2006,11.

        猜你喜歡
        驅(qū)動程序字符內(nèi)核
        萬物皆可IP的時代,我們當(dāng)夯實的IP內(nèi)核是什么?
        尋找更強的字符映射管理器
        強化『高新』內(nèi)核 打造農(nóng)業(yè)『硅谷』
        字符代表幾
        一種USB接口字符液晶控制器設(shè)計
        電子制作(2019年19期)2019-11-23 08:41:50
        基于嵌入式Linux內(nèi)核的自恢復(fù)設(shè)計
        Linux內(nèi)核mmap保護機制研究
        消失的殖民村莊和神秘字符
        驅(qū)動程序更新與推薦
        驅(qū)動程序更新與推薦
        中文字幕av中文字无码亚| 亚洲综合无码| 亚洲精品一区网站在线观看| 国产精品天干天干在线观蜜臀| 国产精品久久婷婷六月| 久久99精品综合国产女同| av影院在线免费观看不卡| 国产乱人偷精品人妻a片| 久久国产精品久久久久久| 国产成人午夜精品免费视频| 亚洲综合伦理| 亚洲色图第一页在线观看视频| 综合亚洲二区三区四区在线 | 国产精品无码久久久一区蜜臀| 国产av在线观看91| 国产av无码专区亚洲av男同| 99精品国产一区二区三区不卡| 亚洲国产中文在线二区三区免| 成 人 网 站 在线 看 免费| 日本熟妇高潮爽视频在线观看| 97超碰精品成人国产| 久久精品国产亚洲av高清热| 无尽动漫性视频╳╳╳3d| 西西人体大胆视频无码| 国产精品一区二区韩国av| 亚洲国产精品无码专区在线观看| 野花社区视频www官网| 亚洲欧美欧美一区二区三区| 2020最新国产激情| 国产精品成人av大片| 亚洲欧美日韩国产精品一区二区 | 亚洲视频一区二区三区视频 | 欧美亚洲国产片在线播放| 婷婷一区二区三区在线| 国产在线一区二区三区香蕉| 一二区成人影院电影网| 欧美日韩一区二区三区自拍| 91亚洲国产成人aⅴ毛片大全| 毛片av在线尤物一区二区| 黄色av亚洲在线观看| 在线成人爽a毛片免费软件|