




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、嵌入式系統(tǒng)原理及應(yīng)用教程嵌入式系統(tǒng)原理及應(yīng)用教程主講內(nèi)容主講內(nèi)容第第8章章 嵌入式系統(tǒng)嵌入式系統(tǒng)Boot Loader技術(shù)技術(shù)第第9章章 嵌入式嵌入式Linux操作系統(tǒng)移植操作系統(tǒng)移植第第10章章 嵌入式嵌入式Linux設(shè)備驅(qū)動程序開發(fā)設(shè)備驅(qū)動程序開發(fā)第第11章章 嵌入式嵌入式Linux應(yīng)用程序設(shè)計應(yīng)用程序設(shè)計10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ)10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ)10.1.1 嵌入式嵌入式Linux設(shè)備驅(qū)動程序分類設(shè)備驅(qū)動程序分類l靜態(tài)加載的驅(qū)動程序靜態(tài)加載的驅(qū)動程序l動態(tài)加載的驅(qū)動程序動態(tài)加載的驅(qū)動程序 Linux將設(shè)
2、備按照功能特性劃分為三種類型:字符設(shè)將設(shè)備按照功能特性劃分為三種類型:字符設(shè)備,塊設(shè)備和網(wǎng)絡(luò)設(shè)備。備,塊設(shè)備和網(wǎng)絡(luò)設(shè)備。10.1.2 最簡單的內(nèi)核模塊最簡單的內(nèi)核模塊1helloworld模塊源代碼模塊源代碼2模塊的編譯模塊的編譯3模塊的加載和卸載模塊的加載和卸載10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ)10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ)10.2 嵌入式嵌入式Linux設(shè)備驅(qū)動重要技術(shù)設(shè)備驅(qū)動重要技術(shù)10.2.1 內(nèi)存與內(nèi)存與I/O端口端口 (1)內(nèi)核空間和用戶空間)內(nèi)核空間和用戶空間 (2)內(nèi)核中內(nèi)存分配)內(nèi)核中內(nèi)存分配內(nèi)核中獲取內(nèi)存的幾種
3、方式如下。內(nèi)核中獲取內(nèi)存的幾種方式如下。通過伙伴算法分配大片物理內(nèi)存通過伙伴算法分配大片物理內(nèi)存通過通過slab緩沖區(qū)分配小片物理內(nèi)存緩沖區(qū)分配小片物理內(nèi)存非連續(xù)內(nèi)存區(qū)分配非連續(xù)內(nèi)存區(qū)分配高端內(nèi)存映射高端內(nèi)存映射固定線性地址映射固定線性地址映射10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ)(3)I/O端口端口 根據(jù)根據(jù)CPU體系結(jié)構(gòu)的不同,體系結(jié)構(gòu)的不同,CPU對對IO端口的編址方端口的編址方式有兩種:式有兩種:I/O映射方式(映射方式(I/O-mapped)和內(nèi)存映射)和內(nèi)存映射方式(方式(Memory-mapped)。)。 下面主要討論一下內(nèi)存映射方式訪問下面主要討論一下
4、內(nèi)存映射方式訪問I/O端口的方法,端口的方法,我們稱之為我們稱之為I/O內(nèi)存操作。內(nèi)存操作。l I/O 內(nèi)存區(qū)必須在使用前分配內(nèi)存區(qū)必須在使用前分配l I/O內(nèi)存映射內(nèi)存映射 l 訪問訪問I/O內(nèi)存內(nèi)存l 映射到用戶空間映射到用戶空間 10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ)10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ)10.2.2 同步機制同步機制 Linux內(nèi)核中包含的同步機制包括:原子操作、信號內(nèi)核中包含的同步機制包括:原子操作、信號量(量(semaphore)、讀寫信號量()、讀寫信號量(rw_semaphore)、)、自旋鎖(自旋鎖(spin
5、lock)、大內(nèi)核鎖)、大內(nèi)核鎖(Big Kernel Lock,BKL)、讀寫鎖(、讀寫鎖(rwlock)、讀拷貝更新()、讀拷貝更新(Read-Copy Update,RCU)和)和seqlock(順序鎖)等。(順序鎖)等。10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ)1.原子操作原子操作 原子操作主要用于實現(xiàn)資源計數(shù),很多引用計數(shù)原子操作主要用于實現(xiàn)資源計數(shù),很多引用計數(shù)(refcnt)就是就是通過原子操作實現(xiàn)的。通過原子操作實現(xiàn)的。原子類型定義如下:原子類型定義如下:typedef struct volatile int counter; atomic_t;原子操作通
6、常用于實現(xiàn)資源的引用計數(shù)原子操作通常用于實現(xiàn)資源的引用計數(shù) 2.信號量信號量 信號量在創(chuàng)建時需要設(shè)置一個初始值信號量在創(chuàng)建時需要設(shè)置一個初始值. 3.讀寫信號量讀寫信號量 讀寫信號量有兩種實現(xiàn)讀寫信號量有兩種實現(xiàn):l一種是通用的,不依賴于硬件架構(gòu)一種是通用的,不依賴于硬件架構(gòu) l 一種是架構(gòu)相關(guān)的一種是架構(gòu)相關(guān)的10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ)讀寫信號量的相關(guān)讀寫信號量的相關(guān)API有:有:DECLARE_RWSEM(name)該宏聲明一個讀寫信號量該宏聲明一個讀寫信號量name并對其進行初始化。并對其進行初始化。void init_rwsem(struct rw
7、_semaphore *sem); 該函數(shù)對讀寫信號量該函數(shù)對讀寫信號量sem進行初始化。進行初始化。void down_read(struct rw_semaphore *sem); 在在Linux中,每一個進程都用一個類型為中,每一個進程都用一個類型為task_t或或struct task_struct的結(jié)構(gòu)來描述的結(jié)構(gòu)來描述 10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ)4.自旋鎖自旋鎖 一個執(zhí)行單元要想訪問被自旋鎖保護的共享資源,必一個執(zhí)行單元要想訪問被自旋鎖保護的共享資源,必須先得到鎖,在訪問完共享資源后,必須釋放鎖。須先得到鎖,在訪問完共享資源后,必須釋放鎖。 自
8、旋鎖的自旋鎖的API有:有:spin_lock_init(x);10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ)10.2.3 阻塞與非阻塞阻塞與非阻塞1.阻塞操作阻塞操作2.非阻塞操作非阻塞操作10.2.4 時間問題時間問題1.延時操作:延時操作:(1)長延時。()長延時。(2)短延時)短延時2.內(nèi)核定時器內(nèi)核定時器內(nèi)核提供給驅(qū)動許多函數(shù)來聲明、注冊、以及去除內(nèi)核定時器。內(nèi)核提供給驅(qū)動許多函數(shù)來聲明、注冊、以及去除內(nèi)核定時器。 3.工作隊列工作隊列采用缺省工作者線程來實現(xiàn)工作隊列采用缺省工作者線程來實現(xiàn)工作隊列 的的API:INIT_WORK(_work, _func, _da
9、ta)10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ) int schedule_work(struct work_struct *work)int schedule_delayed_work(struct work_struct *work, unsigned long delay)void flush_scheduled_work(void)int cancel_delayed_work(struct work_struct *work) 創(chuàng)建自己的工作者線程和工作隊列,創(chuàng)建自己的工作者線程和工作隊列,API:struct workqueue_struct *create_
10、workqueue(const char *name) int queue_work(struct workqueue_struct *wq, struct work_struct *work)int queue_delayed_work(struct workqueue_struct *wq, struct work_struct *work, unsigned long delay)void flush_workqueue(struct workqueue_struct *wq)void destroy_workqueue(struct workqueue_struct *wq)10.1
11、嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ)10.2.5 中斷處理中斷處理在在Linux系統(tǒng)里,對中斷的處理是屬于系統(tǒng)核心部分,系統(tǒng)里,對中斷的處理是屬于系統(tǒng)核心部分,因而如果設(shè)別與系統(tǒng)之間以中斷方式進行數(shù)據(jù)交換,因而如果設(shè)別與系統(tǒng)之間以中斷方式進行數(shù)據(jù)交換,就必須把該設(shè)備的驅(qū)動程序作為系統(tǒng)核心的一部分。就必須把該設(shè)備的驅(qū)動程序作為系統(tǒng)核心的一部分。設(shè)備驅(qū)動程序通過調(diào)用設(shè)備驅(qū)動程序通過調(diào)用request_irq函數(shù)來申請中斷,函數(shù)來申請中斷,通過通過free_irq來釋放中斷。它們被定義為:來釋放中斷。它們被定義為:#include int request_irq(unsigned
12、int irq, void (*handler)(int irq, void dev_id, struct pt_regs *regs),unsigned long flags,const char *device,void *dev_id);void free_irq(unsigned int irq, void *dev_id);10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ)函數(shù)的參數(shù)如下。函數(shù)的參數(shù)如下。 unsigned int irq:請求的中斷號。:請求的中斷號。irqreturn_t (*handler) :安裝的中斷處理函數(shù)指針。:安裝的中斷處理函數(shù)指針。un
13、signed long flags:中斷處理的屬性。:中斷處理的屬性。 const char *dev_name:這個傳遞給:這個傳遞給request_irq的字串的字串用在用在/proc/interrupts來顯示中斷的擁有者。來顯示中斷的擁有者。 void *dev_id:用作共享中斷的指針。:用作共享中斷的指針。 10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ)10.3 字符設(shè)備驅(qū)動程序字符設(shè)備驅(qū)動程序字符設(shè)備驅(qū)動程序可以分為三個主要組成部分:字符設(shè)備驅(qū)動程序可以分為三個主要組成部分:,自動配置和初始化子程序,負(fù)責(zé)檢測所要驅(qū)動的硬件設(shè)備是否存在和是否能正常工作。,服務(wù)于I
14、/O請求的子程序,又稱為驅(qū)動程序的上半部分。,中斷服務(wù)子程序,又稱為驅(qū)動程序的下半部分。10.3.1 字符設(shè)備驅(qū)動結(jié)構(gòu)字符設(shè)備驅(qū)動結(jié)構(gòu)1.主次設(shè)備號主次設(shè)備號 :字符設(shè)備和塊設(shè)備通過文件系統(tǒng)中的名子來存取。:字符設(shè)備和塊設(shè)備通過文件系統(tǒng)中的名子來存取。 主編號標(biāo)識設(shè)備相連的驅(qū)動。主編號標(biāo)識設(shè)備相連的驅(qū)動。 次編號被內(nèi)核用來決定引用哪個設(shè)備。次編號被內(nèi)核用來決定引用哪個設(shè)備。 設(shè)備編號在驅(qū)動程序的內(nèi)部具有固定的表示方式。設(shè)備編號在驅(qū)動程序的內(nèi)部具有固定的表示方式。 在建立驅(qū)動時,需要做的第一件事是獲取一個或多個設(shè)備編號來使用。在建立驅(qū)動時,需要做的第一件事是獲取一個或多個設(shè)備編號來使用。在驅(qū)動程
15、序執(zhí)行的過程中,如果不希望在使用該設(shè)備,要及時的將設(shè)備編在驅(qū)動程序執(zhí)行的過程中,如果不希望在使用該設(shè)備,要及時的將設(shè)備編號釋放:號釋放:10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ)2.驅(qū)動相關(guān)數(shù)據(jù)結(jié)構(gòu)驅(qū)動相關(guān)數(shù)據(jù)結(jié)構(gòu) 大部分的基礎(chǔ)性的驅(qū)動操作包括大部分的基礎(chǔ)性的驅(qū)動操作包括3個重要的內(nèi)核數(shù)據(jù)結(jié)構(gòu),它個重要的內(nèi)核數(shù)據(jù)結(jié)構(gòu),它們是們是file_operations,file,和,和inode。 (1)文件操作()文件操作(file_operations)file_operation 結(jié)構(gòu)表示了用戶程序怎樣對設(shè)備進行操作。結(jié)構(gòu)表示了用戶程序怎樣對設(shè)備進行操作。這個結(jié)構(gòu),定義在這個
16、結(jié)構(gòu),定義在中,是一個函數(shù)指針的集合中,是一個函數(shù)指針的集合 struct module *owner。(2)文件結(jié)構(gòu))文件結(jié)構(gòu)struct file定義于定義于,是設(shè)備驅(qū)動中第二個最重要,是設(shè)備驅(qū)動中第二個最重要的數(shù)據(jù)結(jié)構(gòu)。的數(shù)據(jù)結(jié)構(gòu)。 (3)inode 結(jié)構(gòu)結(jié)構(gòu)inode 結(jié)構(gòu)由內(nèi)核在內(nèi)部用來表示文件。結(jié)構(gòu)由內(nèi)核在內(nèi)部用來表示文件。 10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ)3.自動配置和初始化自動配置和初始化(1)初始化。當(dāng)驅(qū)動程序?qū)⒈患虞d的時候,首先會調(diào))初始化。當(dāng)驅(qū)動程序?qū)⒈患虞d的時候,首先會調(diào)用初始函數(shù)進行自動配置。用初始函數(shù)進行自動配置。 (2)清除處理。)
17、清除處理。 4.中斷處理中斷處理 如果需要驅(qū)動程序具有中斷處理的能力,必須進行中如果需要驅(qū)動程序具有中斷處理的能力,必須進行中斷申請。斷申請。 l從從request_irq返回給請求函數(shù)的返回值是返回給請求函數(shù)的返回值是0指示成功,指示成功,為負(fù)表示錯誤碼。為負(fù)表示錯誤碼。 l中斷處理可以在驅(qū)動初始化時安裝或者在設(shè)備第一次中斷處理可以在驅(qū)動初始化時安裝或者在設(shè)備第一次打開時。打開時。 l在中斷的使用過程中還可以對其進行使能和禁止操作在中斷的使用過程中還可以對其進行使能和禁止操作 10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ)10.3.2 字符設(shè)備驅(qū)動實例字符設(shè)備驅(qū)動實例LED
18、驅(qū)動驅(qū)動1.LED驅(qū)動程序分析驅(qū)動程序分析 本驅(qū)動程序文件名為本驅(qū)動程序文件名為led2440.c2.驅(qū)動模塊加入內(nèi)核驅(qū)動模塊加入內(nèi)核l使用命令:使用命令:cp -f led2440.c /linux-2.6.32.4/drivers/char/ l編輯編輯Kconfig文件:文件:l修改修改Makefile文件:文件:l配置、編譯內(nèi)核配置、編譯內(nèi)核 執(zhí)行執(zhí)行make zImage內(nèi)核映像和驅(qū)動程序模塊會先后被內(nèi)核映像和驅(qū)動程序模塊會先后被編譯完畢。將內(nèi)核下載至開發(fā)板;將驅(qū)動程序模塊加編譯完畢。將內(nèi)核下載至開發(fā)板;將驅(qū)動程序模塊加入到根文件系統(tǒng)后,下載至開發(fā)板。這樣就可以調(diào)用入到根文件系統(tǒng)后,
19、下載至開發(fā)板。這樣就可以調(diào)用驅(qū)動程序進行演示了。驅(qū)動程序進行演示了。10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ)3.LED驅(qū)動演示驅(qū)動演示(1)驅(qū)動程序模塊加載到內(nèi)核。)驅(qū)動程序模塊加載到內(nèi)核。進入驅(qū)動程序模塊所在目錄,執(zhí)行:進入驅(qū)動程序模塊所在目錄,執(zhí)行:insmod -f led2440.ko(2)建立設(shè)備節(jié)點。)建立設(shè)備節(jié)點。也就是建立用戶程序關(guān)聯(lián)到驅(qū)動程序的途徑也就是建立用戶程序關(guān)聯(lián)到驅(qū)動程序的途徑 (3)演示程序。)演示程序。建立一個建立一個LED控制的簡單演示程序控制的簡單演示程序led2440test 10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開
20、發(fā)基礎(chǔ)10.4 網(wǎng)絡(luò)設(shè)備驅(qū)動程序網(wǎng)絡(luò)設(shè)備驅(qū)動程序10.4.1 Linux 網(wǎng)絡(luò)設(shè)備簡介網(wǎng)絡(luò)設(shè)備簡介1.Linux網(wǎng)絡(luò)驅(qū)動基礎(chǔ)網(wǎng)絡(luò)驅(qū)動基礎(chǔ)2.DM9000控制器控制器10.4.2 網(wǎng)絡(luò)驅(qū)動核心數(shù)據(jù)結(jié)構(gòu)網(wǎng)絡(luò)驅(qū)動核心數(shù)據(jù)結(jié)構(gòu)分成幾個方面對其進行介紹分成幾個方面對其進行介紹 l通用信息通用信息l硬件描述信息硬件描述信息l協(xié)議相關(guān)信息協(xié)議相關(guān)信息l設(shè)備操作函數(shù)接口設(shè)備操作函數(shù)接口10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ)10.4.3 網(wǎng)絡(luò)驅(qū)動程序分析網(wǎng)絡(luò)驅(qū)動程序分析1.初始化、清理網(wǎng)絡(luò)設(shè)備初始化、清理網(wǎng)絡(luò)設(shè)備網(wǎng)絡(luò)設(shè)備初始化的工作主要是確定硬件設(shè)備的存在,以及網(wǎng)絡(luò)設(shè)備初始化的工作主要
21、是確定硬件設(shè)備的存在,以及將硬件設(shè)備加載到設(shè)備鏈表中,為網(wǎng)絡(luò)設(shè)備的激活做準(zhǔn)備。將硬件設(shè)備加載到設(shè)備鏈表中,為網(wǎng)絡(luò)設(shè)備的激活做準(zhǔn)備。需要注意這兩個變量:需要注意這兩個變量:name和和owner。 2.打開和關(guān)閉網(wǎng)絡(luò)設(shè)備打開和關(guān)閉網(wǎng)絡(luò)設(shè)備 open函數(shù)主要用來完成對網(wǎng)絡(luò)設(shè)備中斷進行注冊、通過函數(shù)主要用來完成對網(wǎng)絡(luò)設(shè)備中斷進行注冊、通過配置物理接口初始化設(shè)備,以及為發(fā)送數(shù)據(jù)準(zhǔn)備隊列。配置物理接口初始化設(shè)備,以及為發(fā)送數(shù)據(jù)準(zhǔn)備隊列。10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ)3.中斷處理中斷處理網(wǎng)絡(luò)驅(qū)動程序的中斷處理函數(shù)在網(wǎng)絡(luò)設(shè)備激活時進行注冊,主要用于網(wǎng)絡(luò)驅(qū)動程序的中斷處理函數(shù)
22、在網(wǎng)絡(luò)設(shè)備激活時進行注冊,主要用于完成:現(xiàn)場保護及中斷屏蔽、讀取網(wǎng)絡(luò)設(shè)備寄存器信息及判斷中斷原完成:現(xiàn)場保護及中斷屏蔽、讀取網(wǎng)絡(luò)設(shè)備寄存器信息及判斷中斷原因并處理、恢復(fù)中斷現(xiàn)場。因并處理、恢復(fù)中斷現(xiàn)場。 函數(shù)首先需要獲得自旋鎖,然后將當(dāng)前的寄存器地址保存下來,以便函數(shù)首先需要獲得自旋鎖,然后將當(dāng)前的寄存器地址保存下來,以便返回的時候繼續(xù)進行被打斷的作業(yè);接著就是屏蔽所有的中斷,讀取返回的時候繼續(xù)進行被打斷的作業(yè);接著就是屏蔽所有的中斷,讀取中斷狀態(tài)寄存器并清除中斷狀態(tài)寄存器,然后就開始真正的中斷處理中斷狀態(tài)寄存器并清除中斷狀態(tài)寄存器,然后就開始真正的中斷處理了。了。 當(dāng)發(fā)生接收中斷時,中斷函數(shù)
23、調(diào)用當(dāng)發(fā)生接收中斷時,中斷函數(shù)調(diào)用dm9000_rx()函數(shù)。函數(shù)。 4.sk_buff結(jié)構(gòu)結(jié)構(gòu) sk_buff的數(shù)據(jù)成員分為兩部分:的數(shù)據(jù)成員分為兩部分:l一部分是實際在網(wǎng)絡(luò)中要傳輸?shù)牟糠?,?shù)據(jù)區(qū)(一部分是實際在網(wǎng)絡(luò)中要傳輸?shù)牟糠?,?shù)據(jù)區(qū)(Packet date storage););l一部分由內(nèi)核管理服務(wù)于結(jié)構(gòu)鏈表。一部分由內(nèi)核管理服務(wù)于結(jié)構(gòu)鏈表。 10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ)還有一些常用的成員如:還有一些常用的成員如:sk_buff-tstamp: sk_buff-dev: sk_buff-protocol: 內(nèi)核提供了一系列用于操作內(nèi)核提供了一系列用
24、于操作sk_buff數(shù)據(jù)結(jié)構(gòu)的函數(shù),用數(shù)據(jù)結(jié)構(gòu)的函數(shù),用于分配、釋放、復(fù)制、克隆、擴展等功能,下面介紹于分配、釋放、復(fù)制、克隆、擴展等功能,下面介紹些常用的。些常用的。struct sk_buff *alloc_skb(unsigned int len,int priority)struct sk_buff *dev_alloc_skb(unsigned int len)10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ)5.數(shù)據(jù)發(fā)送處理數(shù)據(jù)發(fā)送處理6.數(shù)據(jù)接收處理數(shù)據(jù)接收處理 數(shù)據(jù)接收的主要工作有:檢查接收的到的數(shù)據(jù)包是否正確;根據(jù)數(shù)據(jù)數(shù)據(jù)接收的主要工作有:檢查接收的到的數(shù)據(jù)包是
25、否正確;根據(jù)數(shù)據(jù)被長度在內(nèi)核空間為數(shù)據(jù)包申請被長度在內(nèi)核空間為數(shù)據(jù)包申請sk_buff;把數(shù)據(jù)包復(fù)制到;把數(shù)據(jù)包復(fù)制到sk_buff,填寫相關(guān)成員后插入隊列;釋放網(wǎng)絡(luò)芯片中分配的緩沖區(qū)。填寫相關(guān)成員后插入隊列;釋放網(wǎng)絡(luò)芯片中分配的緩沖區(qū)。 7.其它處理接口其它處理接口 在網(wǎng)絡(luò)設(shè)備結(jié)構(gòu)中還有一些函數(shù)接口需要實現(xiàn),如:在網(wǎng)絡(luò)設(shè)備結(jié)構(gòu)中還有一些函數(shù)接口需要實現(xiàn),如:(1)get_stats(2)set_multicast_list(3)tx_tiemout10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ)10.5 設(shè)備驅(qū)動實例設(shè)備驅(qū)動實例10.5.1 ADC設(shè)備驅(qū)動實例設(shè)備驅(qū)動實例AD
26、C是比較簡單的字符設(shè)備,在此直接給出是比較簡單的字符設(shè)備,在此直接給出ADC的驅(qū)動的驅(qū)動程序源代碼和注釋說明。程序源代碼和注釋說明。10.5.2 PWM設(shè)備驅(qū)動實例設(shè)備驅(qū)動實例10.5.3 觸摸屏設(shè)備驅(qū)動實例觸摸屏設(shè)備驅(qū)動實例1.輸入子系統(tǒng)輸入子系統(tǒng) 在在Linux中,輸入子系統(tǒng)中,輸入子系統(tǒng)(Input Subsystem)是由輸入子系統(tǒng)是由輸入子系統(tǒng)設(shè)備驅(qū)動層、輸入子系統(tǒng)核心層設(shè)備驅(qū)動層、輸入子系統(tǒng)核心層(Input Core)和輸入子系和輸入子系統(tǒng)事件處理層統(tǒng)事件處理層(Event Handler)組成。組成。 10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ)設(shè)備的驅(qū)動的
27、實現(xiàn)步驟如下:設(shè)備的驅(qū)動的實現(xiàn)步驟如下:在驅(qū)動模塊加載函數(shù)中設(shè)置在驅(qū)動模塊加載函數(shù)中設(shè)置Input設(shè)備支持設(shè)備支持input子系子系統(tǒng)的哪些事件;統(tǒng)的哪些事件;將將Input設(shè)備注冊到設(shè)備注冊到input子系統(tǒng)中;子系統(tǒng)中;在在Input設(shè)備發(fā)生輸入操作時設(shè)備發(fā)生輸入操作時(如:鍵盤被按下如:鍵盤被按下/抬起、抬起、觸摸屏被觸摸觸摸屏被觸摸/抬起抬起/移動、鼠標(biāo)被移動移動、鼠標(biāo)被移動/單擊單擊/抬起時等抬起時等),提交所發(fā)生的事件及對應(yīng)的鍵值提交所發(fā)生的事件及對應(yīng)的鍵值/坐標(biāo)等狀態(tài)。坐標(biāo)等狀態(tài)。 在提交輸入設(shè)備的事件后必須用下列方法使事件同在提交輸入設(shè)備的事件后必須用下列方法使事件同步,讓它告
28、知步,讓它告知input系統(tǒng),設(shè)備驅(qū)動已經(jīng)發(fā)出了一個完系統(tǒng),設(shè)備驅(qū)動已經(jīng)發(fā)出了一個完整的報告:整的報告:void input_sync(struct input_dev *dev)10.1 嵌入式嵌入式Linux驅(qū)動程序開發(fā)基礎(chǔ)驅(qū)動程序開發(fā)基礎(chǔ)2.觸摸屏驅(qū)動實現(xiàn)觸摸屏驅(qū)動實現(xiàn)S3C2440A芯片內(nèi)部集成了觸摸屏接口并與芯片內(nèi)部集成了觸摸屏接口并與ADC接口相連。接口相連。 S3C2440A提供的觸摸屏接口有提供的觸摸屏接口有4種處理模式,分別是:正常種處理模式,分別是:正常轉(zhuǎn)換模式、單獨的轉(zhuǎn)換模式、單獨的X/Y位置轉(zhuǎn)換模式、自動位置轉(zhuǎn)換模式、自動X/Y位置轉(zhuǎn)換位置轉(zhuǎn)換模式和等待中斷模式,在此實現(xiàn)自動模式
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 美食廣場整體承包經(jīng)營合同范本
- 中醫(yī)護理三因制宜
- 餐飲業(yè)股權(quán)投資合作與風(fēng)險控制合同
- 商務(wù)代駕服務(wù)委托合同
- 鐵路快運代理服務(wù)合作協(xié)議書
- 腸脹氣病人的護理
- 垃圾處理設(shè)施安全責(zé)任承包管理合同
- 腫瘤患者出院健康指導(dǎo)
- 餐飲品牌商標(biāo)使用權(quán)及加盟管理合同
- 餐飲企業(yè)加盟店經(jīng)營數(shù)據(jù)保密協(xié)議
- 信息用戶管理制度
- 河南信息產(chǎn)業(yè)投資有限公司招聘考試真題2024
- 離婚協(xié)議書正規(guī)打印電子版(2025年版)
- 石家莊市國企招聘考試真題題庫2024版
- GB/T 6109.20-2008漆包圓繞組線第20部分:200級聚酰胺酰亞胺復(fù)合聚酯或聚酯亞胺漆包銅圓線
- 食品營養(yǎng)與健康-18中國居民平衡膳食寶塔
- 《社會主義核心價值觀》優(yōu)秀課件
- 初中生物會考模擬試題
- (完整版)標(biāo)書密封條格式word
- 輕金屬冶金學(xué)教學(xué)課件匯總完整版電子教案全書整套課件幻燈片(最新)
- 加強社區(qū)兩委換屆監(jiān)督工作的實施方案
評論
0/150
提交評論