1. 程式人生 > >Linux驅動開發雜記(0x07)

Linux驅動開發雜記(0x07)

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);