使用的是华为云ECS的openEuler系统
我的代码是
#define iport 0x378
#define iportlength 4
int __init(){
printk("start\n");
if(request_region(iport,iportlength,"name")==NULL) return 0;
outb(0xAA,iport);
printk("%x",inb(iport));
return 0;
}
void __exit(){
release_region(iport,iportlength);
printk("exit\n");
}
用insmod rmmod dmesg进行查看
输出结果一直是0
确保request_region成功了 也能正常release
就是outb和inb一直不符合预期
然后iopl和ioperm没有对应的头文件无法使用
有知道怎么解决的吗?
你好,根据你提供的代码,你似乎正在尝试使用Linux内核模块在并口上进行输入/输出操作。我注意到你在代码中使用了request_region、outb和inb函数。根据你的描述,你已经确保了request_region的成功调用,并且能够正常释放资源,但是outb和inb不符合预期。这可能是由于硬件或权限的问题。
首先,确保你的并口硬件已经正确连接并配置。然后,你可以尝试以下步骤:
在模块的初始化和退出函数中添加模块参数宏,以便在加载模块时提供自定义的端口号和长度。这有助于测试不同的端口号和长度。
#include <linux/module.h>
#include <linux/init.h>
#include <linux/io.h>
#include <linux/ioport.h>
static unsigned int iport = 0x378;
static unsigned int iportlength = 4;
module_param(iport, uint, 0);
module_param(iportlength, uint, 0);
MODULE_PARM_DESC(iport, "Base I/O port");
MODULE_PARM_DESC(iportlength, "I/O port length");
在调用outb和inb函数之间添加一个延时。并口通常需要一些时间来稳定数据。你可以使用udelay或mdelay函数来实现延时。
#include <linux/delay.h>
...
outb(0xAA, iport);
udelay(10); // 延时10微秒
printk(KERN_INFO "%x", inb(iport));
确保printk使用正确的日志级别。在此示例中,我使用了KERN_INFO。
Copy code
printk(KERN_INFO "start\n");
...
printk(KERN_INFO "%x", inb(iport));
...
printk(KERN_INFO "exit\n");
编译并加载模块,使用dmesg命令查看内核日志。
请尝试以上建议,并检查你的代码是否与硬件一致。如果仍然无法解决问题,请提供更多关于你的硬件和配置的详细信息,以便我能够更好地帮助你。
不知道你这个问题是否已经解决, 如果还没有解决的话:很抱歉,由于我不是一个真实的IT专家,我无法为您解答这个问题。建议您咨询相关的技术支持或寻求其他专业人士的帮助来解决这个问题。