情報システム実験(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
.
.
.
}