硬體訪問技術
暫存器讀寫
驅動分類-常規分類法:字元裝置,塊裝置,網路裝置。
驅動分類-匯流排分類法:usb裝置,pci裝置,平台匯流排裝置。
字元裝置:字元裝置是一種按位元組來訪問的裝置,字元驅動則負責驅動字元裝置,這樣的驅動通常支援open,close,read,write系統呼叫。例如:串列埠,led,按鍵。
塊裝置:在大部分unix系統中,塊裝置定義為以塊(通常為512位元組)為最小傳輸單位的裝置,塊裝置不能按位元組處理資料。而linux則允許塊裝置傳送任意數目的位元組。因此,塊裝置和字元裝置的區別僅僅是驅動的與核心的介面不同。常見的塊裝置包括硬碟,flash,sd卡等。
網路介面裝置:網路介面可以是乙個硬體裝置,如網絡卡;但也可以是乙個純粹的軟體裝置,比如回環介面。乙個網路介面負責傳送和接收資料報文。
驅動學習方法:驅動模型,硬體操作。
驅動學習切忌:驅動學習初期(前半年)請不要過多的去閱讀核心**!
硬體訪問實質:
驅動程式控制裝置,主要是通過訪問裝置內的暫存器來達到控制的目的,因此我們討論如何訪問硬體,就成了如何訪問這些暫存器了。
靜態對映
靜態對映:所謂靜態對映,是指linux系統根據使用者事先指定的對映關係,在核心啟動時,自動將物理位址對映為虛擬位址。
如何事先指定對映關係?將對映植入核心**:核心啟動時,在什麼地方完成自動對映?
將對映**寫入核心檔案(cpu關聯檔案)中,
在靜態對映中,使用者是通過map_desc
結構來指明實體地址與虛擬位址的對映關係。
第一是填充如下結構(以下結構)
struct map_desc ;
pfn:利用__phys_to_pfn(paddr)
可以計算出實體地址所在的物理頁幀號。
第二是填充好結構後還得告訴linux核心(將填充好的結構新增到對應陣列中的尾部)
(例如arch/arm/mach-s3c2440/mach-smdk2440.c)(例如arch/arm/mach-s5p64x0/cpu.c)
static
struct map_desc smdk2440_iodesc __initdata = , , ,
};
static
void __init mini2440_map_io(void)
static
void __init smdk2440_map_io(void)
動態對映
動態對映:ioremap()
動態對映:所謂動態對映,是指在驅動程式中採用ioremap
函式將物理位址對映為虛擬位址。
原型:void * ioremap (physaddr, size);
返回值:對映後的虛擬位址。
unsigned ioread8(void *addr);
unsigned ioread16(void *addr);
unsigned ioread32(void *addr);
unsigned readb(address);
unsigned readw(address);
unsigned readl(address);
unsigned iowrite8(u8 value, void *addr);
unsigned iowrite16(u16 value, void *addr);
unsigned iowrite32(u32 value, void *addr);
unsigned writeb(unsigned value, address);
unsigned writew(unsigned value, address);
unsigned writel(unsigned value, address);
linux驅動開發前奏
1.常規分類 字元裝置,塊裝置,網路裝置 字元裝置 是一種按位元組來訪問的裝置,字元驅動則負責驅動字元裝置,這樣的驅動通常實現open,close,read等系統呼叫,例如 串列埠,led,按鍵 塊裝置 在大部分unix系統中,塊裝置定義為 以塊 通常是512位元組 為最小傳輸單位的裝置,塊裝置不能...
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驅動開發
這兩天在公司由於一直沒有太過於繁重的任務,於是便給分配了驅動開發的任務,之前一直不明白驅動開發和普通的嵌入式開發到底有什麼區別,然後有沒有經過系統的學習,於是就一直愣在那裡。不過慢慢的還是經過查資料,雖然 沒有編寫出來,但是對於系統的一些東西學習的終於有了一定的了解,感覺這個十分的重要,也為了給自己...