有小伙伴問我“DAYU200上的RGB燈怎么控制”?
我在Hi3516上做過用LED燈演示驅動開發的示例程序,但因為我還不知道DAYU200上的三色燈的GPIO管腳號是多少,就沒做燈控測試。不過既然小伙伴問到了,我就抽空研究了一下這部分流程,寫了個測試程序,順便修復了代碼上的一個bug。
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. 流程圖
【附件有原始大圖】
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 測試程序會自動跑以下一個點燈序列:
HILOG_INFO(LOG_APP, “
ledId [-1, 0, 1, 2]: -1-Exit, 0-GetLightInfo, 1-Led1, 2-Led2”);HILOG_INFO(LOG_APP, “
ledMod[-1, 0, 1 ]: -1-Flash,0-Off, 1-On”);HILOG_INFO(LOG_APP, “
ledBrt[ 1, 2, 4, x]:
1-R,
2-G,
4-B, x-bit”);
int32_t matrix[][3] =
{
{0, 0, 0}, //GetLightInfo
{1, 0, 7}, //LED1 Off all RGB
{1, 1, 1}, //LED1 On R
{1, 1, 2}, //LED1 On G
{1, 1, 4}, //LED1 On B
{1, 0, 0}, //LED1 Off
{1, 1, 7}, //LED1 On BGR:111
{1, 1, 6}, //LED1 On BG-:110
{1, 1, 5}, //LED1 On B-R:101
{1, 1, 4}, //LED1 On B--:100
{1, 1, 3}, //LED1 On -GR:011
{1, 1, 2}, //LED1 On -G-:010
{1, 1, 1}, //LED1 On --R:001
{1, 0, 0}, //LED1 Off
{1, -1, 7}, //LED1 Flash RGB
{-1, 0, 0},//Exit};
小伙伴們可自行根據規則添加測試序列。
5. 發現并修復bug
在寫ledx測試程序做驗證時,發現死活都得不到預期效果,我就干脆從下到上把整個流程畫了圖出來,發現驅動程序果然有不可預料的行為。
5.1 LED燈的數量
在沒得到原理圖和GPIO管腳編號的情況下,我猜測DAYU200開發板排線旁邊的LED燈,應該是如下圖所示:
在light_config.hcs中寫 lightId = [1, 2];相當于說是有兩盞燈,但實際上,要么是1盞,要么是3盞,我這里暫且把RGB合在一起當做一盞燈來處理。【小伙伴們可嘗試一下把它當做三盞燈來處理,看看該怎么改】
5.2 GpioWrite()的行為
light_driver.c中對GpioWrite()的幾處調用中,對drvData->info[lightId]->busNum的使用,很明顯是不合理的,這是造成測試效果不符合預期的根本原因。
我對此做了一下修改,用 UpdateLight(uint32_t lightId, uint32_t lightOn)來替代,小伙伴們讀一下附件的代碼估計就清楚了。
6.更進一步的測試
仔細再思考一下更復雜的燈控流程,看看有沒有小伙伴試一下做出來:
控制三色燈分別有各自獨立的行為:比如Red燈常亮的時候,Green燈按頻率1來閃爍,Blue燈按頻率2來閃爍。
Hi3516開發板上也有三色燈(紅、綠、紅外),移植到Hi3516開發板的小型系統上試試看。
審核編輯 :李倩
-
三色燈
+關注
關注
0文章
6瀏覽量
6213 -
rgb燈
+關注
關注
0文章
9瀏覽量
1901
原文標題:RK3568三色燈點燈流程/測試用例/修復bug
文章出處:【微信號:HarmonyOS_Community,微信公眾號:電子發燒友開源社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論