嵌入式系統(tǒng)原理及應(yīng)用教程第10章00資料_第1頁(yè)
嵌入式系統(tǒng)原理及應(yīng)用教程第10章00資料_第2頁(yè)
嵌入式系統(tǒng)原理及應(yīng)用教程第10章00資料_第3頁(yè)
嵌入式系統(tǒng)原理及應(yīng)用教程第10章00資料_第4頁(yè)
嵌入式系統(tǒng)原理及應(yīng)用教程第10章00資料_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、共二十九頁(yè)主講(zhjing)內(nèi)容第8章 嵌入式系統(tǒng)Boot Loader技術(shù)第9章 嵌入式Linux操作系統(tǒng)移植第10章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開發(fā)第11章 嵌入式Linux應(yīng)用(yngyng)程序設(shè)計(jì)共二十九頁(yè)10.1 嵌入式Linux驅(qū)動(dòng)程序開發(fā)(kif)基礎(chǔ)10.1.1 嵌入式Linux設(shè)備(shbi)驅(qū)動(dòng)程序分類靜態(tài)加載的驅(qū)動(dòng)程序動(dòng)態(tài)加載的驅(qū)動(dòng)程序 Linux將設(shè)備按照功能特性劃分為三種類型:字符設(shè)備,塊設(shè)備和網(wǎng)絡(luò)設(shè)備。10.1.2 最簡(jiǎn)單的內(nèi)核模塊1helloworld模塊源代碼2模塊的編譯3模塊的加載和卸載共二十九頁(yè)10.1 嵌入式Linux驅(qū)動(dòng)程序開發(fā)(kif)基礎(chǔ)10.

2、2 嵌入式Linux設(shè)備驅(qū)動(dòng)重要技術(shù)10.2.1 內(nèi)存與I/O端口 (1)內(nèi)核空間和用戶空間 (2)內(nèi)核中內(nèi)存分配內(nèi)核中獲取內(nèi)存的幾種方式如下。通過(guò)伙伴算法分配大片物理(wl)內(nèi)存通過(guò)slab緩沖區(qū)分配小片物理內(nèi)存非連續(xù)內(nèi)存區(qū)分配高端內(nèi)存映射固定線性地址映射共二十九頁(yè)(3)I/O端口 根據(jù)CPU體系結(jié)構(gòu)的不同,CPU對(duì)IO端口的編址方式有兩種:I/O映射方式(I/O-mapped)和內(nèi)存映射方式(Memory-mapped)。 下面(xi mian)主要討論一下內(nèi)存映射方式訪問(wèn)I/O端口的方法,我們稱之為I/O內(nèi)存操作。 I/O 內(nèi)存區(qū)必須在使用前分配 I/O內(nèi)存映射 訪問(wèn)I/O內(nèi)存 映射到用

3、戶空間 10.1 嵌入式Linux驅(qū)動(dòng)程序開發(fā)(kif)基礎(chǔ)共二十九頁(yè)10.2.2 同步機(jī)制 Linux內(nèi)核中包含的同步機(jī)制包括(boku):原子操作、信號(hào)量(semaphore)、讀寫信號(hào)量(rw_semaphore)、自旋鎖(spinlock)、大內(nèi)核鎖(Big Kernel Lock,BKL)、讀寫鎖(rwlock)、讀拷貝更新(Read-Copy Update,RCU)和seqlock(順序鎖)等。共二十九頁(yè)1.原子操作 原子操作主要用于實(shí)現(xiàn)資源計(jì)數(shù),很多引用計(jì)數(shù)(refcnt)就是通過(guò)原子操作實(shí)現(xiàn)的。原子類型定義如下:typedef struct volatile int count

4、er; atomic_t;原子操作通常用于實(shí)現(xiàn)資源的引用計(jì)數(shù) 2.信號(hào)量 信號(hào)量在創(chuàng)建時(shí)需要設(shè)置(shzh)一個(gè)初始值. 3.讀寫信號(hào)量 讀寫信號(hào)量有兩種實(shí)現(xiàn):一種是通用的,不依賴于硬件架構(gòu) 一種是架構(gòu)相關(guān)的共二十九頁(yè)讀寫信號(hào)量的相關(guān)API有:DECLARE_RWSEM(name)該宏聲明一個(gè)讀寫信號(hào)量name并對(duì)其進(jìn)行初始化。void init_rwsem(struct rw_semaphore *sem); 該函數(shù)(hnsh)對(duì)讀寫信號(hào)量sem進(jìn)行初始化。void down_read(struct rw_semaphore *sem); 在Linux中,每一個(gè)進(jìn)程都用一個(gè)類型為task_t

