[文章]RK3568三色灯点灯流程/测试用例/修复bug

阅读量0
0
0


昨天下午,有小伙伴问我“DAYU200上的RGB灯怎么控制”?
我在Hi3516上做过用LED灯演示驱动开发的示例程序,但因为我还不知道DAYU200上的三色灯的GPIO管脚号是多少,就没做灯控测试。不过既然小伙伴问到了,我就抽空研究了一下这部分流程,写了个测试程序,顺便修复了代码上的一个bug。

1. 先看视频

2. 驱动代码分析
先是看到了有一个//vendor/hihope/rk3568/hdf_config/khdf/light/light_config.hcs文件,估计这就是三色灯的驱动配置。从这里去//vendor/hihope/rk3568/hdf_config/khdf/device_info/device_info.hcs找到:hostName = "light_host" 的相关信息。

再往上找到light的内核态驱动程序://drivers/framework/model/misc/light/driver/,这里有include/light_driver.h和src/light_driver.c

再往上找到light的用户态HAL接口://drivers/peripheral/misc/light/hal/,这里也有src/light_controller.h 和 src/light_controller.c。
在//drivers/peripheral/misc/light/下还有hdi_service和interfaces。
还可以找到//drivers/interface/light/v1_0/ILightInterface.idl
经过代码的解读和画图整理,可以得到如下的流程图。

3. 流程图
LightFlow_liangkz20220419.png
【附件有原始大图】

4. 测试程序
虽然//drivers/peripheral/misc/light/test/路径下已经有测试程序了,但我还是自己用C语言实现了一个简单的无界面测试程序。
- ledx:可执行程序,你可将其推送到平台的/bin/目录下,然后在shell上执行./bin/ledx即可看到效果。
- ledx.c:测试程序源代码
- BUILD.gn:测试程序编译脚本,在//applications/standard/hap/ohos.build文件的 module_list 下增加一句:
> "//...(BUILD.gn部署路径).../ledx:ledx",

让它参与编译即可。
- light_driver.c 经过我修改的light驱动程序,见宏liangkz_modify包括住的部分代码。
【原始的内核态驱动程序light_driver.c中存在bug,导致实际运行并不如预期,需要修复light_driver.c中的bug后才完全如预期。】
ledx 测试程序会自动跑以下一个点灯序列:
  1. HILOG_INFO(LOG_APP, "    ledId [-1, 0, 1, 2]: -1-Exit, 0-GetLightInfo, 1-Led1, 2-Led2");
  2. HILOG_INFO(LOG_APP, "    ledMod[-1, 0, 1   ]: -1-Flash,0-Off, 1-On");
  3. HILOG_INFO(LOG_APP, "    ledBrt[ 1, 2, 4, x]:  1-R,    2-G,   4-B, x-bit");

  4.     int32_t matrix[][3] =
  5.     {
  6.         {0, 0, 0}, //GetLightInfo

  7.         {1, 0, 4}, //LED1 Off all RGB
  8.         {1, 1, 1}, //LED1 On R
  9.         {1, 1, 2}, //LED1 On G
  10.         {1, 1, 4}, //LED1 On B
  11.         {1, 0, 0}, //LED1 Off
  12.         {1, 1, 7}, //LED1 On BGR:111
  13.         {1, 1, 6}, //LED1 On BG-:110
  14.         {1, 1, 5}, //LED1 On B-R:101
  15.         {1, 1, 4}, //LED1 On B--:100
  16.         {1, 1, 3}, //LED1 On -GR:011
  17.         {1, 1, 2}, //LED1 On -G-:010
  18.         {1, 1, 1}, //LED1 On --R:001
  19.         {1, 0, 0}, //LED1 Off
  20.         {1, -1, 7}, //LED1 Flash RGB

  21.         {-1, 0, 0},//Exit
  22.     };
复制代码
小伙伴们可自行根据规则添加测试序列。

5. 发现并修复bug
在写ledx测试程序做验证时,发现死活都得不到预期效果,我就干脆从下到上把整个流程画了图出来,发现驱动程序果然有不可预料的行为。

5.1 LED灯的数量
在没得到原理图和GPIO管脚编号的情况下,我猜测DAYU200开发板排线旁边的LED灯,应该是如下图所示:
3LED.JPG

在light_config.hcs中写 lightId = [1, 2]; 相当于说是有两盏灯,但实际上,要么是1盏,要么是3盏,我这里暂且把RGB合在一起当做一盏灯来处理。【小伙伴们可尝试一下把它当做三盏灯来处理,看看该怎么改。】

light_driver.c中对GpioWrite()的几处调用中,对drvData->info[lightId]->busNum的使用,很明显是不合理的,这是造成测试效果不符合预期的根本原因。
我对此做了一下修改,用 UpdateLight(uint32_t lightId, uint32_t lightOn)来替代,小伙伴们读一下附件的代码估计就清楚了。

LightFlowOnDAYU200.rar
(809.75 KB, 下载次数: 7)

回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友