1

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

所以,我的rmmod模块lp,,ppdev和。然后,我可以成功插入我的模块。parport_pcparport

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

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

我的问题是为什么,我应该怎么做才能恢复端口而不是重新加载parport_pc

4

2 回答 2

2

您可以使用 C 编写一个小程序,该程序将通过 outb 和 inb 函数直接从并行端口上的引脚读取和写入。然后,您可以简单地从其他脚本的 shell 命令行调用 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;
}
于 2013-07-25T19:01:14.430 回答
1

某些驱动程序模块已阻止您访问并行端口。编辑 /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

于 2014-12-11T13:12:33.803 回答