基于定時(shí)器、RTC、WDT本質(zhì)上均是計(jì)數(shù)器的共性,本次將這三種通用外設(shè)統(tǒng)一為TIM。以TIM為例,來展示如何開發(fā)通用驅(qū)動(dòng)外設(shè)代碼。對(duì)于AMetal所提供的標(biāo)準(zhǔn)層驅(qū)動(dòng)文件,均存放于ametal\interface路徑下。
如下圖所示,開發(fā)通用外設(shè)驅(qū)動(dòng)主要包含以下步驟:了解通用外設(shè)標(biāo)準(zhǔn)接口層、外設(shè)硬件層開發(fā)、外設(shè)驅(qū)動(dòng)層開發(fā)、外設(shè)用戶配置文件開發(fā)、外設(shè)例程文件開發(fā)。
了解通用外設(shè)標(biāo)準(zhǔn)層
1、通用外設(shè)標(biāo)準(zhǔn)接口相關(guān)類型定義
以WDT為例,如下所示為WDT的標(biāo)準(zhǔn)接口文件中對(duì)每個(gè)結(jié)構(gòu)體和handle的詳細(xì)介紹。
以此類推,對(duì)于定時(shí)器和RTC,其標(biāo)準(zhǔn)接口文件中均定義了驅(qū)動(dòng)函數(shù)結(jié)構(gòu)體、標(biāo)準(zhǔn)服務(wù)結(jié)構(gòu)體和外設(shè)標(biāo)準(zhǔn)服務(wù)操作句柄。
struct am_xxx_drv_funcs結(jié)構(gòu)體
該驅(qū)動(dòng)函數(shù)結(jié)構(gòu)體表明了驅(qū)動(dòng)層應(yīng)該提供對(duì)應(yīng)的函數(shù);
typedef struct am_xxx_serv結(jié)構(gòu)體
該標(biāo)準(zhǔn)服務(wù)結(jié)構(gòu)體定義了標(biāo)準(zhǔn)的通用外設(shè)服務(wù),從而包含了需要驅(qū)動(dòng)層為標(biāo)準(zhǔn)接口層提供的全部?jī)?nèi)容。驅(qū)動(dòng)層就只需定義這樣一個(gè)結(jié)構(gòu)體變量,然后賦好相應(yīng)的值,再以某種方式提供給標(biāo)準(zhǔn)接口層即可。
am_xxx_handle_t的定義
這是一個(gè)標(biāo)準(zhǔn)的操作句柄,本質(zhì)上就是標(biāo)準(zhǔn)服務(wù)結(jié)構(gòu)體指針類型,驅(qū)動(dòng)層的初始化函數(shù)需要返回該類型的handle給用戶。當(dāng)用戶在使用標(biāo)準(zhǔn)接口層函數(shù)時(shí),就可以將獲取到的handle傳遞給標(biāo)準(zhǔn)層。那么,標(biāo)準(zhǔn)接口層就可以通過該handle訪問到驅(qū)動(dòng)層提供的函數(shù)了。
2、標(biāo)準(zhǔn)接口函數(shù)
以WDT為例,如下所示為WDT標(biāo)準(zhǔn)接口函數(shù),通過內(nèi)聯(lián)函數(shù)來實(shí)現(xiàn)。這些函數(shù)就只是簡(jiǎn)單地調(diào)用驅(qū)動(dòng)層提供的函數(shù),本身并沒有做什么事情。每個(gè)函數(shù)都有對(duì)應(yīng)詳細(xì)的注釋,傳入參數(shù)和返回值。從中可以看到,在調(diào)用驅(qū)動(dòng)層提供的函數(shù)時(shí),就是將外設(shè)標(biāo)準(zhǔn)服務(wù)操作句柄(本質(zhì)上為標(biāo)準(zhǔn)服務(wù)結(jié)構(gòu)體)中的p_drv成員作為第一個(gè)參數(shù)傳遞。
外設(shè)HW層開發(fā)
HW 層對(duì)應(yīng)到具體的外設(shè),其提供的API基本上是直接操作寄存器的內(nèi)聯(lián)函數(shù),效率最高,內(nèi)聯(lián)函數(shù)直接定義在.h 文件中。根據(jù)芯片手冊(cè),來添加外設(shè)的寄存器列表;并編寫寄存器相關(guān)操作的內(nèi)聯(lián)函數(shù)。以某款芯片的WDT為例,如下所示為WDT的寄存器列表,從而來明確各個(gè)寄存器的功能。
根據(jù)寄存器列表,了解了各個(gè)寄存器需要配置的各項(xiàng)功能和其他寄存器位該如何配合等。如下所示為WDT寄存器結(jié)構(gòu)體定義。
接下來需要編寫每個(gè)寄存器的功能操作函數(shù)即可完成外設(shè)硬件層的開發(fā)。以WDT的控制寄存器cr為例,來編寫該寄存器的硬件層函數(shù)接口,如下所示:
對(duì)于定時(shí)器、RTC的硬件層驅(qū)動(dòng)開發(fā)亦是通過芯片手冊(cè)來編寫寄存器操作函數(shù)來完成驅(qū)動(dòng)。
外設(shè)驅(qū)動(dòng)層開發(fā)
1、定義設(shè)備信息結(jié)構(gòu)體和設(shè)備結(jié)構(gòu)體
在AMetal中,每個(gè)設(shè)備都應(yīng)該有與之對(duì)應(yīng)的設(shè)備結(jié)構(gòu)體和設(shè)備信息結(jié)構(gòu)體。設(shè)備結(jié)構(gòu)體主要用于內(nèi)存分配,與設(shè)備相關(guān)的變量都應(yīng)該定義在設(shè)備結(jié)構(gòu)體中。設(shè)備信息結(jié)構(gòu)體主要包含該設(shè)備的一些相關(guān)信息。
2、驅(qū)動(dòng)函數(shù)實(shí)現(xiàn)
驅(qū)動(dòng)函數(shù)主要包括兩部分:提供給標(biāo)準(zhǔn)層的驅(qū)動(dòng)函數(shù)和初始化、解初始化函數(shù)。
以WDT為例,如下所示為WDT外設(shè)的驅(qū)動(dòng)層應(yīng)該給標(biāo)準(zhǔn)接口層提供的函數(shù),按照芯片手冊(cè)中對(duì)應(yīng)操作說明來完成看門狗的驅(qū)動(dòng)層函數(shù)。
如下所示為WDT初始化函數(shù)和解初始化函數(shù);初始化函數(shù)主要是為了初始化設(shè)備中的標(biāo)準(zhǔn)服務(wù)和硬件相關(guān)設(shè)置;解初始化函數(shù)是為了釋放內(nèi)存資源和硬件資源。
對(duì)于定時(shí)器和RTC的驅(qū)動(dòng)層開發(fā),其大致流程亦是如此。
外設(shè)用戶配置文件開發(fā)
開發(fā)完驅(qū)動(dòng)層我們知道,用戶使用一個(gè)外設(shè)的過程是,先調(diào)用驅(qū)動(dòng)初始化函數(shù),該函數(shù)返回一個(gè)handle,后續(xù)的所有操作,用戶直接使用該handle作為參數(shù)調(diào)用標(biāo)準(zhǔn)接口層函數(shù)即可。
以某款芯片的 WDT為例,如下所示為WDT的用戶配置文件,主要包含設(shè)備信息結(jié)構(gòu)體、設(shè)備實(shí)例結(jié)構(gòu)體及其平臺(tái)初始化函數(shù)與解初始化函數(shù)。定義好變量和函數(shù)后,在頭文件中添加函數(shù)聲明。用戶在使用時(shí),只需調(diào)用外設(shè)實(shí)例初始化函數(shù),并保存其返回的handle,后續(xù)直接使用該handle作為標(biāo)準(zhǔn)接口的第一個(gè)參數(shù)來調(diào)用標(biāo)準(zhǔn)接口函數(shù)即可。
對(duì)于定時(shí)器和RTC的用戶配置文件,配置其對(duì)應(yīng)的設(shè)備信息,添加平臺(tái)初始化函數(shù)與解初始化函數(shù)即可。
外設(shè)例程文件開發(fā)
外設(shè)的例程文件主要分為HW層示例和STD示例。
對(duì)于STD示例,調(diào)用標(biāo)準(zhǔn)層函數(shù)和實(shí)例初始化函數(shù)返回的handle作為參數(shù)傳入,來實(shí)現(xiàn)外設(shè)功能。
對(duì)于HW示例,可參考驅(qū)動(dòng)層函數(shù)來添加硬件層示例功能函數(shù),最終實(shí)現(xiàn)外設(shè)功能。
至此,我們完成了一個(gè)通用外設(shè)驅(qū)動(dòng)的開發(fā)。
來源:立功科技
-
Tim
+關(guān)注
關(guān)注
0文章
81瀏覽量
17953 -
ametal
+關(guān)注
關(guān)注
2文章
24瀏覽量
11421
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論