让硬体动起来﹗_第1页
让硬体动起来﹗_第2页
让硬体动起来﹗_第3页
让硬体动起来﹗_第4页
让硬体动起来﹗_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、讓硬體動起來驅動與硬體的界面1常用的系統資源I/O端口I/O內存中斷DMA內存2系統編址統一編址外設端口和主存單元的位址統一編址,即外設界面的暫存器就相當于主存單元。對CPU來說,沒有端口和內存的區別,CPU使用同一套硬體指令。獨立編址外設端口和主存單元的位址分別編址,是兩個不同的位址空間。CPU使用兩套不同的硬體指令分別訪問主存單元和外設暫存器。3I/O端口和I/O內存I/O端口就是映射到端口位址空間的外設暫存器(I/O映射)。I/O內存就是映射到內存位址空間的外設暫存器(內存映射)。 I/O端口和I/O內存統稱為I/O暫存器。4I/O暫存器和常規內存的區別硬體暫存器和內存非常相似,在CPU

2、看來幾乎沒有什麼區別,但在編程實現上還是有差異的,應特別注意不恰當的優化而帶來的非預期的I/O動作。驅動保證不使用高速緩存(禁用緩存)訪問I/O暫存器不重新排序(內存屏障)5分發I/O端口#includeint check_region(unsigned long start, unsigned long len);struct resource *request_region(unsigned long start, unsigned long len, char *name);void release_region(unsigned long start, unsigned long le

3、n);6check_region用來檢查是否可以分發某個端口範圍,如果不可以則返回一個負的錯誤編碼。request_region完成真正的端口範圍分發,成功則返回一個非空指針。release_region在驅動完成任務后被調用,以便釋放分發的端口。7訪問I/O端口驅動程式請求了需要使用的I/O端口範圍后,它必須讀寫這些端口。大多數的硬體把8位、16位、32位的端口區分開來對待。Linux內核頭文件中定義了一些訪問I/O端口的內聯函數。8I/O端口訪問函數unsigned inb(unsigned port);Void oub(unsigned char byte, unsigned port)

4、;Unsigned inw(unsigned port);Void outw(unsigned short word, unsigned port);Unsigned inl(unsigned port);Void outl(unsigned longword, unsigned port);9分發I/O內存int check_mem_region(unsigned long start, unsigned long len);void request_mem_region(unsigned long start, unsigned long len, char *name);release_

5、mem_region(unsigned long start, unsigned long len);10訪問I/O內存I/O內存經由頁表訪問,首先安排物理位址使其對驅動程式可見(調用ioremap)。I/O內存不經由頁表訪問,I/O內存就像I/O端口一樣,可以直接用適當形式的包裝函數來訪問。X86上內存經由頁表訪問。11軟體映射的I/O內存大多數平台都不直接映射I/O內存,而透過MMU進行管理。所以軟體看到的只是虛擬內存空間。為了訪問I/O內存,必須有一種把物理內存轉化到虛擬內存的機製。這就是ioremap(和iounmap)要做的事情。ioremap將一個已知 的物理位址轉換城虛擬位址供軟

6、體使用。Void ioremap(unsigned long phys_addr, unsigned long size);12訪問I/O內存無論是經由頁表還是直接訪問I/O內存,都不應該直接對I/O指針取值,而要使用下列包裝函數unsigned readb(address);unsigned readw(address);unsigned readl(address);void writeb(unsigned value, address);void writew(unsigned value, address);Void writel(unsigned value, address);13

7、中斷中斷略一個驅動程式只需要為它自己設備的中斷註冊一個處理函數,系統會在適當的時候調用它。中斷號是非常珍貴的系統資源,模塊要在使用前先請求一個中斷通道,在使用后釋放它。14申請中斷號int request_irq(unsigned int irq,void(*handler)(int,void*,struct pt_regs*),unsigned long flags,const char *dev_name,void *dev_id);void free_irq(unsigned int irq, void *dev_id);15unsigned int irq要請求的中斷號void (*h

8、andle)(int, void *, struct pt_regs *)中斷處理函數指針unsigned long flags與中斷有關的位掩碼const char *dev_name在proc/interrupts顯示中斷擁有者的字元串void *dev_id這個指針用于共享的中斷信號線16申請、釋放中斷的時機調用request_irq的正確位置應該是在設備第一次打開、硬體被告知產生中斷之前。調用free_irq的位置是在最後一次關閉設備、硬體被告知不要再中斷處理器之后。17中斷處理程式的實現void test_interrupt(int irq, void *dev_id, struct

9、 pt_regs *regs) 中斷處理函數是一個普通的函數,沒有什麼特別的地方。但由於是在中斷期間營運,不與任何進程上下文相關,因而受到一些限制不能像用戶空間發送和接收數據,不能做任何可能發生睡眠的操作等。18中斷共享由於中斷信號線非常珍貴,所以共享中斷是難以避免的請求中斷時,必須指定flags參數中的SA_SHIRQ位。dev_in參數必須時唯一的,不能被置成NULL內核為每個中斷維護一個共享處理程式的列表,這些處理程式的dev_id就用來標識不同的處理程式。19注意事項當兩個或更多的驅動程式共享同一根中斷信號線時,共享的處理程式必須能夠識別屬于自己的中斷,並且在自己的設備沒有中斷的時候迅

10、速退出。所以,判斷中斷來源是共享的中斷處理程式首先要做的事情。20直接內存訪問(DMA)概念略。雖然一般的系統上都有一定的DMA通道供設備使用,但由於系統的DMA通道相當珍貴,而目前很多PCI設備都帶有自己的DMA控制單元,所以實際實現時傾向于使用設備的DMA控制單元,我們這裡就以PCI設備上的DMA控制單元為例。(ISA設備通常使用系統的DMA控制單元)21DMA的實現模式一1. 在進程調用read時,驅動程式的方法分發一個DMA緩沖區,隨后指示硬體傳輸它的數據。進程進入睡眠。2. 硬體將數據寫入DMA緩沖區並在完成時產生一個中斷。3. 中斷處理程式獲得輸入數據,應答中斷,最後喚醒進程讀取數

11、據。22DMA的實現模式二硬體發出中斷來通知新的數據已經到達。中斷處理程式分發一個緩沖區並通知硬體將數據傳往何處。外圍設備將數據寫入緩沖區,然後在完成時發出另一個中斷處理程式分發新的數據,喚醒相關進程,然後處理一些雜務。23一個陌生的概念DMA傳輸需要DMA映射來分發一個DMA緩沖區並為該緩沖區生成一個能夠被設備訪問的位址。匯流排位址有些平台使用映射暫存器來映射物理位址,而映射暫存器就相當于外設的虛擬內存。這個外設虛擬內存位址就是匯流排位址。X86平台的匯流排位址就是物理位址。24一個緩沖區時的映射函數dma_addr_tpci_map_single(struct pci_dev *pdev,

12、 void *buffer, size_t size, int direction);Void pci_unmap_single(struct pci_dev *pdev, dma_addr_t bus_addr, size_t size, int direction);25DMA緩沖區(流式映射)DMA傳輸需要一個緩沖區來完成數據交換,但緩沖區是有一定限制的。緩沖區的傳輸方向必須和映射時給定的方向像匹配。一旦緩沖區被映射,它就屬于設備而不再屬于處理器了。在DMA仍然進行時,緩沖區不能被撤銷映射。26內存概念略。內存分發標誌GFP_KERNELGFP_ATOMIC內存區段可用于DMA的內存常規內存高端內存27GFP_KERNEL標誌表示內存分發是代表營運在內核空間的進程執行的,如果目前空閒內存較少,系統就將當前進程轉入睡眠。因此,使用GFP_KERNEL標誌分發內存的函數必須是可重入的。GFP_ATOMIC標誌是內存分發在進程上下文之外被調用時使用(例如中斷處理程式),不會引起當前進程睡眠。系統一般會預留一些空閒頁面給原子分發使用。28常規內存通常的內存分發都發生在常規內存,但透過設置標誌也可以分發其它區段的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论