嵌入式系統原理及應用教程第10章課件_第1頁
嵌入式系統原理及應用教程第10章課件_第2頁
嵌入式系統原理及應用教程第10章課件_第3頁
嵌入式系統原理及應用教程第10章課件_第4頁
嵌入式系統原理及應用教程第10章課件_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、嵌入式系統原理及應用教程嵌入式系統原理及應用教程NoImage嵌入式系統原理及應用教程第10章主講內容主講內容第第8章章 嵌入式系統嵌入式系統Boot Loader技術技術第第9章章 嵌入式嵌入式Linux操作系統移植操作系統移植第第10章章 嵌入式嵌入式Linux設備驅動程序開發(fā)設備驅動程序開發(fā)第第11章章 嵌入式嵌入式Linux應用程序設計應用程序設計10.1 嵌入式嵌入式Linux驅動程序開發(fā)基礎驅動程序開發(fā)基礎嵌入式系統原理及應用教程第10章10.1 嵌入式嵌入式Linux驅動程序開發(fā)基礎驅動程序開發(fā)基礎10.1.1 嵌入式嵌入式Linux設備驅動程序分類設備驅動程序分類l靜態(tài)加載的驅

2、動程序靜態(tài)加載的驅動程序l動態(tài)加載的驅動程序動態(tài)加載的驅動程序 Linux將設備按照功能特性劃分為三種類型:字符設將設備按照功能特性劃分為三種類型:字符設備,塊設備和網絡設備。備,塊設備和網絡設備。10.1.2 最簡單的內核模塊最簡單的內核模塊1helloworld模塊源代碼模塊源代碼2模塊的編譯模塊的編譯3模塊的加載和卸載模塊的加載和卸載10.1 嵌入式嵌入式Linux驅動程序開發(fā)基礎驅動程序開發(fā)基礎嵌入式系統原理及應用教程第10章10.1 嵌入式嵌入式Linux驅動程序開發(fā)基礎驅動程序開發(fā)基礎10.2 嵌入式嵌入式Linux設備驅動重要技術設備驅動重要技術10.2.1 內存與內存與I/O端

3、口端口 (1)內核空間和用戶空間)內核空間和用戶空間 (2)內核中內存分配)內核中內存分配內核中獲取內存的幾種方式如下。內核中獲取內存的幾種方式如下。通過伙伴算法分配大片物理內存通過伙伴算法分配大片物理內存通過通過slab緩沖區(qū)分配小片物理內存緩沖區(qū)分配小片物理內存非連續(xù)內存區(qū)分配非連續(xù)內存區(qū)分配高端內存映射高端內存映射固定線性地址映射固定線性地址映射10.1 嵌入式嵌入式Linux驅動程序開發(fā)基礎驅動程序開發(fā)基礎嵌入式系統原理及應用教程第10章(3)I/O端口端口 根據根據CPU體系結構的不同,體系結構的不同,CPU對對IO端口的編址方端口的編址方式有兩種:式有兩種:I/O映射方式(映射方式

4、(I/O-mapped)和內存映射)和內存映射方式(方式(Memory-mapped)。)。 下面主要討論一下內存映射方式訪問下面主要討論一下內存映射方式訪問I/O端口的方法,端口的方法,我們稱之為我們稱之為I/O內存操作。內存操作。l I/O 內存區(qū)必須在使用前分配內存區(qū)必須在使用前分配l I/O內存映射內存映射 l 訪問訪問I/O內存內存l 映射到用戶空間映射到用戶空間 10.1 嵌入式嵌入式Linux驅動程序開發(fā)基礎驅動程序開發(fā)基礎10.1 嵌入式嵌入式Linux驅動程序開發(fā)基礎驅動程序開發(fā)基礎嵌入式系統原理及應用教程第10章10.2.2 同步機制同步機制 Linux內核中包含的同步機制

5、包括:原子操作、信號內核中包含的同步機制包括:原子操作、信號量(量(semaphore)、讀寫信號量()、讀寫信號量(rw_semaphore)、)、自旋鎖(自旋鎖(spinlock)、大內核鎖)、大內核鎖(Big Kernel Lock,BKL)、讀寫鎖(、讀寫鎖(rwlock)、讀拷貝更新()、讀拷貝更新(Read-Copy Update,RCU)和)和seqlock(順序鎖)等。(順序鎖)等。10.1 嵌入式嵌入式Linux驅動程序開發(fā)基礎驅動程序開發(fā)基礎嵌入式系統原理及應用教程第10章1.原子操作原子操作 原子操作主要用于實現資源計數,很多引用計數原子操作主要用于實現資源計數,很多引用

6、計數(refcnt)就是就是通過原子操作實現的。通過原子操作實現的。原子類型定義如下:原子類型定義如下:typedef struct volatile int counter; atomic_t;原子操作通常用于實現資源的引用計數原子操作通常用于實現資源的引用計數 2.信號量信號量 信號量在創(chuàng)建時需要設置一個初始值信號量在創(chuàng)建時需要設置一個初始值. 3.讀寫信號量讀寫信號量 讀寫信號量有兩種實現讀寫信號量有兩種實現:l一種是通用的,不依賴于硬件架構一種是通用的,不依賴于硬件架構 l 一種是架構相關的一種是架構相關的10.1 嵌入式嵌入式Linux驅動程序開發(fā)基礎驅動程序開發(fā)基礎嵌入式系統原理及

7、應用教程第10章讀寫信號量的相關讀寫信號量的相關API有:有:DECLARE_RWSEM(name)該宏聲明一個讀寫信號量該宏聲明一個讀寫信號量name并對其進行初始化。并對其進行初始化。void init_rwsem(struct rw_semaphore *sem); 該函數對讀寫信號量該函數對讀寫信號量sem進行初始化。進行初始化。void down_read(struct rw_semaphore *sem); 在在Linux中,每一個進程都用一個類型為中,每一個進程都用一個類型為task_t或或struct task_struct的結構來描述的結構來描述 10.1 嵌入式嵌入式Lin

8、ux驅動程序開發(fā)基礎驅動程序開發(fā)基礎嵌入式系統原理及應用教程第10章4.自旋鎖自旋鎖 一個執(zhí)行單元要想訪問被自旋鎖保護的共享資源,必一個執(zhí)行單元要想訪問被自旋鎖保護的共享資源,必須先得到鎖,在訪問完共享資源后,必須釋放鎖。須先得到鎖,在訪問完共享資源后,必須釋放鎖。 自旋鎖的自旋鎖的API有:有:spin_lock_init(x);10.1 嵌入式嵌入式Linux驅動程序開發(fā)基礎驅動程序開發(fā)基礎嵌入式系統原理及應用教程第10章10.2.3 阻塞與非阻塞阻塞與非阻塞1.阻塞操作阻塞操作2.非阻塞操作非阻塞操作10.2.4 時間問題時間問題1.延時操作:延時操作:(1)長延時。()長延時。(2)短

9、延時)短延時2.內核定時器內核定時器內核提供給驅動許多函數來聲明、注冊、以及去除內核定時器。內核提供給驅動許多函數來聲明、注冊、以及去除內核定時器。 3.工作隊列工作隊列采用缺省工作者線程來實現工作隊列采用缺省工作者線程來實現工作隊列 的的API:INIT_WORK(_work, _func, _data)10.1 嵌入式嵌入式Linux驅動程序開發(fā)基礎驅動程序開發(fā)基礎嵌入式系統原理及應用教程第10章 int schedule_work(struct work_struct *work)int schedule_delayed_work(struct work_struct *work, un

10、signed long delay)void flush_scheduled_work(void)int cancel_delayed_work(struct work_struct *work) 創(chuàng)建自己的工作者線程和工作隊列,創(chuàng)建自己的工作者線程和工作隊列,API:struct workqueue_struct *create_workqueue(const char *name) int queue_work(struct workqueue_struct *wq, struct work_struct *work)int queue_delayed_work(struct workqu

11、eue_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 嵌入式嵌入式Linux驅動程序開發(fā)基礎驅動程序開發(fā)基礎嵌入式系統原理及應用教程第10章10.2.5 中斷處理中斷處理在在Linux系統里,對中斷的處理是屬于系統核心部分,系統里,對中斷的處理是屬于系統核心部分,因而如果設別與系統之間以中斷方式進行數據交換,因而如果設

12、別與系統之間以中斷方式進行數據交換,就必須把該設備的驅動程序作為系統核心的一部分。就必須把該設備的驅動程序作為系統核心的一部分。設備驅動程序通過調用設備驅動程序通過調用request_irq函數來申請中斷,函數來申請中斷,通過通過free_irq來釋放中斷。它們被定義為:來釋放中斷。它們被定義為:#include int request_irq(unsigned int irq, void (*handler)(int irq, void dev_id, struct pt_regs *regs),unsigned long flags,const char *device,void *dev

13、_id);void free_irq(unsigned int irq, void *dev_id);10.1 嵌入式嵌入式Linux驅動程序開發(fā)基礎驅動程序開發(fā)基礎嵌入式系統原理及應用教程第10章函數的參數如下。函數的參數如下。 unsigned int irq:請求的中斷號。:請求的中斷號。irqreturn_t (*handler) :安裝的中斷處理函數指針。:安裝的中斷處理函數指針。unsigned long flags:中斷處理的屬性。:中斷處理的屬性。 const char *dev_name:這個傳遞給:這個傳遞給request_irq的字串的字串用在用在/proc/interr

