Я хочу получить доступ к контактам моего COM-порта на моей Linux-машине. Это возможно с помощью функции вызова функции outb/inb.Доступ к последовательному порту в модуле ядра
Я попытался следующий:
#define COM1_BASE_ADDRESS 0x3F8
unsigned char reg = inb((unsigned char)(COM1_BASE_ADDRESS + UART_MCR));
printk(KERN_INFO "MCR register: 0x%X\n", reg);
reg = 1;
printk(KERN_INFO "MCR register to write: 0x%X\n", reg);
outb(reg, (unsigned char)(COM1_BASE_ADDRESS + UART_MCR));
reg = inb((unsigned char)(COM1_BASE_ADDRESS + UART_MCR));
printk(KERN_INFO "MCR register: 0x%X\n", reg);
Модуль ядра должен сам работать должным образом, так как я получаю сообщение ядра в моем журнале ядра (dmesg). Но почему-то регистр, который я хочу написать, не меняется. inb всегда возвращает 0xFF для данного адреса.
Нужно ли мне что-то вроде распределения памяти ввода-вывода для моего процесса?
Не уверен, но в 'outb ((unsigned char) (COM1_BASE_ADDRESS + UART_MCR), reg);' вы устанавливаете регистр и затем печатаете его. Разве вы не должны сначала прочитать его с помощью 'inb'? –
извините, забыли добавить строку. Параметр reg и param также были неправильны в функции outb. Но по-прежнему такая же проблема – schreda
Ваше решение очень полезна с работающим драйвером UART. Я бы рекомендовал подумать о том, чтобы делать что-то в пользовательском пространстве, или использовать подчиненный драйвер для UART, например Bluetooth. – 0andriy