zoukankan      html  css  js  c++  java
  • 字符设备驱动[深入]: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);
       }
       
       //为简化逻辑,出错处理代码略
    }
  • 相关阅读:
    BOM弹窗 滚动条
    标签占位信息
    标签样式操作
    Keepalived入门学习
    史上最全Redis面试题(2020最新版)
    一文带你读懂zookeeper在大数据生态的应用
    详细解析虚拟化的起源和分类
    干货 | Nginx负载均衡原理及配置实例
    干货 | 一文彻底读懂nginx中的location指令
    史上最全Linux面试题(2020最新版)
  • 原文地址:https://www.cnblogs.com/mylinux/p/5100603.html
Copyright © 2011-2022 走看看