14、upts來顯示中斷的擁有者。來顯示中斷的擁有者。 void *dev_id:用作共享中斷的指針。:用作共享中斷的指針。 10.1 嵌入式嵌入式Linux驅動程序開發(fā)基礎驅動程序開發(fā)基礎嵌入式系統原理及應用教程第10章10.3 字符設備驅動程序字符設備驅動程序字符設備驅動程序可以分為三個主要組成部分:字符設備驅動程序可以分為三個主要組成部分:,自動配置和初始化子程序,負責檢測所要驅動的硬件設備是否存在和是否能正常工作。,服務于I/O請求的子程序,又稱為驅動程序的上半部分。,中斷服務子程序,又稱為驅動程序的下半部分。10.3.1 字符設備驅動結構字符設備驅動結構1.主次設備號主次設備號 :字符設備

15、和塊設備通過文件系統中的名子來存取。:字符設備和塊設備通過文件系統中的名子來存取。 主編號標識設備相連的驅動。主編號標識設備相連的驅動。 次編號被內核用來決定引用哪個設備。次編號被內核用來決定引用哪個設備。 設備編號在驅動程序的內部具有固定的表示方式。設備編號在驅動程序的內部具有固定的表示方式。 在建立驅動時,需要做的第一件事是獲取一個或多個設備編號來使用。在建立驅動時,需要做的第一件事是獲取一個或多個設備編號來使用。在驅動程序執(zhí)行的過程中,如果不希望在使用該設備,要及時的將設備編在驅動程序執(zhí)行的過程中,如果不希望在使用該設備,要及時的將設備編號釋放:號釋放:10.1 嵌入式嵌入式Linux驅

16、動程序開發(fā)基礎驅動程序開發(fā)基礎嵌入式系統原理及應用教程第10章2.驅動相關數據結構驅動相關數據結構 大部分的基礎性的驅動操作包括大部分的基礎性的驅動操作包括3個重要的內核數據結構,它個重要的內核數據結構,它們是,們是,file,和,和inode。 (1)文件操作()文件操作() 結構表示了用戶程序怎樣對設備進行操作。結構表示了用戶程序怎樣對設備進行操作。這個結構,定義在這個結構,定義在中,是一個函數指針的集合中,是一個函數指針的集合 struct module *owner。(2)文件結構)文件結構struct file定義于定義于,是設備驅動中第二個最重要,是設備驅動中第二個最重要的數據結構

17、。的數據結構。 (3)inode 結構結構inode 結構由內核在內部用來表示文件。結構由內核在內部用來表示文件。 10.1 嵌入式嵌入式Linux驅動程序開發(fā)基礎驅動程序開發(fā)基礎嵌入式系統原理及應用教程第10章3.自動配置和初始化自動配置和初始化(1)初始化。當驅動程序將被加載的時候,首先會調)初始化。當驅動程序將被加載的時候,首先會調用初始函數進行自動配置。用初始函數進行自動配置。 (2)清除處理。)清除處理。 4.中斷處理中斷處理 如果需要驅動程序具有中斷處理的能力,必須進行中如果需要驅動程序具有中斷處理的能力,必須進行中斷申請。斷申請。 l從從request_irq返回給請求函數的返回

18、值是返回給請求函數的返回值是0指示成功,指示成功,為負表示錯誤碼。為負表示錯誤碼。 l中斷處理可以在驅動初始化時安裝或者在設備第一次中斷處理可以在驅動初始化時安裝或者在設備第一次打開時。打開時。 l在中斷的使用過程中還可以對其進行使能和禁止操作在中斷的使用過程中還可以對其進行使能和禁止操作 10.1 嵌入式嵌入式Linux驅動程序開發(fā)基礎驅動程序開發(fā)基礎嵌入式系統原理及應用教程第10章10.3.2 字符設備驅動實例字符設備驅動實例LED驅動驅動1.LED驅動程序分析驅動程序分析 本驅動程序文件名為本驅動程序文件名為led2440.c2.驅動模塊加入內核驅動模塊加入內核l使用命令:使用命令:cp

