next up previous
次へ: ドライバの格納 上へ: 割り込み(Interrupts) 戻る: dio_ioctl関数の拡張

ドライバの作成

「1.2 割り込み処理の実装」に従って、呼ぶ関数と呼ばれる関数の間に 矛盾がないように各処理を追加記述すること。

「1.2.1 割り込み処理の登録」のrequest_irq関数をdio_initモジュー ルに書き込む。

このとき、次のようにretの戻り値が0のときだけ、割り込み番号を表示 するように変更する。
int __init dio_init(void)
{
         .
         .
         . 
   // Warikomi Youkyuu
   dio_res.irq = 0;
   ret = request_irq(current_device->irq, dio_interrupt_handler,
				  SA_SHIRQ, DRIVERNAME, (void *)&dio_res);
   // Warikomi Bangou no Shutoku
   if (ret == 0){
      dio_res.irq = current_device->irq;
      printk("IRQ = %X h\n", dio_res.irq);
   }     
        .
        .

「1.2.2 割り込み処理の解除」のfree_irq関数をdio_cleanupモジュー ルに書き込む、割り込みのマスクを0に設定し、割り込み番号が誤っていない (dio_res.irq > 0)ときのみ解除するようにする。
void __exit dio_cleanup(void)
        .
        .
        .
// Warikomi no Kaijo
   outb(0, dio_res.io_address[0] + 0x0D);
   if (dio_res.irq > 0){
      free_irq(dio_res.irq, (void *)&dio_res);
   }
        .
        .

このあとは、以下の処理をドライバ・ソースに記述する。

機能拡張したドライバ・ソースを次のようにコンパイルする。

     # make clean
     # make



MANOME Yoichi 平成19年1月6日