キャラクタ型デバイスドライバの初期化処理は次のような順番で行う。
デバイス番号の設定は次のように行う。
メジャー番号とマイナー番号を合わせて「デバイス番号」と呼び、dev_t 型で表わす。
未使用のメジャー番号とマイナー番号を見つける場合には、次のような
alloc_chrdev_region
関数を使う。
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name); |
各引数(パラメータ)は次のような意味を持つ。
devは、カーネル内部で割り当てたデバイス番号。
baseminorは、使用したいマイナー番号の開始番号。
countは、連続するデバイス番号の総数。
nameは、デバイスドライバの名前(/proc/devicesに出力する名前)。
この関数の戻り値(返り値)は、正常に終了したばあいは0を返し、エラーのばあ
いは負の値を返す。
このデバイスドライバのソースコードでは、baseminorに0を設定し、 countに1を設定し、nameにdio_drvを設定して呼び出 し、devに設定したdev_numからデバイス番号を受け取る予定である。
dev_numで受け取ったデバイス番号からメジャー番号を得たいばあはマクロ を使ってMAJOR(dev_num)のようにして求めればよい。
また、マイナー番号を得たいばあいはマクロを使ってMINOR(dev_num)の
ようにして求めればよい。
この関数の実際の適用を、次のようにする。
#define DRIVERNAME "dio_drv" #define DEV_COUNT 1 static dev_t dev_num; static struct cdev char_dev; int ret; int baseminor =0 ret = alloc_chrdev_region(&dev_num, baseminor, DEV_COUNT, DRIVERNAME); |
キャラクタ型デバイスドライバの登録は次のように行う。
デバイス番号とキャラクタ型デバイスドライバを関連づけるには、cdev構 造体を初期化したカーネル内部に登録する。
cdev構造体を初期化するためにcdev_init関数を使うことにする。
void cdev_init(struct dev_t *dev, struct file_operations *fops); |
各引数(パラメータ)は次のような意味を持つ。
cdevは、cdev構造体へのポインタである。
fopsは、file_operations構造体へのポインタである。
この関数の実際の適用を、次のようにする。
static struct cdev char_dev; static struct file_operations dio_fops = { .owner = NULL, .read = NULL, .write = NULL, .ioctl = NULL, .open = NULL, .release = NULL, }; cdev_init(&char_dev, &dio_fops); |
キャラクタ型デバイスドライバの活性化は次のように行う。
cdev構造体を初期化したら、cdev_add関数を使ってキャラクタ型 デバイスドライバを活性化する。
int cdev_add(struct dev_t *dev, dev_t dev, unsigned count); |
各引数(パラメータ)は次のような意味を持つ。
cdevは、cdev構造体へのポインタである。
devは、デバイス番号である。
countは、デバイスに関連付ける数である。
この関数の実際の適用を、次のようにする。
#define DEV_COUNT 1 static dev_t dev_num; static struct cdev char_dev; int ret; ret = cdev_add(&char_dev, dev_num, DEV_COUNT); |