我试图了解内存映射IO和端口映射IO。我在网上找到了以下代码,该代码试图在端口映射的IO中写入和读取可用内存地址。
#define IOSTART 0x200
#define IOEXTEND 0x40
#include <linux/module.h>
#include <linux/ioport.h>
#include <linux/io.h>
#include <linux/init.h>
static unsigned long iostart = IOSTART, ioextend = IOEXTEND, ioend;
module_param(iostart, ulong, S_IRUGO);
module_param(ioextend, ulong, S_IRUGO);
static int __init my_init(void)
{
unsigned long ultest = (unsigned long)100;
ioend = iostart + ioextend;
pr_info(" requesting the IO region from 0x%lx to 0x%lx\n",
iostart, ioend);
if (!request_region(iostart, ioextend, "my_ioport")) {
pr_info("the IO REGION is busy, quitting\n");
return -EBUSY;
}
pr_info(" writing a long=%ld\n", ultest);
outl(ultest, iostart);
ultest = inl(iostart);
pr_info(" reading a long=%ld\n", ultest);
return 0;
}
static void __exit my_exit(void)
{
pr_info(" releasing the IO region from 0x%lx to 0x%lx\n",
iostart, ioend);
release_region(iostart, ioextend);
}
module_init(my_init);
module_exit(my_exit);
MODULE_AUTHOR("Jerry Cooperstein");
MODULE_LICENSE("GPL v2");
为什么读取的数据与写入的数据不同。您能帮我理解吗?
[12336.695852] requesting the IO region from 0x200 to 0x240
[12336.695854] writing a long=100
[12336.695869] reading a long=4294967295