5、或struct task_struct的結(jié)構(gòu)來(lái)描述 共二十九頁(yè)4.自旋鎖 一個(gè)(y )執(zhí)行單元要想訪問(wèn)被自旋鎖保護(hù)的共享資源,必須先得到鎖,在訪問(wèn)完共享資源后,必須釋放鎖。 自旋鎖的API有:spin_lock_init(x);共二十九頁(yè)10.2.3 阻塞與非阻塞1.阻塞操作2.非阻塞操作10.2.4 時(shí)間問(wèn)題1.延時(shí)操作:(1)長(zhǎng)延時(shí)。(2)短延時(shí)2.內(nèi)核定時(shí)器內(nèi)核提供給驅(qū)動(dòng)許多函數(shù)來(lái)聲明、注冊(cè)、以及去除內(nèi)核定時(shí)器。 3.工作(gngzu)隊(duì)列采用缺省工作者線程來(lái)實(shí)現(xiàn)工作隊(duì)列 的API:INIT_WORK(_work, _func, _data)共二十九頁(yè) int schedule_work

6、(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)建自己的工作(gngzu)者線程和工作(gngzu)隊(duì)列,API:struct workqueue_struct *create_workqueue(const char *name) int queue_work(struct workq

7、ueue_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)共二十九頁(yè)10.2.5 中斷處理(chl)在Linux系統(tǒng)里,對(duì)中斷的處理是屬于系統(tǒng)核心部分,因而如果設(shè)別與系統(tǒng)之間以中

8、斷方式進(jìn)行數(shù)據(jù)交換,就必須把該設(shè)備的驅(qū)動(dòng)程序作為系統(tǒng)核心的一部分。設(shè)備驅(qū)動(dòng)程序通過(guò)調(diào)用request_irq函數(shù)來(lái)申請(qǐng)中斷,通過(guò)free_irq來(lái)釋放中斷。它們被定義為:#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_id);void free_irq(unsigned int irq, void *dev_id);共二十九頁(yè)函數(shù)的參數(shù)如下。

9、 unsigned int irq:請(qǐng)求的中斷號(hào)。irqreturn_t (*handler) :安裝的中斷處理函數(shù)指針。unsigned long flags:中斷處理的屬性(shxng)。 const char *dev_name:這個(gè)傳遞給request_irq的字串用在/proc/interrupts來(lái)顯示中斷的擁有者。 void *dev_id:用作共享中斷的指針。 共二十九頁(yè)10.3 字符設(shè)備驅(qū)動(dòng)程序字符設(shè)備驅(qū)動(dòng)程序可以分為三個(gè)主要組成部分:,自動(dòng)配置和初始化子程序,負(fù)責(zé)檢測(cè)所要驅(qū)動(dòng)的硬件設(shè)備是否存在和是否能正常工作。,服務(wù)于I/O請(qǐng)求的子程序,又稱為驅(qū)動(dòng)程序的上半部分。,中斷服務(wù)

10、子程序,又稱為驅(qū)動(dòng)程序的下半部分。10.3.1 字符設(shè)備驅(qū)動(dòng)結(jié)構(gòu)1.主次設(shè)備號(hào) :字符設(shè)備和塊設(shè)備通過(guò)文件系統(tǒng)中的名子來(lái)存取。 主編號(hào)標(biāo)識(shí)設(shè)備相連的驅(qū)動(dòng)。 次編號(hào)被內(nèi)核用來(lái)決定引用哪個(gè)設(shè)備。 設(shè)備編號(hào)在驅(qū)動(dòng)程序的內(nèi)部具有(jyu)固定的表示方式。 在建立驅(qū)動(dòng)時(shí),需要做的第一件事是獲取一個(gè)或多個(gè)設(shè)備編號(hào)來(lái)使用。在驅(qū)動(dòng)程序執(zhí)行的過(guò)程中,如果不希望在使用該設(shè)備,要及時(shí)的將設(shè)備編號(hào)釋放:共二十九頁(yè)2.驅(qū)動(dòng)相關(guān)數(shù)據(jù)結(jié)構(gòu) 大部分的基礎(chǔ)性的驅(qū)動(dòng)操作包括3個(gè)重要的內(nèi)核數(shù)據(jù)結(jié)構(gòu),它們是file_operations,file,和inode。 (1)文件操作(file_operations)file_operat

