1
Linuxマシンのmycomポートのピンにアクセスしたいとします。 これは、カーネル関数呼び出し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を返します。
私のプロセスにI/Oメモリを割り当てるようなものが必要ですか?
わかりませんが、 'outb(unsigned char)(COM1_BASE_ADDRESS + UART_MCR)、reg);'レジスタを設定してから印刷してください。最初に 'inb'でそれを読み返してはいけませんか? –
申し訳ありません、行を追加するのを忘れてしまいました。 regとport paramもoutb関数で間違っていました。しかしまだ同じ問題 – schreda
あなたの解決策は、UARTの実行中のドライバでは難しいです。私はユーザー空間での作業を検討するか、BluetoothのようなUART用のスレーブドライバを検討することをお勧めします。 – 0andriy