情報システム実験(11)で作成したdio_drv.c
のソースファイルを機能
拡張する。
ヘッダファイルとして、新たにlinux/pci.h
とlinux/ioport.h
と
linux/errno.h
をインクルードすること。
初期化モジュールの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 . . . }