第七章 驱动程序开发-LED驱动-7.6.platform驱动模型-代码分析

本文详细分析了Linux驱动程序中的LED驱动平台模型,重点讲解了leddrv.c、ledtest.c和board_A_led.c等文件的改动。在新的模型中,驱动层不再直接创建设备,而是通过独立的函数进行操作。介绍了如何通过EXPORT_SYMBOL导出函数供其他模块使用,并探讨了驱动程序的分层和分离结构,包括platform_device和platform_driver的注册过程。最后,讨论了insmod顺序对驱动加载的影响以及如何扩展LEDs。
摘要由CSDN通过智能技术生成

7.6.2.代码分析
7.6.2.1. ledtest.c

    没变。
7.6.2.2.leddrv.c

    用代码对比看了下分层-分离的leddrv.c和platform的leddrv.c,主要区别新的leddrv.c中不再在led_init()中create deivces,而是独立成函数。

30: void led_class_create_device(int minor)
31: {
32: 		device_create(led_class, NULL, MKDEV(major, minor), NULL, "100ask_led%d", minor);
32: /* /dev/100ask_led0,1,... */
33: }
34: void led_class_destroy_device(int minor)
35: {
36: 		device_destroy(led_class, MKDEV(major, minor));
37: }
38: void register_led_operations(struct led_operations *opr)
39: {
40: 		p_led_opr = opr;
41: }
42:
43: EXPORT_SYMBOL(led_class_create_device); //export给驱动层使用
44: EXPORT_SYMBOL(led_class_destroy_device);
45: EXPORT_SYMBOL(register_led_operations); 

   其中,“EXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码公开,不用修改内核代码就可以在内核模块中直接调用,即使用EXPORT_SYMBOL可以将一个函数以符号的方式导出给其他模块使用。”视频:leddrv.c会编译成独立的.ko文件,其他文件如果调用该.ko中的函数,需要使用EXPORT_SYMBOL()将其导出。

    底层文件chip_demo_gpio.c中定义led_opreation结构体board_demo_led_opr,定义了board_demo_led_init()和board_demo_led_ctl(),还定义了获取该结构体的获取函数get_board_led_opr()。而驱动层leddrv.c想使用该结构体对led操作就必须先获取到_init()和_ctl()函数,前提是先获取到结构体board_demo_led_opr,就得通过获取函数get_board_led_opr()获得,所以在leddrv.c中led_init()中先获取了p_led_opr = get_board_led_opr(),然后再给open()和write()使用。

    而现在是把p_led_opr的获取单独定义成了一个函数,register_led_operations(),并没有去使

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值