next up previous
次へ: レポート 上へ: 実験課題 戻る: 実験課題

デバイスドライバの作成

情報システム実験(11)で作成したdio_drv.cのソースファイルを機能 拡張する。

ヘッダファイルとして、新たにlinux/pci.hlinux/ioport.hlinux/errno.hをインクルードすること。


\begin{boxedminipage}{5.5cm}
\begin{verbatim}...

初期化モジュールのdio_initに次の機能を付加すること。

上記の機能を付加したdio_initモジュールの基本構造は次ページのようにな る。

        .
        .
#include <linux/pci.h>
#include <linux/ioport.h>
#include <linux/errno.h>
        .
        .
struct pci_dev *current_device;

typedef struct _DIO_RESORCE {
     unsigned long io_address[6];
     unsigned long io_size[6];
     unsigned char irq;
} DIO_RESOURCE, *PDIO_RESOURCE;

DIO_RESOURCE dio_res;
        .
        .
        .
int __init dio_init(void)
{
        .
        .
     struct resource *res;

     printk("initialize the dio_device \n");

     // PCIデバイスの検索
     current_device = pci_find_device(0x1147, 2726, NULL);
     if (current_device == NULL)
        return -ENODEV;

     // I/Oポートベースアドレスの取得
     dio_res.io_address[0] = pci_resource_start(current_device, 0);
     dio_res.io_size[0] = pci_resource_len(current_device, 0);

     // I/Oポートの予約と表示
     res = request_region(dio_res.io_address[0], dio_res.io_size[0], 
                          DRIVERNAME);
     if (res == NULL)
         return -EINVAL;

     printk("I/O Port 0 = %lX h\n", dio_res.io_address[0]); // 16進数
     printk("I/O Port 0 = %ld d\n", dio_res.io_address[0]); // 10進数

     // 割り込み番号の取得と表示
     dio_res.irq = current_device->irq;
     printk("IRQ = %X h\n", dio_res.irq); // 16進数
     printk("IRQ = %d d\n", dio_res.irq); // 10進数

     // 'Driver' no TouRoku
             .
             .
             .
             . 
err1: // ドライバの登録に失敗したときのリソースの解放
     release_region(dio_res.io_address[0], dio_res.io_size[0]);
     return ret;
}

クリーンナップ・モジュールのdio_cleanupには、次の機能を付加すること。

上記の機能を付加したdio_cleanupモジュールの基本構造は次のようにな る。

void __exit dio_cleanup(void)
{
     printk("cleanup the dio_device \n");

     // リソースの解放
     release_region(dio_res.io_address[0], dio_res.io_size[0]);

     // 'Driver' no TouRokuSakujo
          .
          .
          .
}



MANOME Yoichi 平成19年1月6日