2016-05-20 10 views
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メモリを割り当てるようなものが必要ですか?

+0

わかりませんが、 'outb(unsigned char)(COM1_BASE_ADDRESS + UART_MCR)、reg);'レジスタを設定してから印刷してください。最初に 'inb'でそれを読み返してはいけませんか? –

+0

申し訳ありません、行を追加するのを忘れてしまいました。 regとport paramもoutb関数で間違っていました。しかしまだ同じ問題 – schreda

+0

あなたの解決策は、UARTの実行中のドライバでは難しいです。私はユーザー空間での作業を検討するか、BluetoothのようなUART用のスレーブドライバを検討することをお勧めします。 – 0andriy

答えて

0

解決策は、inboutbというパラメータリストのunsigned charキャストを削除することでした。

関連する問題