rk平台移植MTK flashlight 子系统 验证 iic 闪光灯驱动

前言

如何编写验证一款iic 的 闪光灯驱动?

以ic sgm7864 为例,先去找一份开源的驱动,作为模版。
下载小米开源内核bomb-q-oss 代码,次内核是基于mtk 平台的。
参考 drivers/misc/mediatek/flashlight/flashlights-lm3643.c 的代码,依据ic 的datasheet ,修改对应的代码形成一份基本驱动。

mtk 的平台会注册flashlight_core 的class ,以此来统一管理各个闪光灯。
下面介绍一下,基于rk 平台如何移植mtk 的flashlight ,验证ic。

1. 移植flashlight

将整个flashlight 目录 移到 rk 的 drivers/power/supply/mediatek/ 下 (可以放在driver/下的其他目录),修改mediatek/下的 makefile 编译flashligh:
makefile-flashlight
继续修改 flashligh/Makefile 注释掉一些用不到的驱动和平台相关的宏
flashlight-coe-makefile
注意移植需要的头文件到flashlight 目录下,以及修改编译时的头文件的内部路径包含问题。
mach

2. 编写dts

2.1 至此,驱动已经编译ok。 查看源码

flashlight_lm3643_init
 -->platform_driver_register(&lm3643_platform_driver); (和设备树匹配之后会调用probe)
   --> lm3643_probe
     -->i2c_add_driver(&lm3643_i2c_driver)(和设备树匹配之后会调用i2c probe)
       --> lm3643_i2c_probe
     -->flashlight_dev_register

2.2 参考开源代码里的设备树:

mtk dts
没看出来iic 的节点 和这个platform device 的节点如何结合的,在结合上文的函数调用流程,决定分成2个节点写。
在 roc-rk3588s-pc.dtsi 中添加 如下 :
flashlight_core
其中flashlight_core 和 flashlight-core.c 驱动匹配,注册 flashlight_core class.
flashlights_sgm37864 和sgm37864 driver 中的 platform driver 匹配 ,来完成sgm37864-probe。
现在还缺一个 sgm37864_i2c_probe 匹配的节点。

2.3 新建一个sgm37864.dtsi

包含在平台的dtsi 中:
sgm37864_dts
修改 driver 里的匹配字符串:
DTNAME_I2C
DTNAME_I2C2
至此,驱动能完整的probe 成功,flashlight 相关的节点也成功注册。

3. 验证功能

查看flashlight_current
flashlight_current
查看flashlight_capability
flashlight_cap
查看flashlight_fault
flashlight_fault
查看flashlight_sw_disable
flashlight_sw_disable
flash_stobe 写的参数分别为type,ct,part,level(电流level),dur(delay time)
flash_storeflashlight_strobe

总结

flashlight 的各个调试节点如何生成?

1)flashlight_class = class_create(THIS_MODULE, FLASHLIGHT_CORE);
 在/sys/class/ 下创建 flashlight _core的class。
2)flashlight_device = device_create(flashlight_class, NULL, flashlight_devno,NULL, FLASHLIGHT_DEVNAME);
 在/sys/class/ flashlight_core/ 下创建 flashlight 的设备
3)device_create_file(flashlight_device, &dev_attr_flashlight_strobe)
 在/sys/class/ flashlight_core/ flashlight/下创建 flashlight_strobe 的节点调试

flashlight 的调试节点flashlight_strobe如何控制 的ic 的current?

1)LIST_HEAD(flashlight_list);
flashlight_core 中初始化了一个链表flashlight_list
2)flashlight_dev_register_by_device_id(id,ops)
ic 驱动 probe 的时候,将链表挂到flashlight_list 上。
3)flashlight_strobe 执行的时候,按照flashlight_find_dev_by_full_index(type, ct, part)
遍历链表,找到驱动ic的fdev,
4)fdev->ops->flashlight_strobe_store
调用驱动 的ops 设置 level 和 dur。

注意驱动 里 platform probe 和 iic probe 的结合

flashlight_sgm37864_init
 -->platform_driver_register
   -->sgm37864_probe
    -->i2c_add_driver(注意i2c add 的时序,add 太早,
             可能导致iic 过早的匹配,会有空指针)
      -->sgm37864_i2c_probe

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值