Chinaunix首页 | 论坛 | 博客
  • 博客访问: 191319
  • 博文数量: 55
  • 博客积分: 1466
  • 博客等级: 上尉
  • 技术积分: 716
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-13 22:34
文章分类

全部博文(55)

文章存档

2011年(27)

2010年(28)

我的朋友

分类: LINUX

2011-02-12 15:02:07

字符模块的注册步骤:
-------------------------------------步骤
1,将主设备号和次设备号转换成dev_t类型:devno = MKDEV(second_major, index); 
2,根据devno申请设备编号(可能已指定,可能需要动态申请(获得主设备号))
3,动态申请设备结构体的内存,然后清零
4,利用子函数初始化并注册cdev。
   a, 初始化 cdev_init(&dev->cdev, &second_fops);
   b, 设置cdev的成员,如owner, ops
   c, 添加设备进内核 cdev_add

-----------------------------------------------例子
static void second_setup_cdev(struct second_dev *dev, int index)
{
  int err, devno = MKDEV(second_major, index);

  cdev_init(&dev->cdev, &second_fops);
  dev->cdev.owner = THIS_MODULE;
  dev->cdev.ops = &second_fops;
  err = cdev_add(&dev->cdev, devno, 1);
  if (err)
    printk(KERN_NOTICE "Error %d adding LED%d", err, index);
}

/*设备驱动模块加载函数*/
int second_init(void)
{
  int ret;
  dev_t devno = MKDEV(second_major, 0);

  /* 申请设备号*/
  if (second_major)
    ret = register_chrdev_region(devno, 1, "second");
  else  /* 动态申请设备号 */
  {
    ret = alloc_chrdev_region(&devno, 0, 1, "second");
    second_major = MAJOR(devno);
  }
  if (ret < 0)
    return ret;
  /* 动态申请设备结构体的内存*/
  second_devp = kmalloc(sizeof(struct second_dev), GFP_KERNEL);
  if (!second_devp)    /*申请失败*/
  {
    ret =  - ENOMEM;
    goto fail_malloc;
  }

  memset(second_devp, 0, sizeof(struct second_dev));

  second_setup_cdev(second_devp, 0);

  return 0;

  fail_malloc: unregister_chrdev_region(devno, 1);
}


阅读(1382) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~