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