11、ion 結(jié)構(gòu)表示(biosh)了用戶程序怎樣對(duì)設(shè)備進(jìn)行操作。這個(gè)結(jié)構(gòu),定義在中,是一個(gè)函數(shù)指針的集合 struct module *owner。(2)文件結(jié)構(gòu)struct file定義于,是設(shè)備驅(qū)動(dòng)中第二個(gè)最重要的數(shù)據(jù)結(jié)構(gòu)。 (3)inode 結(jié)構(gòu)inode 結(jié)構(gòu)由內(nèi)核在內(nèi)部用來(lái)表示文件。 共二十九頁(yè)3.自動(dòng)配置和初始化(1)初始化。當(dāng)驅(qū)動(dòng)程序?qū)⒈患虞d的時(shí)候,首先(shuxin)會(huì)調(diào)用初始函數(shù)進(jìn)行自動(dòng)配置。 (2)清除處理。 4.中斷處理 如果需要驅(qū)動(dòng)程序具有中斷處理的能力,必須進(jìn)行中斷申請(qǐng)。 從request_irq返回給請(qǐng)求函數(shù)的返回值是0指示成功,為負(fù)表示錯(cuò)誤碼。 中斷處理可以在驅(qū)動(dòng)初始

12、化時(shí)安裝或者在設(shè)備第一次打開時(shí)。 在中斷的使用過(guò)程中還可以對(duì)其進(jìn)行使能和禁止操作 共二十九頁(yè)10.3.2 字符設(shè)備驅(qū)動(dòng)實(shí)例LED驅(qū)動(dòng)1.LED驅(qū)動(dòng)程序分析 本驅(qū)動(dòng)程序文件名為led2440.c2.驅(qū)動(dòng)模塊加入內(nèi)核使用命令:cp -f led2440.c /linux-2.6.32.4/drivers/char/ 編輯(binj)Kconfig文件:修改Makefile文件:配置、編譯內(nèi)核 執(zhí)行make zImage內(nèi)核映像和驅(qū)動(dòng)程序模塊會(huì)先后被編譯完畢。將內(nèi)核下載至開發(fā)板;將驅(qū)動(dòng)程序模塊加入到根文件系統(tǒng)后,下載至開發(fā)板。這樣就可以調(diào)用驅(qū)動(dòng)程序進(jìn)行演示了。共二十九頁(yè)3.LED驅(qū)動(dòng)演示(1)驅(qū)動(dòng)程

13、序模塊(m kui)加載到內(nèi)核。進(jìn)入驅(qū)動(dòng)程序模塊所在目錄,執(zhí)行:insmod -f led2440.ko(2)建立設(shè)備節(jié)點(diǎn)。也就是建立用戶程序關(guān)聯(lián)到驅(qū)動(dòng)程序的途徑 (3)演示程序。建立一個(gè)LED控制的簡(jiǎn)單演示程序led2440test 共二十九頁(yè)10.4 網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序10.4.1 Linux 網(wǎng)絡(luò)設(shè)備簡(jiǎn)介1.Linux網(wǎng)絡(luò)驅(qū)動(dòng)基礎(chǔ)2.DM9000控制器10.4.2 網(wǎng)絡(luò)驅(qū)動(dòng)核心數(shù)據(jù)結(jié)構(gòu)分成幾個(gè)方面對(duì)其進(jìn)行介紹 通用信息硬件(yn jin)描述信息協(xié)議相關(guān)信息設(shè)備操作函數(shù)接口共二十九頁(yè)10.4.3 網(wǎng)絡(luò)驅(qū)動(dòng)程序分析1.初始化、清理網(wǎng)絡(luò)設(shè)備網(wǎng)絡(luò)設(shè)備初始化的工作主要是確定硬件設(shè)備的存在,以及將硬

14、件設(shè)備加載到設(shè)備鏈表中,為網(wǎng)絡(luò)設(shè)備的激活做準(zhǔn)備。需要注意這兩個(gè)變量:name和owner。 2.打開和關(guān)閉網(wǎng)絡(luò)設(shè)備 open函數(shù)主要用來(lái)(yn li)完成對(duì)網(wǎng)絡(luò)設(shè)備中斷進(jìn)行注冊(cè)、通過(guò)配置物理接口初始化設(shè)備,以及為發(fā)送數(shù)據(jù)準(zhǔn)備隊(duì)列。共二十九頁(yè)3.中斷處理網(wǎng)絡(luò)驅(qū)動(dòng)程序的中斷處理函數(shù)在網(wǎng)絡(luò)設(shè)備激活時(shí)進(jìn)行注冊(cè),主要用于完成:現(xiàn)場(chǎng)保護(hù)及中斷屏蔽、讀取網(wǎng)絡(luò)設(shè)備寄存器信息及判斷中斷原因并處理、恢復(fù)中斷現(xiàn)場(chǎng)。 函數(shù)首先需要獲得自旋鎖,然后將當(dāng)前的寄存器地址保存下來(lái),以便返回的時(shí)候繼續(xù)進(jìn)行被打斷的作業(yè);接著就是屏蔽所有的中斷,讀取中斷狀態(tài)寄存器并清除中斷狀態(tài)寄存器,然后就開始真正(zhnzhng)的中斷處理了。

