如何在Linux中访问并行端口

时间:2013-07-25 07:19:32

标签: linux parallel-port hardware-port

在我的Linux机器上(Debian Wheezy),我试图通过request_region()访问并行端口,但它失败了,因为系统已经加载了内核模块parport ...

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

但是,从基地址inb()返回0xff,无论写入什么值。

rmmod来自内核的那些模块之前,我可以编写并读取该寄存器。然后我将这些模块列入黑名单,在系统启动时加载,我可以读取和写入这些寄存器,我的模块也可以工作。似乎clearup的{​​{1}}函数做了一些使硬件无法使用的功能。 (至少端口的状态与加载模块之前的状态不同)。

我的问题是为什么,以及如何恢复端口而不是重新加载parport_pc

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

某些驱动程序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