硬體訪問實質
驅動程式控制裝置,主要是通過訪問裝置內的暫存器來達到控制目的的,因此我們討論如何訪問硬體,就成了如何訪問這些暫存器。
訪問流程
1.位址對映
在linux系統中,無論是核心程式還是應用程式,都只能使用虛擬位址,而晶元手冊中給出的硬體暫存器位址或ram位址都是實體地址,無法直接使用。因此我們讀寫暫存器的第一步就是將它的物理位址對映為虛擬位址。
1.1.動態對映
所謂動態對映是指在驅動程式中採用ioremap函式將物理位址對映為虛擬位址。
原型:void *ioremap(physaddr, size)
引數:physaddr:待對映的實體地址
size:對映的區域長度
返回值:對映後的虛擬位址
1.2.靜態對映
所謂靜態對映是指linux系統根據使用者事先指定的對映關係,在核心啟動時自動地將物理位址對映為虛擬位址。
對映關係:
在靜態對映中,使用者通過map_desc結構來指明實體地址與虛擬位址的對映關係。
struct map_desc{
unsigned long virtual; //對映後的實體地址
unsigned long pfn; //實體地址所在的頁幀號
unsigned long long; //對映長度
unsigned int type; //對映的裝置型別
pfn:利用__phys_to_pfn(實體地址)可以計算實體地址所在的物理頁幀號
2.暫存器讀寫
在完成位址對映後,就可以讀寫暫存器了,linux核心提供了一系列函式,來讀寫暫存器。
unsigned ioread8(void *addr)
unsigned ioread16(void *addr)
unsigned ioread32(void *addr)
unsigned readb(address)
unsigned readw(address)
unsigned readl(address)
void iowrite8(u8 value, void *addr)
void iowrite16(u16 value, void *addr)
void iowrite32(u32 value, void *addr)
void writeb(unsigned value, address)
void writew(unsigned value, address)
void writel(unsigned value, address)
國嵌攻略 161 USB匯流排介紹
usb發展史 usb universal serial bus 通用序列匯流排,是一種外部匯流排標準。用於規範電腦與外部裝置的連線和通訊。usb是在1994年底由英特爾 康柏 ibm microsoft等多家公司聯合提出的。自1996年堆出後,已經成功替代了串列埠和並口。成為當今個人電腦和大量智慧型...
國嵌攻略 159 SPI子系統
spi 子系統架構 1.spi core核心 用於連線spi客戶驅動和spi主控制器驅動,並且提供了對應的註冊和登出的介面。2.spi controller driver主控制器驅動 用來驅動spi控制器。3.spi protocol drvier客戶驅動 用來驅動spi裝置 spi控制器驅動分析 ...
國嵌攻略 148 MTD系統架構
mtd裝置概述 flash在嵌入式系統中是必不可少的,它是bootloader linux核心和檔案系統的最佳載體。在linux核心中引入了mtd子系統為nor flash和nand flash裝置提供了統一的介面,從而使得flash驅動的設計大為簡化。mtd使用體驗 把系統燒寫到nand flas...