qu结

1、

a、

    retvalue = register_chrdev(LED_MAJOR, LED_NAME, &led_fops);
    if(retvalue < 0){
        printk("register chrdev failed!\r\n");
        return -EIO;
    }
//加上手工创建设备文件

b、

device_create自动创建,大多数代码都在做这一步其实
/* 1、创建设备号 */
    if (newchrled.major) {        /*  定义了设备号 */
        newchrled.devid = MKDEV(newchrled.major, 0);
        register_chrdev_region(newchrled.devid, NEWCHRLED_CNT, NEWCHRLED_NAME);
    } else {                        /* 没有定义设备号 */
        alloc_chrdev_region(&newchrled.devid, 0, NEWCHRLED_CNT, NEWCHRLED_NAME);    /* 申请设备号 */
        newchrled.major = MAJOR(newchrled.devid);    /* 获取分配号的主设备号 */
        newchrled.minor = MINOR(newchrled.devid);    /* 获取分配号的次设备号 */
    }
    printk("newcheled major=%d,minor=%d\r\n",newchrled.major, newchrled.minor);    
    
    /* 2、初始化cdev */
    newchrled.cdev.owner = THIS_MODULE;
    cdev_init(&newchrled.cdev, &newchrled_fops);
    
    /* 3、添加一个cdev */
    cdev_add(&newchrled.cdev, newchrled.devid, NEWCHRLED_CNT);

    /* 4、创建类 */
    newchrled.class = class_create(THIS_MODULE, NEWCHRLED_NAME);
    if (IS_ERR(newchrled.class)) {
        return PTR_ERR(newchrled.class);
    }

    /* 5、创建设备 */
    newchrled.device = device_create(newchrled.class, NULL, newchrled.devid, NULL, NEWCHRLED_NAME);
    if (IS_ERR(newchrled.device)) {
        return PTR_ERR(newchrled.device);
    }

 

posted @ 2022-12-08 19:38  cnchengv  阅读(15)  评论(0编辑  收藏  举报