2016-05-20 2 views
1

Я хочу получить доступ к контактам моего 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 для данного адреса.

Нужно ли мне что-то вроде распределения памяти ввода-вывода для моего процесса?

+0

Не уверен, но в 'outb ((unsigned char) (COM1_BASE_ADDRESS + UART_MCR), reg);' вы устанавливаете регистр и затем печатаете его. Разве вы не должны сначала прочитать его с помощью 'inb'? –

+0

извините, забыли добавить строку. Параметр reg и param также были неправильны в функции outb. Но по-прежнему такая же проблема – schreda

+0

Ваше решение очень полезна с работающим драйвером UART. Я бы рекомендовал подумать о том, чтобы делать что-то в пользовательском пространстве, или использовать подчиненный драйвер для UART, например Bluetooth. – 0andriy

ответ

0

Решение проблемы заключалось в удалении unsigned char листинга в списке параметров inb и outb.

Смежные вопросы