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