1.常規分類:字元裝置,塊裝置,網路裝置
字元裝置:是一種按位元組來訪問的裝置,字元驅動則負責驅動字元裝置,這樣的驅動通常實現open,close,read等系統呼叫,例如:串列埠,led,按鍵
塊裝置:在大部分unix系統中,塊裝置定義為:以塊(通常是512位元組)為最小傳輸單位的裝置,塊裝置不能按位元組處理資料。
而linux則允許塊裝置傳送任意數目的位元組。因此,塊和字元裝置的區別僅僅是驅動的與核心的介面不同。常見的塊裝置包括硬碟,flash,sd卡等。
網路裝置:網路裝置可以是乙個硬體裝置,如網絡卡等;也可以是乙個純粹的軟體裝置,如回環介面lo,乙個網路介面負責傳送和接收資料報文。
2.匯流排分類法
usb裝置,pci裝置,平台匯流排裝置
硬體訪問實質
驅動程式控制裝置,主要是通過訪問裝置內的暫存器來達到控制目的,因此我們討論如何訪問硬體,就成了如何訪問這些暫存器。
位址對映
在linux系統中,不論是核心程式還是應用程式,都智慧型使用虛擬位址,而晶元手冊給出的暫存器位址或ram位址等都是實體地址,無法直接使用,因此我們讀寫暫存器的第一步就是講物理位址對映為虛擬位址。
1.動態對映
在驅動程式中採用
ioremap函式將物理位址對映為虛擬位址
函式原型: void *ioremap(physaddr, size);
2.靜態對映
所謂靜態對映,是指linux系統根據使用者事先指定的對映關係,在核心啟動後,自動的將物理位址對映為虛擬位址。
問題1:如何事先指定對映關係?
在靜態對映中,使用者是通過map_desc結構來指明實體地址與虛擬位址的對映關係。
struct map_desc ;
pfn:利用_phys_to_pfn(實體地址)可以計算出實體地址所在的物理頁幀號
問題2:核心啟動時,在什麼地方完成自動對映?
以s3c6410cpu為例:在arch/arm/mach-s3c64xx目錄下有乙個結構陣列
static struct map_desc s3c_iodesc __initdata = ;
裡面儲存的全是這種對映關係,目錄下還有個初始化函式如下:
內部呼叫iotable_init完成對映void __init s3c64xx_init_io(struct map_desc *mach_desc, int size)
暫存器讀寫
在完成位址對映後,就可以讀寫暫存器了,linux核心提供了一系列的函式用來讀寫暫存器。
unsigned ioread8(void *addr)
unsigned ioread16(void *addr)
unsigned ioread32(void *addr)
unsigned readb(address)
unsigned readw(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)
專題 Linux驅動開發前奏
硬體訪問技術 暫存器讀寫 驅動分類 常規分類法 字元裝置,塊裝置,網路裝置。驅動分類 匯流排分類法 usb裝置,pci裝置,平台匯流排裝置。字元裝置 字元裝置是一種按位元組來訪問的裝置,字元驅動則負責驅動字元裝置,這樣的驅動通常支援open,close,read,write系統呼叫。例如 串列埠,l...
R O R 開發前奏
裝好ruby以後,開啟命令列視窗輸入 ruby v 如果出現ruby的版本號 1.8.5 最新 就為安裝成功 出現版本號 1.2.2 最新 就為安裝成功,rails安裝在ruby目錄下 lib ruby gems 1.8 gems rails 1.2.2 如果你選用的開發ide是radrails的話...
linux驅動開發
這兩天在公司由於一直沒有太過於繁重的任務,於是便給分配了驅動開發的任務,之前一直不明白驅動開發和普通的嵌入式開發到底有什麼區別,然後有沒有經過系統的學習,於是就一直愣在那裡。不過慢慢的還是經過查資料,雖然 沒有編寫出來,但是對於系統的一些東西學習的終於有了一定的了解,感覺這個十分的重要,也為了給自己...