首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在X86 - 0x2f8上实现串口?

如何在X86 - 0x2f8上实现串口?
EN

Stack Overflow用户
提问于 2014-05-13 07:32:14
回答 1查看 755关注 0票数 0

我正在尝试编写一个ioremap内核模块- X86 PC。此模块将从串口读取值。如何在这里找到SERIAL_ADDR,SERIAL_SIZE?我的驱动程序读取端口值正确吗?我的代码有什么问题吗?SERIAL_ADDR和串行大小是否由硬件制造商固定?

代码语言:javascript
复制
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?请帮帮忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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工作,因此,对于您来说,使用哪种方法将非常依赖于您的特定设备。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23625233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档