FC2ブログ
メモ帳
メモ帳
スポンサーサイト
--年--月--日 (--) --:-- | 編集
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
キャラクタデバイスの登録
2007年05月17日 (木) 15:38 | 編集
デバイス番号の割り当て(静的)
int register_chrdev_region(dev_t first, unsigned int count, char *name)
引数1登録するdev_t。メジャー番号とマイナー番号を持っている。
引数2登録する数。
引数3登録するデバイス名

デバイス番号の割り当て(動的)
int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name)
静的とほとんど同じ。
引数1に渡したアドレスに動的に割り当てられるdev_tが入れられる。
firstminorははじめのマイナー番号。

デバイス番号の解放
void unregister_chrdev_region(dev_t first, unsigned int count)
引数1は割り当てたdev_tを渡す。
引数2は解放する数。

cdev初期化
void cdev_init(struct cdev * cdev, struct file_operations *fops)
引数1はcdev。キャラクタ型デバイスを表す構造体。
引数2はファイルオペレーション構造体。ドライバを用いて呼び出す処理を割り当てる。

cdev登録
int cdev_add(struct cdev *cdev, dev_t num, unsigned int count)
引数1はcdev。上で初期化したやつを入れてやればいい。
引数2はdev_t。デバイスのメジャー番号とマイナー番号を格納しているらしい。
引数3はデバイス番号の数。

cdev削除
void cdev_del(struct cdev *cdev)
引数1はcdev。上で登録したやつを入れればいい。



例)
/* includeは省略 */

int hoge_open(struct inode *inode, struct file *filp)
{
  //なんかopen処理
}
int hoge_close(struct inode *inode, struct file *filp)
{
  //なんかrelease処理
}
static long tuner_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
  //なんかioctl処理
}

//ファイルオペレーション構造体
//このサンプルドライバを使ってopenとかcloseとかioctlを呼び出すと
//hoge_openやらhoge_closeやらhoge_ioctlが呼び出される。
static struct file_operations fops =
{
  .owner = THIS_MODULE,
  .unlocked_ioctl = hoge_ioctl,
  .open = hoge_open,
  .release = hoge_close,

};

//cdevを定義。
struct cdev hoge_cdev;

static int __init hoge_init(void)
{

  //適当。
  int hoge_major = 202, hoge_minor = 0;
  dev_t hoge_dev_t;

#if 1
  /* 自分で指定したメジャー番号を使いたいときはこっち */
  /* MKDEV(メジャー番号, マイナー番号)ってマクロでdev_t生成*/
  hoge_dev_t = MKDEV(hoge_major, hoge_minor)
  register_chrdev_region(hoge_dev_t, 1, "hoge")
#else
  /* 空いているメジャー番号を動的に取得したいときはこっち */
  alloc_chrdev_region(&hoge_dev_t, hoge_minor, 1, "hoge");
#endif
  cdev_init(&hoge_cdev, &hoge_fops);
  hoge_cdev.owner = THIS_MODULE;

  ret = cdev_add(&hoge_cdev, , 1);
  if(ret < 0){
    goto err_case;
  }
  return 0;
}

static void __exit hoge_exit(void)
{
  cdev_del(&hoge_cdev);
  unregister_chrdev_region(hoge_dev_t, 1);
}

module_init(hoge_init);
module_exit(hoge_exit);
コメント
この記事へのコメント
コメントを投稿する
URL :
コメント :
パスワード :
秘密 : 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
copyright © 2004 Powered By FC2 allrights reserved. / template: sukechan
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。