Как IOREMAP последовательный порт на X86 - 0x2f8?

Я пытаюсь написать модуль ядра ioremap - компьютер X86. Этот модуль будет читать значение из последовательного порта. Как найти SERIAL_ADDR, SERIAL_SIZE здесь? Мой драйвер правильно читать значение порта? Есть ли проблемы с моим кодом? SERIAL_ADDR и SERIAL SIZE устанавливаются производителем оборудования?

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 - это правильно? Но какой здесь должен быть базовый адрес? Базовый адрес - 0x3f8? Это не похоже на базовый адрес для меня? Мне нужен SERIAL_ADDR? Пожалуйста помоги.

1 ответ

Решение

Порты ввода / вывода не адресованы памяти. Иными словами, порты ввода-вывода x86 имеют совершенно отдельное адресное пространство, чем память. Там нет совпадения с памятью. Другой набор инструкций ЦП ("IN", "OUT") используется при работе с портами ввода / вывода. Порты ввода / вывода "обнаруживаются" драйверами устройств, а затем регистрируются / резервируются в ядре с помощью "request_region"; смотрите, например, serial8250_request_std_resource() в исходном коде ядра.

Не путайте это с "отображаемым в память вводом / выводом", где области ввода / вывода отображаются в пространство физической памяти процессора. Они зарегистрированы / зарезервированы с request_mem_region. Вы можете просмотреть последний с cat /proc/iomem,

Последовательные устройства могут быть разработаны для работы либо в пространстве ввода-вывода, либо в качестве ввода-вывода с отображением в памяти, поэтому для вас выбор способа будет зависеть от вашего конкретного устройства.

Другие вопросы по тегам