歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網

並口

日期:2017/3/6 15:29:38   编辑:關於Unix
兩種方式 一 驅動程序執行方式 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 中出現

Copyright © Linux教程網 All Rights Reserved