[英]How to access Parallel port in Linux
在我的Linux機器(Debian Wheezy)上,我嘗試通過request_region()
訪問並行端口,但它失敗了,因為系統已經加載了內核模塊parport
...
所以,我rmmod
模塊lp
, ppdev
, parport_pc
和parport
。 然后,我可以成功插入我的模塊。
但是,從基地址inb()
返回0xff
,無論寫入什么值。
在從內核rmmod
那些模塊之前,我可以編寫並讀取這個寄存器。 然后我將這些模塊列入黑名單,在系統啟動時加載,我可以讀取和寫入這些寄存器,我的模塊也可以工作。 似乎parport_pc
的clearup
功能做了一些使硬件無法使用的功能。 (至少端口的狀態與加載模塊之前的狀態不同)。
我的問題是為什么,我該怎么做才能恢復端口而不是重新加載parport_pc
?
您可以使用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;
}
某些驅動程序mod阻止了對並行端口的訪問。 編輯/etc/modprobe.d/blacklist.conf文件並添加以下行,然后重新啟動linux。
blacklist ppdev
blacklist lp
blacklist parport_pc
blacklist parport
如果安裝了cups,你應該修改/etc/modules-load.d/cups-filters.conf:
#lp
#ppdev
#parport_pc
以下是一些細節: https : //stackoverflow.com/a/27423675/4350106
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.