在我的Linux机器上(Debian Wheezy),我试图通过request_region()
访问并行端口,但它失败了,因为系统已经加载了内核模块parport
...
所以,我rmmod
模块lp
,ppdev
,parport_pc
和parport
。然后,我可以成功插入我的模块。
但是,从基地址inb()
返回0xff
,无论写入什么值。
在rmmod
来自内核的那些模块之前,我可以编写并读取该寄存器。然后我将这些模块列入黑名单,在系统启动时加载,我可以读取和写入这些寄存器,我的模块也可以工作。似乎clearup
的{{1}}函数做了一些使硬件无法使用的功能。 (至少端口的状态与加载模块之前的状态不同)。
我的问题是为什么,以及如何恢复端口而不是重新加载parport_pc
?
答案 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