19、 -f led2440.c /linux-2.6.32.4/drivers/char/ l編輯編輯Kconfig文件:文件:l修改修改Makefile文件:文件:l配置、編譯內核配置、編譯內核 執(zhí)行執(zhí)行make zImage內核映像和驅動程序模塊會先后被內核映像和驅動程序模塊會先后被編譯完畢。將內核下載至開發(fā)板;將驅動程序模塊加編譯完畢。將內核下載至開發(fā)板;將驅動程序模塊加入到根文件系統后,下載至開發(fā)板。這樣就可以調用入到根文件系統后,下載至開發(fā)板。這樣就可以調用驅動程序進行演示了。驅動程序進行演示了。10.1 嵌入式嵌入式Linux驅動程序開發(fā)基礎驅動程序開發(fā)基礎嵌入式系統原理及應用教程第1

20、0章3.LED驅動演示驅動演示(1)驅動程序模塊加載到內核。)驅動程序模塊加載到內核。進入驅動程序模塊所在目錄,執(zhí)行:進入驅動程序模塊所在目錄,執(zhí)行:insmod -f led2440.ko(2)建立設備節(jié)點。)建立設備節(jié)點。也就是建立用戶程序關聯到驅動程序的途徑也就是建立用戶程序關聯到驅動程序的途徑 (3)演示程序。)演示程序。建立一個建立一個LED控制的簡單演示程序控制的簡單演示程序led2440test 10.1 嵌入式嵌入式Linux驅動程序開發(fā)基礎驅動程序開發(fā)基礎嵌入式系統原理及應用教程第10章10.4 網絡設備驅動程序網絡設備驅動程序10.4.1 Linux 網絡設備簡介網絡設備簡

21、介1.Linux網絡驅動基礎網絡驅動基礎2.DM9000控制器控制器10.4.2 網絡驅動核心數據結構網絡驅動核心數據結構分成幾個方面對其進行介紹分成幾個方面對其進行介紹 l通用信息通用信息l硬件描述信息硬件描述信息l協議相關信息協議相關信息l設備操作函數接口設備操作函數接口10.1 嵌入式嵌入式Linux驅動程序開發(fā)基礎驅動程序開發(fā)基礎嵌入式系統原理及應用教程第10章10.4.3 網絡驅動程序分析網絡驅動程序分析1.初始化、清理網絡設備初始化、清理網絡設備網絡設備初始化的工作主要是確定硬件設備的存在,以及網絡設備初始化的工作主要是確定硬件設備的存在,以及將硬件設備加載到設備鏈表中,為網絡設備

22、的激活做準備。將硬件設備加載到設備鏈表中,為網絡設備的激活做準備。需要注意這兩個變量:需要注意這兩個變量:name和和owner。 2.打開和關閉網絡設備打開和關閉網絡設備 open函數主要用來完成對網絡設備中斷進行注冊、通過函數主要用來完成對網絡設備中斷進行注冊、通過配置物理接口初始化設備,以及為發(fā)送數據準備隊列。配置物理接口初始化設備,以及為發(fā)送數據準備隊列。10.1 嵌入式嵌入式Linux驅動程序開發(fā)基礎驅動程序開發(fā)基礎嵌入式系統原理及應用教程第10章3.中斷處理中斷處理網絡驅動程序的中斷處理函數在網絡設備激活時進行注冊,主要用于網絡驅動程序的中斷處理函數在網絡設備激活時進行注冊,主要用

23、于完成:現場保護及中斷屏蔽、讀取網絡設備寄存器信息及判斷中斷原完成:現場保護及中斷屏蔽、讀取網絡設備寄存器信息及判斷中斷原因并處理、恢復中斷現場。因并處理、恢復中斷現場。 函數首先需要獲得自旋鎖,然后將當前的寄存器地址保存下來,以便函數首先需要獲得自旋鎖,然后將當前的寄存器地址保存下來,以便返回的時候繼續(xù)進行被打斷的作業(yè);接著就是屏蔽所有的中斷,讀取返回的時候繼續(xù)進行被打斷的作業(yè);接著就是屏蔽所有的中斷,讀取中斷狀態(tài)寄存器并清除中斷狀態(tài)寄存器,然后就開始真正的中斷處理中斷狀態(tài)寄存器并清除中斷狀態(tài)寄存器,然后就開始真正的中斷處理了。了。 當發(fā)生接收中斷時,中斷函數調用當發(fā)生接收中斷時,中斷函數調

