兩種方式 一 驅動程序執行方式 1.申請I/O端口 A 直接端口方式 check_region request_region B內存映射方式 check_mem_region request_mem_retion 然後隊端口地址映射 ioremap 2.注冊驅動 register_chrdev 申請主設備號,注冊驅動名,相關的操作. 3.探測中斷 A
兩種方式
一 驅動程序執行方式
1.申請I/O端口
A 直接端口方式
check_region
request_region
B內存映射方式
check_mem_region
request_mem_retion
然後隊端口地址映射
ioremap
2.注冊驅動
register_chrdev 申請主設備號,注冊驅動名,相關的操作.
3.探測中斷
A 內核探測
B 定制探測
C 直接根據I/O地址,分配相應的IRQ號
4.安裝中斷相應處理函數
request_irq(irq,(*)Handler()...)
A 共享中斷的處理函數
端口有中斷到,則判斷時不時本端口的中斷.若是.則填充緩沖區.同時wake_up_interruptible,喚起等待序列.
在read操作中的隊列由signal_pending喚醒,拷貝數據到用戶空間.
B 下半部中斷的處理函數
通過queue_task,執行隊列處理函數喚起中斷.
C 小任務中斷處理函數
通過tasklet_schedule執行小任務處理函數喚起中斷.
二 應用程序執行方式.
- 通過 ioperm 命令,例如,ioperm ( BASE, range , 1),調用內核,得到 I/O 地址空間的使用權;
- 通過一個發送請求指令,例如, outb(1, BASE ) ,
- 等待足夠的時間讓咖啡煮好,讓時間參數在命令行中被讀取是一件很好的事情
- 然後發送 out(0, BASE) 指令關掉咖啡機
- 在結束之前還應歸還並口 I/O 地址的使用權, ioperm(BASE,range,0) .
程序:/* coffee.c */
#include <asm/io.h> /*
linux-specific */
#ifdef __GLIBC__
# include <sys/perm.h>
#endif
int main(int argc, char **argv)
{
setuid(0); /* if we're setuid, force it on */
if(ioperm(0x378,1,1))
printf("error,we can't ioperm our ox378 port\n");
outb(0xff,0x378);
sleep(5);
outb(0,0x378);
if(ioperm(0x378,1,0))
printf("error,we can't ioperm our ox378 port\n");
exit(1);
}
三 在驅動程序中如何取得被其它驅動程序使用的並口
首先 cat /proc/ioports 看端口地址是分配給誰了.
然後看該名字的 ls -l /dev/port_name
找到主設備號和次設備號
然後 cat /proc/devices 看主設備好對應的驅動
然後rmmod 該驅動.
如果是編譯到了內核的驅動則只需在/lib/module/`uname -r`/kernel/drivers/ 刪除該名字的驅動,
則重起後,該驅動就不會暫用該端口了,但這個驅動的名字不一定在/proc/devices 中出現