字符设备驱动[深入]:linux cdev详解

linux cdev详解  http://blog.chinaunix.net/uid-24517893-id-161446.html

 

用cdev_add添加字符设备驱动:

//linux2.6中用cdev_add添加字符设备驱动
//传统的是直接使用register_chrdev
//新的方式,驱动初始化写起来要繁琐一点,但是好处是能够根据需要控制cdev_add的设备数量,且主设备号不再完全受256个的限制。详情可以参考2.6的内核代码linux/fs/char_dev.c,以及上面引用的文章。

static struct cdev *leds_cdev ;
static int leds_major = xx ;// 
static int __init s3c24xx_leds_init()
{
    dev_t devno = MKDEV(leds_major , 0);
    leds_cdev = (LEDS_DEV_ST*)kmalloc(sizeof(LEDS_DEV_ST),GFP_KERNEL) ;
    /*申请设备号,当xxx_major不为0时,表示静态指定;当为0时,表示动态申请*/
    if(leds_major){
        ret = register_chrdev_region(devno , LEDS_DEV_COUNT , LEDS_DEV_NAME); //register_chrdev_region若成功,返回值0
    }else{
        ret = alloc_chrdev_region(&devno, LEDS_BASE_MINOR, LEDS_DEV_COUNT, LEDS_DEV_NAME);
        leds_major = MAJOR(devno);
    }
    
    //初始化并添加cdev结构体
    cdev_init(leds_cdev , &s3c24xx_leds_fops );
    leds_cdev->owner = THIS_MODULE ;
    leds_cdev->ops = &s3c24xx_leds_fops;
    ret = cdev_add(leds_cdev , devno , LEDS_DEV_COUNT);
    
    //class_create动态创建设备的逻辑类,并完成部分字段的初始化,然后将其添加到内核中。
    //    创建的逻辑类位于 /sys/class/。
    leds_class = class_create(THIS_MODULE, "leds_class"); // /sys/class/下的类名
    
    for (minor = 0; minor < 4 ; minor++){
        leds_class_devs[minor] = class_device_create(leds_class, 
                                                     NULL, 
                                                     MKDEV(leds_major, minor), 
                                                     NULL, 
                                                     (minor==0)?"leds":"led%d", minor);
   }
   
   //为简化逻辑,出错处理代码略
}

 

posted @ 2016-01-04 23:12  oucaijun  阅读(974)  评论(0编辑  收藏  举报
下载TeamViewer完整版 下载TeamViewer