前言
如何编写验证一款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:
继续修改 flashligh/Makefile 注释掉一些用不到的驱动和平台相关的宏
注意移植需要的头文件到flashlight 目录下,以及修改编译时的头文件的内部路径包含问题。
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 参考开源代码里的设备树:
没看出来iic 的节点 和这个platform device 的节点如何结合的,在结合上文的函数调用流程,决定分成2个节点写。
在 roc-rk3588s-pc.dtsi 中添加 如下 :
其中flashlight_core 和 flashlight-core.c 驱动匹配,注册 flashlight_core class.
flashlights_sgm37864 和sgm37864 driver 中的 platform driver 匹配 ,来完成sgm37864-probe。
现在还缺一个 sgm37864_i2c_probe 匹配的节点。
2.3 新建一个sgm37864.dtsi
包含在平台的dtsi 中:
修改 driver 里的匹配字符串:
至此,驱动能完整的probe 成功,flashlight 相关的节点也成功注册。
3. 验证功能
查看flashlight_current
查看flashlight_capability
查看flashlight_fault
查看flashlight_sw_disable
flash_stobe 写的参数分别为type,ct,part,level(电流level),dur(delay time)
总结
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