15、 當(dāng)發(fā)生接收中斷時(shí),中斷函數(shù)調(diào)用dm9000_rx()函數(shù)。 4.sk_buff結(jié)構(gòu) sk_buff的數(shù)據(jù)成員分為兩部分:一部分是實(shí)際在網(wǎng)絡(luò)中要傳輸?shù)牟糠?,?shù)據(jù)區(qū)(Packet date storage);一部分由內(nèi)核管理服務(wù)于結(jié)構(gòu)鏈表。 共二十九頁(yè)還有一些常用的成員如:sk_buff-tstamp: sk_buff-dev: sk_buff-protocol: 內(nèi)核提供了一系列用于操作sk_buff數(shù)據(jù)結(jié)構(gòu)的函數(shù),用于分配、釋放、復(fù)制(fzh)、克隆、擴(kuò)展等功能,下面介紹些常用的。struct sk_buff *alloc_skb(unsigned int len,int priority)

16、struct sk_buff *dev_alloc_skb(unsigned int len)共二十九頁(yè)5.數(shù)據(jù)發(fā)送處理6.數(shù)據(jù)接收處理 數(shù)據(jù)接收的主要工作有:檢查接收的到的數(shù)據(jù)包是否正確;根據(jù)數(shù)據(jù)被長(zhǎng)度在內(nèi)核空間為數(shù)據(jù)包申請(qǐng)sk_buff;把數(shù)據(jù)包復(fù)制到sk_buff,填寫相關(guān)成員后插入隊(duì)列;釋放網(wǎng)絡(luò)芯片中分配的緩沖區(qū)。 7.其它處理接口 在網(wǎng)絡(luò)設(shè)備結(jié)構(gòu)中還有一些函數(shù)(hnsh)接口需要實(shí)現(xiàn),如:(1)get_stats(2)set_multicast_list(3)tx_tiemout共二十九頁(yè)10.5 設(shè)備驅(qū)動(dòng)實(shí)例10.5.1 ADC設(shè)備驅(qū)動(dòng)實(shí)例ADC是比較簡(jiǎn)單的字符(z f)設(shè)備,在此

17、直接給出ADC的驅(qū)動(dòng)程序源代碼和注釋說(shuō)明。10.5.2 PWM設(shè)備驅(qū)動(dòng)實(shí)例10.5.3 觸摸屏設(shè)備驅(qū)動(dòng)實(shí)例1.輸入子系統(tǒng) 在Linux中,輸入子系統(tǒng)(Input Subsystem)是由輸入子系統(tǒng)設(shè)備驅(qū)動(dòng)層、輸入子系統(tǒng)核心層(Input Core)和輸入子系統(tǒng)事件處理層(Event Handler)組成。 共二十九頁(yè)設(shè)備的驅(qū)動(dòng)的實(shí)現(xiàn)步驟如下:在驅(qū)動(dòng)模塊加載函數(shù)中設(shè)置Input設(shè)備支持input子系統(tǒng)的哪些(nxi)事件;將Input設(shè)備注冊(cè)到input子系統(tǒng)中;在Input設(shè)備發(fā)生輸入操作時(shí)(如:鍵盤被按下/抬起、觸摸屏被觸摸/抬起/移動(dòng)、鼠標(biāo)被移動(dòng)/單擊/抬起時(shí)等),提交所發(fā)生的事件及對(duì)應(yīng)的

18、鍵值/坐標(biāo)等狀態(tài)。 在提交輸入設(shè)備的事件后必須用下列方法使事件同步,讓它告知input系統(tǒng),設(shè)備驅(qū)動(dòng)已經(jīng)發(fā)出了一個(gè)完整的報(bào)告:void input_sync(struct input_dev *dev)共二十九頁(yè)2.觸摸屏驅(qū)動(dòng)實(shí)現(xiàn)(shxin)S3C2440A芯片內(nèi)部集成了觸摸屏接口并與ADC接口相連。 S3C2440A提供的觸摸屏接口有4種處理模式,分別是:正常轉(zhuǎn)換模式、單獨(dú)的X/Y位置轉(zhuǎn)換模式、自動(dòng)X/Y位置轉(zhuǎn)換模式和等待中斷模式,在此實(shí)現(xiàn)自動(dòng)X/Y位置轉(zhuǎn)換模式和等待中斷模式。 a、驅(qū)動(dòng)的加載和卸載:b、中斷服務(wù)以及觸摸屏狀態(tài)、坐標(biāo)的轉(zhuǎn)換。共二十九頁(yè)觸摸屏轉(zhuǎn)換過(guò)程為:第一步,如果觸摸屏接收到觸摸,則進(jìn)入updown_ISR,如果能獲取ADC_LOCK則調(diào)用(dioyng)touch_timer_fire,啟動(dòng)ADC;第二步ADC轉(zhuǎn)換,如果小于四次繼

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論