一、概述
(一)RT-Thread設備驅動
《RT-Thread設備驅動開發指南》書籍是RT-thread官方出品撰寫,系統講解RT-thread IO設備驅動開發方法,從三方面進行講解。
基礎篇:對RT-thread以及設備框架進行介紹,再分別介紹基于IO框架中常用的外設設備,分別是UART、PIN、SPI/QSPI、HWTIMER、PWM、RTC、ADC、DAC、WDT。
進階篇:介紹基于IO框架中稍比基礎篇復雜的外設設備,分別是SDIO、Touch、LCD、sensor、MTD nor、MTD nand、脈沖編碼器、加解密設備、PM設備。
高級篇:介紹更為復雜的外設設備,分別是WLAN、ETH、audio mic、audio sound、USB、CAN。
(二)先楫hpmicro bsp
為了深入了解本書的內容,得有一個單片機平臺進行案例剖析,除了本書籍以STM32的arm平臺進行介紹,還可以以先楫hpmicro單片機系列的riscv平臺進行講解。
剛好先楫在rtthread的bsp貢獻上,也是十分豐富。無論是在rtthread studio的bsp包上,還是rtthread倉庫的bsp支持上,都有提供了對應的支持。
rtthread studio的SDK支持,包括了先楫目前所有的MCU系列。
而在RT-thread上,bsp包的驅動支持上,也包括了rtthread大部分設備驅動。
二、開發方法
(一)層級結構
RT-Thread 提供了一套簡單的 I/O 設備模型框架,如下圖所示,它位于硬件和應用程序之間,共分成三層,從上到下分別是 I/O 設備管理層、設備驅動框架層、設備驅動層。
而作為單片機的定時器外設hwtimer功能,要對接到該IO設備框架,需要實現hwtimer設備的操作方法、設備的注冊、以及驅動的配置和驅動驗證。本文也是基于該開發方法進行闡述。
上述對應的三層驅動層,在源碼上,可以device->hwtimer->drv_hwtimer,其中drv_hwtimer是先楫官方實現的對接框架的驅動層。
而設備驅動框架層,提供了ops操作接口,分別以下的接口需要驅動開發者實現注冊。
(二)創建hwtimer設備
對hwtimer設備來說,在驅動開發時,需要先從rt_hwtimer_t結構中派生出新的hwtimer設備模型,然后根據自己的設備類型定義私有數據域。
同樣先楫的hwtimer drivers也定義了自己的由rt_hwtimer_t派生出來的hwtimer設備。
當然一個MCU也支持多個hwtimer,一個hwtimer驅動可以支持多個hwtimer設備,可以通過使能BSP_USING_GPTMRx進行開啟
(三)實現hwtimer設備的操作方法
該操作方法就是上述所說的ops操作結構,屬于驅動共用部分,也就是多個hwtimer設備可以共用一個ops操作。同樣先楫也實現了該操作方法,并且注冊到自身的hwtimer的父類hwtimer的ops中。
簡單舉例個操作方法的實現,比如獲取設備當前值count_get,原型如下:
rt_uint32_t (*count_get)(struct rt_hwtimer_device *timer);
而先楫實現的count_get是以上的hpm_hwtimer_count_get,可以看到,內部是先從timer獲取廠家自身定義的hwtimer設備,再從里面獲取硬件定時器的基地址控制句柄,然后使用先楫自身的驅動API獲取定時器的計數值進行返回。
(四)注冊hwtimer設備
注冊hwtimer設備,rtthread的IO設備框架提供了一個API:rt_device_hwtimer_register
從傳參句柄可知道,注冊時需要提供設備句柄timer,設備名稱name,用戶自定義data作為傳參。
在先楫的drv_hwtimer的驅動中,創建了個全局的hwtimer設備數組,里面包含了hwtimer的所有信息,包括設備名稱。然后在注冊初始化當中,輪詢該數組使能的定時器設備依次注冊到rtthread的hwtimer設備當中。
在開發指南當中,特別提到了一個注意點,hwtimer設備句柄需要實現rt_hwtimer_info,定義硬件定時器的特征信息,如計數的最大最小頻率,最大計數值以及計數方向,而先楫也同樣進行了實現。
(五)hwtimer設備中斷處理
在開發指南中,該部分也需要實現,目的是將定時時間導致的中斷事件通知到hwtimer設備驅動框架,讓驅動框架完成后續的處理并通知應用層。而該通知事件API則是rt_device_hwtimer_isr,該函數由rtthread的hwtimer設備驅動框架提供。
MCU下的hwtimer驅動,需要在中斷處理函數調用rt_device_hwtimer_isr函數,以便通知hwtimer設備驅動框架對應中斷的發生。
在先楫的hwtimer驅動中也是基于這個實現通知事件。
從以上代碼可知,hpmicro實現的hwtimer設備驅動接管了定時器的通用中斷服務函數hpm_hwtmr_isr,然后內部調用了rtthread的hwtimer設備驅動框架提供的rt_device_hwtimer_isr中斷處理函數,通
知設備框架對應的定時器定時時間到達。
(六)驅動配置
1、Kconfig配置
驅動配置主要通過Kconfig實現,這里使用hpm6750evk2的bsp V1.4.1作為說明。
在board文件夾中,有個Kconfig配置了hpm6750evk2的板載驅動信息。對于定時器驅動的相關選項如下:
RT_USING_HWTIMER:RT-thread的hwtimer設備驅動框架下的代碼對應的宏定義,控制hwtimer的驅動框架的相關代碼是否會添加到工程中
BSP_USING_GPTMR:先楫的hwtimer驅動下的代碼對應的宏定義,控制先楫的hwtimer驅動是否會添加到工程中
BSP_USING_GPTMR1: 使用先楫的定時器1
2、SConscript配置
libraries/drivers/SConscript文件為hwtimer驅動添加判斷選項,如果定義了BSP_USING_GPTMR,則對應的驅動文件drv_hwtimer就會被添加到工程的源文件中。
三、驅動驗證
使用hpm6750evk2的bsp V1.4.1作為說明,新建timer_demo的示例工程。
編譯燒錄代碼,使用list_device查看設備,可以看到注冊的設備已經包含了hwtimer這個設備。
運行自帶的shell命令hwtimer_sample,該命令會運行5s的定時,查看readme文檔
四、總結
1、基礎篇包含UART、PIN、SPI/QSPI、HWTIMER、PWM、RTC、ADC、DAC、WDT這些外設,本文以先楫適配的HWTIMER驅動進行說明,能感受到先楫對于rtthread驅動適配的完整性。
2、除了本文闡述的外設,其他基礎外設同樣適配完整。
我們始終相信開發者共創的力量。先楫社區堅持開源共享、互惠互利,貼近每一個開發者,一步一個腳印,一點一滴積累,為成為更好的我們而不斷努力。
-
設備驅動
+關注
關注
0文章
68瀏覽量
10889 -
BSP
+關注
關注
1文章
87瀏覽量
26158 -
RTThread
+關注
關注
8文章
132瀏覽量
40889
發布評論請先 登錄
相關推薦
評論