Как 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
,
Последовательные устройства могут быть разработаны для работы либо в пространстве ввода-вывода, либо в качестве ввода-вывода с отображением в памяти, поэтому для вас выбор способа будет зависеть от вашего конкретного устройства.