簡體   English   中英

如何在Linux中訪問並行端口

[英]How to access Parallel port in Linux

在我的Linux機器(Debian Wheezy)上,我嘗試通過request_region()訪問並行端口,但它失敗了,因為系統已經加載了內核模塊parport ...

所以,我rmmod模塊lpppdevparport_pcparport 然后,我可以成功插入我的模塊。

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

在從內核rmmod那些模塊之前,我可以編寫並讀取這個寄存器。 然后我將這些模塊列入黑名單,在系統啟動時加載,我可以讀取和寫入這些寄存器,我的模塊也可以工作。 似乎parport_pcclearup功能做了一些使硬件無法使用的功能。 (至少端口的狀態與加載模塊之前的狀態不同)。

我的問題是為什么,我該怎么做才能恢復端口而不是重新加載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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM