PWM, LED, BACKLIGHT, VIBRATOR调试笔记(未完待续)

pwm.c is the driver for PWM device .这个事pwm的驱动。这个驱动是个给各个需要使用pwm的设备提供针对pwm的基本操作功能。在系统初始化的时候会注册所有的pwm设备驱动,当然这个驱动代码本身只有一份,根据devices.c中设备结构体的不同id,这个驱动便会被调用多次,和我对i2c的注册方法一样。都没有用id-table,估计是作者和我一样也喜欢这样直接的方式吧。
pwm本身的操作有这样几种并且都用EXPORT_SYMBOL进行了导出,所有其他驱动可以直接调用,之所以导出,是因为这个pwm驱动是为其他驱动服务的。他是一个基础驱动。
pwm_request:通过pwm_id获取一个pwm。该函数调用list_for_each_entry遍历所有的pwm设备,通过id匹配设备,如果找到了,会通过一个指针带回设备指针,并通过设备引用计数器use_count确保这个pwm设备只会被引用一次!
pwm_config:设置占空比。这个函数会直接操作对应pwm设备的寄存器。
pwm_enable:使能pwm设备。同样也会写对应pwm设备的使能位。
pwm_disable:禁能pwm设备。同样也会写对应pwm设备的禁能位。
pwm_free:所谓free就是让设备引用计数器减1,仅此而已。对pwm设备而已,由于它的引用最多为1,所以free其实就是让usr_count = 0


xxx_pwm_bl.c
这个是背光的驱动。
我们可以看到在devices.c中实例化的一个platform_device 类型的背光设备,并且它的私有成员被指向了一个 platform_pwm_backlight_data型的指针。该类型会指定所用的pwm id,背光的各种属性等。
在probe函数中可以看到这个驱动调用了pwm_request,来获取一个pwm device
初始化并注册一个backlight_device 设备。注册背光设备会调用函数 backlight_device_register,这个函数的第一个参数就是设备名称,开始一直想不明白为什么这里的名称不直接给出,而是使用了 dev_name(&pdev->dev)函数来获取这个设备名称,跟踪了一下这个获取名称 的函数才发现,原来这里获取的就是设备名称,因为考虑到当前这个背光驱动可能会被调用多次,来产生多个设备。所以要获取到当前调用的具体设备的名称,用这个函数是比较妥当的,否则你可能需要别的方法去拼凑一个名字,比如我在i2c驱动用的fprintf函数那样,那可真的有些蹩脚。我以后也用这个方法啦!
其实具体的设备名称就是在platform_device_add函数中确立的,一般我们在devices.c中实例化一个设备的的时候都会给出一个设备id和设备name,在这个设备添加的函数中我们会看到基于这个id的一个判断:如果你给的这个id是-1,那你就是告诉该add函数:我的这个设备在系统中是唯一的,那么这个add函数就会用你给的name直接给这个设备命名。如果你给的id不是-1,那你就是告诉这个add函数,你的这个设备也许有多个,这只是其中一个。那么这个add函数在给设备命名的时候就会采用你给的那个name和当前你给你给的这个id做个拼凑来给这个被add的设备命名,如:你给的 .name = “abcde”  你给的  .id = 3  那么最后被拼出来的名字就是:abcde.3 。所以,你就可以根据情况在实例化设备的时候给一个有意义的id值。
在backlight_device_register中我们还会看到另外一个重要的参数:pwm_backlight_ops这个结构体是有当前的背光驱动来实现的,它有两个重要的成员,都是函数指针:update_staus 用来改变当前的背光亮度,get_brightness 用于获取当前的亮度值。这两个函数的实现都是依靠pwm驱动实现的。所以在他们的实现中我们可以看到调用了对应的pwm驱动的enable,disable,和config函数。
继续这个backlight_device_register!这个函数的实现在kernel的blacklight.c中,这个是linux kernel框架中的文件。它的主要功能就是对外提供了一个统一的接口,屏蔽了驱动的底层实现。这和前面做过的i2c驱动很相似!完全类似于i2c_core.c所实现的功能!也和前面做过的spi驱动很类似!完全类似于spi.c的功能。并且这个文件实现了show和store函数,所以我们可以在终端中直接使用echo和cat命令来改变背光亮度了!


其实所谓的占空比调节还不如叫空占比更为合适,这可能和"肉夹馍"和"馍夹肉"的关系是一样的。只是习惯了而已。
pwm输出引脚在disable的情况下是高电平.设置一个pwm占空比的参数有两个,一个是duty,一个是period。单位都是纳秒(ns)。duty指的是在一个周期内低电平持续的时间,period指的是周期。当然duty必须小于等于period。针对高低电平的持续时间,我们能设置的只有duty。也就是我们只能设置低电平持续的时间。当我们设置的duty逐渐增大时,低电平的比例在逐渐增大,而高电平的比例会对应减少,也就是我们给的值越大“空”越多,而“占”越少,所以感觉叫“空占比”更合适些。。呵呵
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YasinLeeX

再来一杯西湖龙井。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值