24、用dm9000_rx()函數。函數。 4.sk_buff結構結構 sk_buff的數據成員分為兩部分:的數據成員分為兩部分:l一部分是實際在網絡中要傳輸的部分,數據區(qū)(一部分是實際在網絡中要傳輸的部分,數據區(qū)(Packet date storage););l一部分由內核管理服務于結構鏈表。一部分由內核管理服務于結構鏈表。 10.1 嵌入式嵌入式Linux驅動程序開發(fā)基礎驅動程序開發(fā)基礎嵌入式系統原理及應用教程第10章還有一些常用的成員如:還有一些常用的成員如:sk_buff-tstamp: sk_buff-dev: sk_buff-protocol: 內核提供了一系列用于操作內核提供了一系列用

25、于操作sk_buff數據結構的函數,用數據結構的函數,用于分配、釋放、復制、克隆、擴展等功能,下面介紹于分配、釋放、復制、克隆、擴展等功能,下面介紹些常用的。些常用的。struct sk_buff *alloc_skb(unsigned int len,int priority)struct sk_buff *dev_alloc_skb(unsigned int len)10.1 嵌入式嵌入式Linux驅動程序開發(fā)基礎驅動程序開發(fā)基礎嵌入式系統原理及應用教程第10章5.數據發(fā)送處理數據發(fā)送處理6.數據接收處理數據接收處理 數據接收的主要工作有:檢查接收的到的數據包是否正確;根據數據數據接收的主

26、要工作有:檢查接收的到的數據包是否正確;根據數據被長度在內核空間為數據包申請被長度在內核空間為數據包申請sk_buff;把數據包復制到;把數據包復制到sk_buff,填寫相關成員后插入隊列;釋放網絡芯片中分配的緩沖區(qū)。填寫相關成員后插入隊列;釋放網絡芯片中分配的緩沖區(qū)。 7.其它處理接口其它處理接口 在網絡設備結構中還有一些函數接口需要實現,如:在網絡設備結構中還有一些函數接口需要實現,如:(1)get_stats(2)set_multicast_list(3)tx_tiemout10.1 嵌入式嵌入式Linux驅動程序開發(fā)基礎驅動程序開發(fā)基礎嵌入式系統原理及應用教程第10章10.5 設備驅動

27、實例設備驅動實例10.5.1 ADC設備驅動實例設備驅動實例ADC是比較簡單的字符設備,在此直接給出是比較簡單的字符設備,在此直接給出ADC的驅動的驅動程序源代碼和注釋說明。程序源代碼和注釋說明。10.5.2 PWM設備驅動實例設備驅動實例10.5.3 觸摸屏設備驅動實例觸摸屏設備驅動實例1.輸入子系統輸入子系統 在在Linux中,輸入子系統中,輸入子系統(Input Subsystem)是由輸入子系統是由輸入子系統設備驅動層、輸入子系統核心層設備驅動層、輸入子系統核心層(Input Core)和輸入子系和輸入子系統事件處理層統事件處理層(Event Handler)組成。組成。 10.1 嵌

28、入式嵌入式Linux驅動程序開發(fā)基礎驅動程序開發(fā)基礎嵌入式系統原理及應用教程第10章設備的驅動的實現步驟如下:設備的驅動的實現步驟如下:在驅動模塊加載函數中設置在驅動模塊加載函數中設置Input設備支持設備支持input子系子系統的哪些事件;統的哪些事件;將將Input設備注冊到設備注冊到input子系統中;子系統中;在在Input設備發(fā)生輸入操作時設備發(fā)生輸入操作時(如:鍵盤被按下如:鍵盤被按下/抬起、抬起、觸摸屏被觸摸觸摸屏被觸摸/抬起抬起/移動、鼠標被移動移動、鼠標被移動/單擊單擊/抬起時等抬起時等),提交所發(fā)生的事件及對應的鍵值提交所發(fā)生的事件及對應的鍵值/坐標等狀態(tài)。坐標等狀態(tài)。 在

29、提交輸入設備的事件后必須用下列方法使事件同在提交輸入設備的事件后必須用下列方法使事件同步,讓它告知步,讓它告知input系統,設備驅動已經發(fā)出了一個完系統,設備驅動已經發(fā)出了一個完整的報告:整的報告:void input_sync(struct input_dev *dev)10.1 嵌入式嵌入式Linux驅動程序開發(fā)基礎驅動程序開發(fā)基礎嵌入式系統原理及應用教程第10章2.觸摸屏驅動實現觸摸屏驅動實現S3C2440A芯片內部集成了觸摸屏接口并與芯片內部集成了觸摸屏接口并與ADC接口相連。接口相連。 S3C2440A提供的觸摸屏接口有提供的觸摸屏接口有4種處理模式,分別是:正常種處理模式,分別是:正常轉換模式、單獨的轉換模式、單獨的X/Y位置轉換模式、自動位置轉換模式、自動X/Y位置轉換位置轉換模式和等待中斷模式,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論