我正在尝试编写一个ioremap内核模块- X86 PC。此模块将从串口读取值。如何在这里找到SERIAL_ADDR,SERIAL_SIZE?我的驱动程序读取端口值正确吗?我的代码有什么问题吗?SERIAL_ADDR和串行大小是否由硬件制造商固定?
int device_init()
{
void *sPort;
int ret;
ret = register_chrdev(device_major, DEVICE_NAME, &fops);
if(ret < 0) {
printk(KERN_ALERT "serial: cannot obtain major number %d.\n", device_major);
return ret;
}
if(request_mem_region (SERIAL_ADDR,SERIAL_SIZE, "SERIAL Driver") == NULL)
{
printk("Failed to request memory region!\n");
device_exit();
return 1;
}
sPort = ioremap(SERIAL_ADDR, SERIAL_SIZE);
printk("%X\n", ioread32(sPort));
}
*$ cat /proc/ioports
0000-0cf7 : PCI Bus 0000:00
0000-001f : dma1
0020-0021 : pic1
0040-0043 : timer0
0050-0053 : timer1
0060-0060 : keyboard
0064-0064 : keyboard
0070-0077 : rtc0
0080-008f : dma page reg
00a0-00a1 : pic2
00c0-00df : dma2
00f0-00ff : fpu
03c0-03df : vga+
03f8-03ff : serial*proc文件如何知道串行- 0x3f8到0x3ff的地址范围?因此,串行端口的大小应该是- (0x3ff - 0x3f8) +1,即8?SERIAL_SIZE是8,对吗?但是,这里的基本地址应该是什么?基本地址是- 0x3f8吗?在我看来不像个基本地址?我需要SERIAL_ADDR?请帮帮忙。
发布于 2014-05-13 13:30:28
I/O端口不是内存地址。换句话说,x86 I/O端口有一个与内存完全不同的地址空间。与内存没有重叠。在I/O端口上操作时使用一组不同的CPU指令("IN“、"OUT")。I/O端口由设备驱动程序“发现”,然后使用“request_region”在内核中注册/保留;例如,请参阅内核源代码中的serial8250_request_std_resource()。
不要将此与“内存映射I/O”混淆,其中I/O区域被映射到处理器的物理内存空间。这些都是通过request_mem_region注册/保留的。您可以使用cat /proc/iomem查看后者。
串行设备可以设计成可以在I/O空间中工作,也可以作为内存映射的I/O工作,因此,对于您来说,使用哪种方法将非常依赖于您的特定设备。
https://stackoverflow.com/questions/23625233
复制相似问题