字符驱动设备4(led驱动框架)

led驱动相关文件在drivers/leds目录下,led-class.c led-core.c两个文件是内核开发者提供的,leds-xxx.c是设备驱动开发者提供的。
leds-24xx.c通过调用led_classdev_register来完成驱动注册的,该函数是在led_class.c中定义的。
led驱动框架中内核开发者实现的部分主要是在led-class.c中,led_class.c也是一个模块,这个驱动框架也是可以根据需要装载和卸载的。
subsys_initcall()中主要是有class_create创建一个类,
moudle_exit()中主要有class_destory删除一个类
subsys_initcall是一个宏,定义在linux/init.h中。经过对这个宏进行展开,发现这个宏的功能是:将其声明的函数放到一个特定的段:.initcall4.init
subsys_initcall
__define_initcall(“4”,fn,4)
分析module_init宏,可以看出它将函数放到了.initcall6.init段中。
module_init
__initcall
device_initcall
__define_initcall(“6”,fn,6)
内核在启动过程中需要顺序的做很多事,内核如何实现按照先后顺序去做很多初始化操作。内核的解决方案就是给内核启动时要调用的所有函数归类,然后每个类按照一定的次序去调用执行。这些分类名就叫.initcalln.init。n的值从1到8。内核开发者在编写内核代码时只要将函数设置合适的级别,这些函数就会被链接的时候放入特定的段,内核启动时再按照段顺序去依次执行各个段即可。
经过分析,可以看出,subsys_initcall和module_init的作用是一样的,只不过前者所声明的函数要比后者在内核启动时的执行顺序更早。
以led驱动框架为例,在/driver/leds目录下的led-class.c文件中,完成了对设备类的注册,如果内核编译之前选中了led驱动模块,则在/sys/class目录会有leds文件夹,但是文件夹里面没有东西(或者这有mmc1、mmc2.。。这些关于mmc存储的),内核提供的led-class.c文件只是提供了类的注册,以及不涉及硬件的一些函数,具体硬件是什么,多少个,怎么操作还需要我们写驱动来填充。所以我们提供的驱动,需要包含module_init();函数,在装载驱动的时候填充需要添加设备的相关属性和操作函数,以及调用led_classdev_register,这个函数在led-class.c中已经建立好。具体代码如下

static int __init s5pv210_led_init(void)
{
    // 用户insmod安装驱动模块时会调用该函数
    // 该函数的主要任务就是去使用led驱动框架提供的设备注册函数来注册一个设备
    int ret = -1;

    mydev.name = "myled";
    mydev.brightness = 255; 
    mydev.brightness_set = s5pv210_led_set;

    ret = led_classdev_register(NULL, &mydev);
    if (ret < 0) {
        printk(KERN_ERR "led_classdev_register failed\n");
        return ret;
    }

    return 0;
}

static void __exit s5pv210_led_exit(void)
{
    led_classdev_unregister(&mydev);
}


module_init(s5pv210_led_init);
module_exit(s5pv210_led_exit);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值