2

割り込みを使用して、UART 16550D にエラーがあるかどうか、および文字がいつ読み取れるかを確認しようとしています。

UART 構成は次のとおりです。

#define UART    0x03f8      // Endereço da Porta Serial - I (com1) 
#define UART_IER    1
#define UART_LCR    3
#define UART_LSR    5
#define UART_DLL    0   /* Out: Divisor Latch Low */
#define UART_DLM    1   /* Out: Divisor Latch High */
#define UART_LSR_THRE   0x20 /* Transmit-hold-register empty */
#define UART_LSR_DR     0x01 /* Receiver data ready */
#define UART_RX     0   /* In:  Receive buffer */ 
#define UART_TX     0   /* Out: Transmit buffer */

void UART_init(void){
    outb( 0x80 , UART + UART_LCR );     
    outb( 0x00 , UART + UART_DLM );     
    outb( 0x60 , UART + UART_DLL );     
    outb( 0x1f , UART + UART_LCR );     
    outb( 0x07 , UART + UART_IER );         
    return;
}

そして割り込み

irqreturn_t short_interrupt(int irq, void *dev_id){

        printk("INTERRUPT HAPPENED. WILL NOW RETURN\n");

        return 0;
}

static int seri_init(void){
        int result, i;

        UART_init();  

        request_irq(4, short_interrupt, SA_SHIRQ, "seri", NULL);

        ....

したがって、今のところ、ハンドラーが呼び出されているかどうかを確認したいだけです。4 は、私が使用している仮想ボックス設定の IRQ として定義されています。

私が知りたいのは、この設定に何か問題があるのでしょうか? テストするとき、読んでいるものを読んで処理するのに問題はありません。問題は、ハンドラーが呼び出されることはありません。

request_irq() からの戻り値は -22 です。コンパイル時に問題はありません。

4

4 に答える 4

0

変化する

outb( 0x80 , UART + UART_LCR );     
outb( 0x00 , UART + UART_DLM );     
outb( 0x60 , UART + UART_DLL );     
outb( 0x1f , UART + UART_LCR );     
outb( 0x07 , UART + UART_IER );    

outb( 0x80 , UART + UART_LCR );     
outb( 0x00 , UART + UART_DLM );     
outb( 0x60 , UART + UART_DLL );     
outb( 0x07 , UART + UART_IER );    // Set IER before clearing DLAB bit in LCR
outb( 0x1f , UART + UART_LCR );     
// You may also need
outb( 8 , UART + 4 );  // Some systems use this as a master interrupt enable
于 2013-06-05T20:17:06.293 に答える
0

割り込みハンドラーがトリガーされない理由に関する私の分析:

(1) request_irq(virq,...) に渡される最初のパラメーターがハードウェア irq 番号または仮想 irq 番号であることを確認します。一部のプラットフォームでは、ハードウェア irq と request_irq(...) によって使用される番号との間にマッピングがあります。ボックスにマッピングがある場合は、ハンドラーを他の割り込みソースに誤って接続します。

(2) 16550D の割り込みマスクレジスタが正しく設定されていることを確認します。16550D には、割り込みイベントをマスク/マスク解除できる割り込みマスク レジスタが必要だと思います。

(3) request_irq(...) の戻り値をチェックして、割り込みが正常に接続されていることを確認します。

上記がお役に立てば幸いです。

于 2013-05-17T02:34:19.930 に答える