2013-07-25 62 views
1

在我的Linux機器(Debian的喘息),我試圖通過request_region()訪問並口,但失敗了,因爲系統已經加載的內核模塊parport ...如何訪問並行端口在Linux中

所以, I rmmod模塊lp,ppdev,parport_pcparport。然後,我可以成功插入我的模塊。

但是,從基地址inb()返回的0xff,無論寫什麼值。

之前rmmod這些模塊來自內核,我可以寫和讀這個寄存器。然後,我將這些模塊加入系統啓動時加載的黑名單中,我可以讀寫這些寄存器,並且我的模塊也可以工作。看起來,parport_pcclearup功能做了一些使硬件無法使用的東西。 (至少端口的狀態與載入模塊之前的狀態不一樣)。

我的問題是爲什麼,我該怎麼做才能恢復端口而不是重新加載parport_pc

+2

爲什麼你需要一個內核模塊來訪問並行端口?你可以使用Linux提供的界面嗎? –

+0

我的意圖是更好地理解硬件,所以我想通過儘可能簡單的方法在最低級別訪問它。是的,我可以使用Linux提供的parport,但問題是我不能不使用它。 –

回答

2

您可以使用C編寫一個小程序,通過outb和inb函數直接讀寫並行端口上的引腳。然後,您可以簡單地從其他腳本的shelling命令行調用C程序。通常,(默認情況下)地址0x378是內存中並行端口LPT0的地址,因此您只需使用inb和outp讀取/寫入此地址即可。例如:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <asm/io.h> 

#define base 0x378 //LPT0 

//to compile: gcc -O parport.c -o parport 
//after compiling, set suid: chmod +s parport then, copy to /usr/sbin/ 


int main(void) { 
    if(ioperm(base,1,1)) 
    fprintf(stderr, "Couldn't open parallel port"), exit(1); 

    outb(255,base); //set all pins hi 
    sleep(5); 
    outb(0,base); //set all pins lo 

    return 0; 
} 
+0

感謝您的回答。但可能你不明白我的意思。我知道可以從用戶空間訪問並行端口。 (也來自內核空間)。但是,如果你首先嚐試使用parport_pc,那麼我的確嘗試過了,這個程序無法正常工作。 –

1

某些驅動程序mod已阻止您訪問並行端口。 編輯/etc/modprobe.d/blacklist.conf文件並添加以下行,然後重新啓動您的linux。

blacklist ppdev 
blacklist lp 
blacklist parport_pc 
blacklist parport 

而且如果安裝了杯子,你應該修改/etc/modules-load.d/cups-filters.conf:

#lp 
#ppdev 
#parport_pc 

下面是一些細節: https://stackoverflow.com/a/27423675/4350106