一、概述
經(jīng)過上一篇的《《RT-Thread設(shè)備驅(qū)動開發(fā)指南》基礎(chǔ)篇--以先楫bsp的hwtimer設(shè)備為例》闡述,可以大致了解到RT-thread設(shè)備驅(qū)動開發(fā)的方法步驟,開發(fā)指南中的進(jìn)階篇外設(shè)主要是比基礎(chǔ)篇外設(shè)復(fù)雜點(diǎn)的外設(shè)設(shè)備,分別是SDIO、Touch、LCD、sensor、MTD nor、MTD nand、脈沖編碼器、加解密設(shè)備、PM設(shè)備。
對于進(jìn)階篇的外設(shè),本文不對先楫已經(jīng)支持的進(jìn)階外設(shè)進(jìn)行闡述,而是進(jìn)行一次動手實(shí)踐驅(qū)動一個先楫尚未適配的驅(qū)動外設(shè)-LCD,來更加深入開發(fā)RT-thread的設(shè)備驅(qū)動。
來個效果:
在官方示例的wifi_web_camera_demo基礎(chǔ)上加上lcd驅(qū)動顯示攝像頭
二、開發(fā)方法
(一)RT-thread的LCD驅(qū)動框架介紹
LCD驅(qū)動,跟其他外設(shè)也類似,無非就是IO設(shè)備管理框架-->LCD設(shè)備驅(qū)動框架->LCD設(shè)備驅(qū)動。
IO設(shè)備管理層主要為設(shè)備框架提供統(tǒng)一的操作接口,包括rt_device_read/write/open/close/control等。而做好一個外設(shè)驅(qū)動,最終的目標(biāo)就是應(yīng)用上使用這些統(tǒng)一操作接口,無需理會底層操作。
LCD設(shè)備驅(qū)動框架層是RT-thread對LCD基本功能的抽象,是一層通用的軟件層,和硬件平臺無關(guān),抽象了LCD設(shè)備的類型定義和具體的操作方法,其框架源碼在rtdef.h中
LCD的信息結(jié)構(gòu) rt_device_graphic_info,定義了像素格式,位寬,寬高、顯存地址等。
LCD的操作接口rt_device_graphic_ops,定義了LCD的繪圖操作,比如像素點(diǎn)、畫線等操作。
LCD的控制命令,比如更新顯存、開關(guān)LCD、獲取信息、等待VSYNC等。
LCD的像素格式
可見,RT-thread對于LCD的抽象操作還是比較直觀,完成以上的操作,再借助IO設(shè)備管理層提供的注冊接口rt_device_register進(jìn)行注冊,即可使用IO設(shè)備管理接口操作LCD。
(二)先楫LCDC外設(shè)介紹
對于先楫的LCDC外設(shè)硬件控制器
在HPM6750上有RGB控制器,支持24位的RGB顯示接口
在HPM6800上,支持2 個 4 Lane MIPI-DSI/LVDS-Tx 顯示接口
對于在RT-thread上,也支持了hpm_sdk的panel組件,涵蓋了hpm6750和hpm6800的顯示適配。
對于hpm_sdk的panel組件介紹,可以參考文章《[hpm_application]選先楫!爽跑1080P or 720Pmipi屏的單片機(jī)》
對于使用LCD硬件控制器(RGB,MIPI DSI)通信的屏幕,LCD設(shè)備驅(qū)動只需要實(shí)現(xiàn)LCD設(shè)備的操作方法struct rt_device_ops即可,比如control接口里更新硬件控制器的緩存區(qū)即可控制屏幕繪圖。
如此一來,配合先楫適配好的RT-thread BSP,可以很順手得適配好LCD的驅(qū)動,按先楫BSP的driver照葫蘆畫瓢個drv_lcd。
(三)創(chuàng)建LCD設(shè)備
下面來創(chuàng)建先楫的LCD設(shè)備。LCD設(shè)備模型從struct rt_device結(jié)構(gòu)體中派生,并添加自己的私有數(shù)據(jù)。
成員主要有LCD的基地址,中斷號,互斥鎖,LCD名稱等。
實(shí)例化一個lcd的設(shè)備數(shù)組,可以存在多個lcd設(shè)備,里面包含設(shè)備的初始化參數(shù)。
(四)實(shí)現(xiàn)LCD設(shè)備的操作方法
按照以上的定義,已經(jīng)實(shí)例化了一個hpm_lcd_ops結(jié)構(gòu)體,然后需要實(shí)現(xiàn)對應(yīng)的操作函數(shù),也就是LCD設(shè)備定義操作方法。對于LCD設(shè)備來說,只有其中的init和control操作方法才有意義,而本文實(shí)現(xiàn)的也是這兩個接口,分別是hpm_lcd_init、hpm_lcd_control。
1、init:初始化LCD設(shè)備
對于該操作方法,先楫的LCD驅(qū)動代碼不需要執(zhí)行任何操作,只需要在注冊初始化LCD即可。
2、control:控制LCD設(shè)備
應(yīng)用程序也可以對LCD設(shè)備進(jìn)行控制,通過control方法完成。原型如下:
其中參數(shù)cmd包含了控制LCD的方式,通用設(shè)備命令可取以下宏定義:
當(dāng)然在最新的rtthread 5.0.2當(dāng)中也更新了幾個命令
本文在這里主要實(shí)現(xiàn)以下幾個命令
(1)RTGRAPHIC_CTRL_RECT_UPDATE 更新顯存
對于顯存的更新,可以使用控制器自身定義的顯存也可以使用傳入的顯存地址,在先楫的手冊中有提到影子寄存器加載使能功能,也就是顯存會在下一個VSYNC到達(dá)加載,這樣可以做到顯示的完整更新。
而在hpmicro的驅(qū)動中也提供了該API:lcdc_layer_set_next_buffer,這里適配的驅(qū)動使用第一層layer。
故可以下實(shí)現(xiàn):
(2)RTGRAPHIC_CTRL_WAIT_VSYNC 等待幀完成
為了保證傳輸?shù)母咝Ш头浪毫?,這里使用中斷方式傳輸一幀,再下一幀更新之前等待VSYNC完畢。
(3)RTGRAPHIC_CTRL_GET_INFO 獲取LCD信息
主要獲取LCD的像素格式、寬高等,傳遞給args參數(shù)
(4)RTGRAPHIC_CTRL_POWERON亮屏
RTGRAPHIC_CTRL_POWEROFF 息屏
調(diào)用hpm_sdk的panel組件接口即可。
(五)注冊LCD設(shè)備
使用IO設(shè)備框架的rt_device_register完成注冊,主要關(guān)注設(shè)備操作方法的賦值部分,以及保存lcd設(shè)備示例賦值給lcd的user_data成員。
(六)驅(qū)動配置
在board的Kconfig中使能LCD,該宏控制LCD驅(qū)動相關(guān)代碼是否添加到工程中
另外添加panel組件,該宏先楫已經(jīng)實(shí)現(xiàn),這里使用的是hpm6750,故只有RGB接口。
在驅(qū)動drivers的SConscript文件添加LCD驅(qū)動的判斷選項(xiàng),如果使能,drv_lcd.c則會被添加到工程中。
(七)驅(qū)動驗(yàn)證
注冊設(shè)備之后,LCD設(shè)備將會在IO設(shè)備管理器中出現(xiàn),我們使用hpm6750evkmini的wifi_web_camera_demo這個官方示例作為驗(yàn)證,燒錄驗(yàn)證,使用list device命令查看到注冊的設(shè)備已經(jīng)包含了LCD設(shè)備。
在wifi_web_camera_demo的示例上,在獲取camera圖像的接口中,添加lcd的設(shè)備操作,把圖像顯示到LCD上,只需要先打開lcd,然后進(jìn)行control,兩條語句就可以實(shí)現(xiàn)顯示,特別方便操作。
最終可以實(shí)現(xiàn)使用簡單的IO設(shè)備即可操作LCD
審核編輯:劉清
-
控制器
+關(guān)注
關(guān)注
112文章
16332瀏覽量
177800 -
RGB
+關(guān)注
關(guān)注
4文章
798瀏覽量
58460 -
LCD驅(qū)動
+關(guān)注
關(guān)注
4文章
88瀏覽量
26639 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1285瀏覽量
40077 -
脈沖編碼器
+關(guān)注
關(guān)注
0文章
13瀏覽量
8250
原文標(biāo)題:RT-Thread設(shè)備驅(qū)動開發(fā)指南進(jìn)階篇--動手驅(qū)動先楫LCD外設(shè)
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論