Linux驅動開發雜記(0x07)
阿新 • • 發佈:2018-12-20
1 申請I/O 端⼝:
在驅動還沒獨佔裝置之前,不應對端⼝進⾏操作。核心提供了⼀個註冊接⼝,以允許驅動宣告其需要的端⼝:
/* request_region告訴核心:要使⽤first開始的n個端⼝。引數name為裝置名。
如果分配成功返回值是⾮NULL;否則無法使用需要的埠(/proc/ioports包含了系統當前所有埠的分配資訊,
若request_region分配失敗時,可以檢視該檔案,看誰先用了你要的埠) */
struct resource *request_region(unsigned long first, unsigned long n, const char *name);
2 訪問IO端⼝:
在驅動成功請求到I/O 端⼝後,就可以讀寫這些端⼝了。⼤部分硬體會將8位、16位和32位端⼝區分開,⽆法像訪問記憶體那樣混淆使⽤。驅動程式必須調⽤不同的函式來訪問不同⼤⼩的端⼝。 Linux 核心頭⽂件(體系依賴的頭⽂件<asm/io.h>) 定義了下列行內函數來存取I/O端⼝:
/* inb/outb:讀/寫位元組端⼝(8位寬)。有些體系將port引數定義為unsigned long;
⽽有些平臺則將它定義為unsigned short。inb的返回型別也是依賴體系的 */
unsigned inb(unsigned port);
void outb(unsigned char byte, unsigned port);
/* inw/outw:讀/寫字端⼝(16位寬) */
unsigned inw(unsigned port);
void outw(unsigned short word, unsigned port);
/* inl/outl:讀/寫32位端⼝。longword也是依賴體系的,有的體系為unsigned long;⽽有的為unsigned int */
unsigned inl(unsigned port);
void outl(unsigned longword, unsigned port);
3 釋放IO端⼝:
/* ⽤完I/O端⼝後(可能在模組解除安裝時),應當調⽤release_region將I/O端⼝返還給系統。
引數start和n應與之前傳遞給request_region⼀致 */
void release_region(unsigned long start, unsigned long n);