0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

AWBus-lite的拓撲結(jié)構(gòu)及應用設計

AGk5_ZLG_zhiyua ? 來源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2018-06-21 09:10 ? 次閱讀

本文導讀

為了管理系統(tǒng)中各式各樣的硬件設備(或虛擬硬件設備),AWorks推出了領先的輕量級總線管理框架:AWBus-lite,實現(xiàn)了硬件設備和驅(qū)動的徹底分離,使設備驅(qū)動可以最大限度的得到復用。本文介紹了AWBus-lite的基礎概念,以及如何使用和配置AWbus-lite。

本文為《面向AWorks框架和接口編程》第三部分軟件篇——第12章AWBus-lite總線框架——第1~4小節(jié):AWBus-lite簡介、AWBus-lite拓撲結(jié)構(gòu)、系統(tǒng)硬件資源和訪問設備。

本章導讀

嵌入式系統(tǒng)中,硬件外設的種類非常繁多,例如,GPIO、ADCUART、按鍵、數(shù)碼管、RTC、LM75、EEPROM、SD卡、U盤等。正確使用各個外設的基礎是平臺中具有相應的驅(qū)動,隨著外設種類的不斷增加,驅(qū)動也隨之越來越多,為了高效的管理眾多的外設和驅(qū)動,AWorks推出了領先的輕量級總線管理框架:AWBus-lite。AWBus-lite作為AWorks中最重要的組件之一,負責管理系統(tǒng)中所有的硬件設備(或虛擬硬件設備),實現(xiàn)硬件外設和驅(qū)動的分離,使驅(qū)動可以最大限度的得到復用。

本章作為AWBus-lite的入門,主要介紹了AWBus-lite的拓撲結(jié)構(gòu),以及基本的設備、總線、驅(qū)動相關的概念,重點從用戶角度出發(fā),講述如何使用、配置AWBus-lite。

12.1 AWBus-lite簡介

隨著MCU的快速發(fā)展,越來越多的硬件外設集成到了MCU內(nèi)部(片內(nèi)外設),這部分外設可以直接通過CPU操作相應的寄存器使用,例如,i.MX28x中的GPIO、ADC、UART等。一些外設在MCU外部(片外外設),必須通過某種總線進行訪問,比如PCF85063,需要通過I2C總線訪問;SD卡,需要通過SDIO總線訪問。

為了使用統(tǒng)一的拓撲結(jié)構(gòu)描述所有的片外和片內(nèi)外設,在AWBus-lite中,把CPU直接控制的總線統(tǒng)稱為PLB(Processor Local Bus,CPU本地總線),集成在MCU內(nèi)部的外設就掛在該總線上。例如:在一個系統(tǒng)中,硬件設備連接示意圖詳見圖12.1(a),其對應的AWBus-lite軟件拓撲結(jié)構(gòu)詳見圖12.1(b)。

圖12.1 AWBus-lite抽象

AWBus-lite提供了一種機制,使得我們可以在軟件環(huán)境里建立、還原系統(tǒng)的硬件總線拓撲結(jié)構(gòu)。如圖12.1所示,圖12.1(a)為一個可能的系統(tǒng)總線的物理拓撲結(jié)構(gòu)(僅作示例之用),圖12.1(b)為在AWBus-lite中抽象出來的系統(tǒng)總線模型。由此可見,在軟件中抽象出來的對象同真實世界的對象一一對應!

圖12.1(a)僅作為一種示例,與實際硬件可能存在差異。整個硬件被分為了核心板(i.MX28xPack board)和用戶板(User Board)兩部分。核心板又分為MCU(i.MX28x)和外圍器件(ICs)兩個部分,MCU又分為內(nèi)核(ARM)和片內(nèi)外設兩個部分。

內(nèi)核的核心是CPU,其可以直接控制片上外設,這里虛擬了一個PLB控制器,其產(chǎn)生了一條PLB總線,由CPU直接控制,片內(nèi)外設均直接掛在PLB總線上。

片內(nèi)外設集成在芯片內(nèi)部,例如,GPIO、I2C、UART等,它們掛在PLB總線上。其中部分片內(nèi)外設又是總線控制器(比如I2C),它們又可以擴展出一條總線到片外,例如,I2C0擴展出一條總線I2C bus 0,I2C1擴展出一條總線II2C bus 1。擴展的總線可以連接一些外圍器件。

這些器件可能處于核心板中,比如

SC18IS602B(一款I2C轉(zhuǎn)SPI芯片,僅用作拓撲結(jié)構(gòu)展示,無需深入了解)、

CAT24C02(EEPROM)、PCF85063(RTC芯片),也可能處于用戶板上,比如CAT9555(一款I2C轉(zhuǎn)GPIO芯片,僅用作拓撲結(jié)構(gòu)展示,無需深入了解)。

一些外圍器件可能又是總線控制器,則其又可以擴展出一條總線,比如SC18IS602B,其為I2C轉(zhuǎn)SPI芯片,可以擴展出SPI總線,在SPI總線上,又可以掛在其它SPI接口的器件,比如:SC16IS752(一款SPI轉(zhuǎn)UART芯片,僅用作拓撲結(jié)構(gòu)展示,用戶無需了解具體細節(jié))。特別地,若連接的芯片又是一個總線控制器,則可以繼續(xù)擴展總線,從理論上講,通過添加總線控制器,可以將系統(tǒng)的總線層次無限地增加,即系統(tǒng)的功能外設可無限擴展。

圖12.1(b)為對應的軟件拓撲結(jié)構(gòu)圖,在軟件環(huán)境中,外設對象與真實硬件設備呈一一對應關系。不過,軟件環(huán)境中并不區(qū)分設備的物理位置,只考慮設備的父總線,比如CAT9555(用戶板上)和PCF85063(核心板上)都是掛在I2C bus 1上的,則它們處于同一個層級。

12.2 AWBus-lite拓撲結(jié)構(gòu)

在圖12.1中,以一個具體的示例說明了AWbus-lite的基本結(jié)構(gòu),展示了AWBus-Lite對現(xiàn)實世界的一種抽象。從具體到一般,一個更加抽象的總線拓撲結(jié)構(gòu)詳見圖12.2。

圖12.2 AWBus-lite總線拓撲結(jié)構(gòu)圖

其中,Bus Controller 0是由CPU直接控制的總線控制器,通常情況下,其為PLBController,以擴展出一條PLB總線。在總線拓撲結(jié)構(gòu)圖中,抽象了3個重要的概念:設備、總線控制器、總線。

  • 設備

設備是指掛在某條總線上的硬件外設(或虛擬外設)。例如,圖12.1中的GPIO、CAT24C02、CAT9555等。

  • 總線控制器

總線控制器是一種特殊的設備,它可以擴展出一條下游總線,這條總線上又能掛其它設備(包括總線控制器)。例如,圖12.1中的I2C0、SC18IS602B等。

  • 總線

任何設備或總線控制器都必須掛在一條總線上。AWBus-lite不區(qū)分CPU的具體類型,把CPU直接控制的總線統(tǒng)稱為 PLB,PLB為根總線。其它總線由總線控制器產(chǎn)生,例如,圖12.1中的I2C Bus 0、I2C Bus 1、SPI Bus等。

“設備”是最為核心的概念,其它概念都可以基于“設備”進行描述:“設備”掛在“總線”上,特殊“設備”(總線控制器設備)擴展出一條下游總線。能夠正常使用一個設備的前提是系統(tǒng)中具有設備相應的驅(qū)動,例如,要使用i.MX28x的GPIO去控制一個LED,就必須具有相應的GPIO驅(qū)動,以設置GPIO的模式、輸出電平等,最終達到控制LED的目的。也就是說,要使系統(tǒng)具有訪問和控制設備的能力,就必須具有相應的驅(qū)動。這就需要掌握另外一個非常重要的概念:設備驅(qū)動。

設備驅(qū)動提供了訪問和控制設備(包括特殊的設備:總線控制器)的能力,在AWBus-lite中,將設備和驅(qū)動進行了很好的分離,使驅(qū)動可以最大限度的得到復用。通常情況下,系統(tǒng)中可能存在多個相同類型的設備。例如,在i.MX28x中,存在I2C0和I2C1共計兩個I2C總線控制器,它們的操作方法是完全相同的,這種情況下,I2C0和I2C1設備即可復用一份驅(qū)動。示意圖詳見圖12.3。

圖12.3I2C0和I2C1復用同一份驅(qū)動

其它片上外設或外圍器件同樣如此,多個同類型的設備可以復用一份驅(qū)動,這不僅極大的提高了代碼復用率,縮小了程序占用的存儲空間,也給代碼的管理、維護、擴展帶來了極大的便利。這是面向?qū)ο缶幊處淼暮锰?,在這里,設備驅(qū)動就相當于一個類,而設備就是類的一個實例。

12.3 系統(tǒng)硬件資源

在開發(fā)實際應用程序前,首先要規(guī)劃系統(tǒng)的硬件資源,即要構(gòu)建出如圖12.1(a)所示的硬件物理拓撲結(jié)構(gòu)。接下來,就需要對系統(tǒng)軟件進行配置,添加相應的設備,以搭建出與之對應的如圖12.1(b)所示的軟件拓撲結(jié)構(gòu)。通常情況下,AWorks SDK提供的工程模板已經(jīng)配置好了系統(tǒng)相應的硬件資源,完成了基礎軟件拓撲結(jié)構(gòu)的搭建,對于不同的用戶需求,可能需要添加或刪除一些設備,這種情況下,可以直接在模板工程的基礎上對系統(tǒng)硬件資源進行簡要的調(diào)整。

12.3.1 硬件設備列表

AWBus-lite使用名為

awbus_lite_hwconf_usrcfg.c的硬件配置文件來定義系統(tǒng)的硬件資源,此文件存放于AWorks SDK提供的工程模板中。硬件配置文件的核心功能是為系統(tǒng)提供一個硬件列表,即一個名為:g_awbl_devhcf_list[]的數(shù)組,該數(shù)組的每一個成員都描述了系統(tǒng)中的一個硬件設備。一個簡單的示例片段詳見程序清單12.1。

程序清單12.1 硬件設備列表(awbus_lite_hwconf_usrcfg.c)

在AWBus-lite中,以“awbl_”作為命名空間,“awbl”是AWBus-lite的縮寫。aw_const是用于定義常量的修飾符,其等效于C語言中的關鍵字:const。

g_awbl_devhcf_list[]數(shù)組為定義的硬件設備列表,g_awbl_devhcf_list_count定義了列表中設備的個數(shù)。AW_NELEMENTS()為獲取數(shù)組元素個數(shù)的宏,其定義如下(aw_common.h):

12.3.2 設備描述類型

由數(shù)組的定義可知,數(shù)組中每個元素的實際類型為struct awbl_devhcf,其描述了一個硬件設備在系統(tǒng)總線拓撲結(jié)構(gòu)中的位置以及設備的配置,具體類型定義詳見程序清單12.2。

程序清單12.2 struct awbl_devhcf類型定義(awbus_lite.h)

1. 設備名

設備名為一個字符串,此名字需要與設備驅(qū)動的名字一致,系統(tǒng)將根據(jù)此名字查找該設備對應的驅(qū)動。在系統(tǒng)啟動時,最重要的步驟之一就是將設備和設備驅(qū)動綁定,以便正確使用各個設備。要使系統(tǒng)能夠正確查找到設備相應的驅(qū)動,設備名必須與相應的驅(qū)動名一致。

為確保一致性,在開發(fā)驅(qū)動時,往往使用宏定義的形式將驅(qū)動名定義在頭文件中,在描述一個硬件設備時,直接使用該宏定義作為其設備名即可。

例如,i.MX28x的片上I2C設備驅(qū)動,其對應的驅(qū)動頭文件為:awbl_imx28_i2c.h,在該文件中,定義了驅(qū)動名為AWBL_IMX28_I2C_NAME,完整定義如下:

基于此,在描述I2C設備(如描述I2C1設備),對應的設備名應該設定為:

AWBL_IMX28_I2C_NAME。

又如,對于PCF85063設備驅(qū)動,其對應的驅(qū)動頭文件為:awbl_pcf85063.h,在該文件中,定義了驅(qū)動名為:AWBL_PCF85063_NAME。其完整的定義如下:

基于此,在描述PCF85063設備時,其設備名應該設定為:

AWBL_PCF85063_NAME。

2. 設備單元號

設備單元號用于區(qū)分系統(tǒng)中幾個相同的硬件設備,它們的設備名一樣,復用同一份驅(qū)動。

AWBus-lite建議設備單元號從0開始連續(xù)分配。

例如,在i.MX28x中,具有兩個I2C片內(nèi)外設,則I2C0的設備單元號為0,I2C1的設備單元號為1。又如,對于PCF85063設備,若只外接了一個PCF85063,則設備單元號為0,若外接了兩個PCF85063,則設備單元號分別為0、1。通常情況下,一個系統(tǒng)中只會使用一個外部RTC,不會連接兩個外部RTC芯片,此時,將設備單元號設置為0即可。

注意,在通用接口中,通常有一個用于指定設備的ID,例如,在RTC接口中,使用ID指定要操作的RTC設備。設備單元號與該ID的概念是不同的,設備單元號用于區(qū)分幾個使用同一驅(qū)動的設備,ID用于區(qū)分同一類的設備(這些設備不一定使用相同的驅(qū)動)。

例如,i.MX28x具有片上RTC外設,其掛在PLB總線上,顯然,其驅(qū)動方法與掛在I2C總線上的PCF85063是不一樣的。若系統(tǒng)同時使用了片上RTC外設和一個片外PCF85063,由于它們并不使用同一份驅(qū)動,因此,在描述這兩個設備時,設備名是不一樣的,設備單元號可各自獨立分配,互不影響,均可設置為0。但是,由于這兩個設備均可以為系統(tǒng)RTC服務,可以使用RTC通用接口操作這兩個設備,為了區(qū)分這兩個設備,它們的ID必須統(tǒng)一編排,例如,為片上RTC外設分配編號0,為PCF85063分配編號1,不可設置為一樣。ID在一個設備對應的設備信息中配置,將在后文詳細介紹。

3. 設備父總線的類型

設備父總線的類型指出了設備掛接在哪種類型的總線上,例如,PLB、I2C、SPI、USB、SDIO、PCI等。各總線的類型已經(jīng)在awbus_lite.h文件中定義,部分常用總線對應的宏定義詳見表12.1。

表12.1 總線類型宏定義

例如,i.MX28x的片上I2C1設備,其由CPU直接控制,掛接在PLB總線上,因此,對于I2C1設備,bus_type的值為:AWBL_BUSID_PLB。

對于PCF85063設備,其作為一種I2C從機器件,掛接在I2C總線上,因此,對于PCF85063設備,bus_type的值為:AWBL_BUSID_I2C。

4. 設備父總線的編號

設備父總線的編號用于區(qū)分系統(tǒng)中多條類型相同的總線。AWBus-lite建議總線編號從0開始連續(xù)分配。

在AWBus-lite中,PLB總線是一條特殊的虛擬總線,只有一條,因此,對于掛在PLB總線上的設備,比如i.MX28x的片上I2C1設備,它們的設備父總線編號總是為0。其它類型的總線可能有多條,例如,i.MX28x具有兩個I2C片上外設:I2C0、I2C1,它們作為一種總線控制器,可以各自擴展出一條I2C總線,致使系統(tǒng)中有兩條I2C總線,可將它們的總線編號分別設置為0、1。對于PCF85063,若其連接在I2C0總線上,則bus_index的值為0;若其連接在I2C1總線上,則bus_index的值為1。

5. 設備實例內(nèi)存

設備驅(qū)動相當于定義了一個類,而具體的設備相當于這個類的一個實例,顯然,實例需要占用一定的內(nèi)存空間。而在AWBus-lite中,并不使用動態(tài)內(nèi)存分配,因此,需要在描述一個設備的同時,完成設備實例的靜態(tài)定義,為設備實例分配必要的內(nèi)存空間。p_dev即為指向靜態(tài)定義的設備實例的指針,其類型struct awbl_dev是AWBus-lite定義的基礎設備類型,其具體定義用戶無需關心。實際設備類型均是從基礎設備類型派生而來的,例如,PCF85063的設備類型可能定義為:

由于實際設備類型僅用于在描述設備時分配設備實例相關的內(nèi)存,并不需要操作其中的成員,因此,用戶并不需要關心實際設備類型的具體定義(比如,具體包含哪些成員等)。用戶只需要了解到實際設備類型是從基礎設備類型派生而來的,因而可以將實際設備類型的指針強轉(zhuǎn)為基礎設備類型的指針進行使用(之類轉(zhuǎn)換為父類)。

例如,對于i.MX28x的片上I2C1設備,在其對應的驅(qū)動頭文件awbl_imx28_i2c.h中定義了I2C設備的類型為struct awbl_imx28_i2c_dev,使用該類型定義一個I2C1設備實例,即可完成設備實例的內(nèi)存分配,例如:

注: aw_local用于將函數(shù)作用域限制在文件內(nèi)部,或?qū)⒆兞康淖饔糜蛳拗圃谖募蚝瘮?shù)內(nèi)部,同時,將aw_local修飾的變量存放在全局靜態(tài)區(qū)域,在整個程序的生命周期均保持有效。其本質(zhì)上等效于C語言中的關鍵字:static。

其地址&__g_imx28_i2c1_dev即可作為設備描述中p_dev的值。雖然其類型與p_dev的類型并不相同,但由于struct awbl_imx28_i2c_dev類型繼承自struct awbl_dev類型,是基礎設備類型的一個子類,可以將子類轉(zhuǎn)換為父類使用,例如,將p_dev設置為:

同理,對于PCF85063設備,在其對應的驅(qū)動頭文件awbl_pcf85063.h中定義了PCF85063的設備類型為struct awbl_pcf85063_dev,使用該類型定義一個PCF85063設備實例,即可完成設備實例的內(nèi)存分配,例如:

其地址&__g_pcf85063_0_dev即可作為設備描述中p_dev的值,例如,將p_dev設置為:

6. 設備信息

設備信息描述了設備的一些配置信息,例如,設備的基地址、中斷號等信息。設備信息的具體類型是由設備驅(qū)動定義的。用戶需要根據(jù)實際設備信息的類型定義一個設備信息,并將其地址賦值給設備描述中的p_devinfo。該信息最終會傳遞給驅(qū)動使用,以便正確的驅(qū)動相應設備。

  • I2C1設備信息定義范例

對于i.MX28x的片上I2C1設備,在其對應的驅(qū)動頭文件awbl_imx28_i2c.h中定義了I2C設備信息類型為struct awbl_imx28_i2c_devinfo,其具體定義詳見程序清單12.3。

程序清單12.3 I2C設備信息類型定義(awbl_imx28_i2c.h)

I2C設備是一個I2C控制器,可以擴展出一條I2C總線,i2c_master_devinfo即用于提供I2C線相關的信息,比如:總線的編號、速率、超時時間等。其類型structawbl_i2c_master_devinfo的定義詳見程序清單12.4。

程序清單12.4 struct awbl_i2c_master_devinfo類型定義(awbl_i2cbus.h)

其中bus_index表示該I2C控制器擴展出的I2C總線對應的編號,若某一設備(如PCF85063)在硬件上與I2C1連接,則在其設備描述中,父總線的編號應與該值保持一致。speed表示該I2C總線的速率。通常情況下,為了便于配置,將總線編號和速率使用宏的形式定義在aw_prj_param.h文件中,例如,將總線ID定義為1,速率定義為200KHz:

后續(xù)使用這兩個宏分別作為bus_index和speed的值即可。

timeout表示超時時間,若使用通用I2C接口在該總線上的某一操作(如讀數(shù)據(jù)或?qū)憯?shù)據(jù))超過了該處定義的超時超時,則相應接口將返回超時錯誤。特別地,若將該值設置為

AWBL_I2C_WAITFOREVER

(其是在awbl_i2cbus.h文件中定義的宏),則表示永久等待,也可以設置為其它正整數(shù)值,例如,500,則表示超時時間為500個tick。

regbase表示I2C設備的基地址,對于i.MX28x,所有片內(nèi)外設的基地址均在imx28x_regbase.h文件中定義,例如,I2C1的基地址定義如下:

由此可見,I2C1設備的基地址為0x8005A000,該值可以從i.MX28x的用戶手冊中獲得。

inum表示I2C設備的中斷號,驅(qū)動可以使用該中斷號使用系統(tǒng)中斷資源,以使I2C設備可以基于中斷機制進行數(shù)據(jù)通信。對于i.MX28x,所有片內(nèi)外設的中斷號均在imx28x_inum.h文件中定義,例如,I2C1設備的中斷號定義如下:

由此可見,I2C1設備的中斷號為110,該值可以從i.MX28x的用戶手冊中獲得。

clkfreq表示I2C模塊的輸入時鐘頻率,在i.MX28x中,默認頻率為24MHz,該值通常不需要修改。

pfunc_plfm_init是一個函數(shù)指針,指向一個無參數(shù)、無返回值的平臺初始化函數(shù),用于完成平臺相關的初始化操作,比如引腳配置等。例如,在定義一個平臺初始化函數(shù),完成I2C1設備的SCL和SDA引腳配置,詳見詳見程序清單12.5。

程序清單12.5 實現(xiàn)一個平臺初始化函數(shù)

其中,__imx28_i2c1_plfm_init為實現(xiàn)的平臺初始化函數(shù),其可直接作為設備信息中

pfunc_plfm_init的值。

基于上面對各個成員的描述,可以定義一個典型的設備信息,詳見程序清單12.6。

程序清單12.6 I2C1設備信息定義

完成設備信息的定義后,其地址

&__g_imx28_i2c1_devinfo即可作為設備描述中p_devinfo的值。

  • PCF85063設備信息定義范例

對于PCF85063設備,在其對應的驅(qū)動頭文件awbl_pcf85063.h中定義了PCF85063的設備信息類型為awbl_pcf85063_devinfo_t,其具體定義詳見程序清單12.7。

程序清單12.7 PCF85063設備信息類型定義(awbl_pcf85063.h)

其中,rtc_servinfo包含了RTC標準服務相關的信息,目前僅包含了RTC的編號,其類型定義詳見程序清單12.8。

程序清單12.8 RTC通用服務信息類型定義(awbl_rtc.h)

通過RTC通用接口的介紹可知,在使用通用接口操作RTC時,需要通過rtc_id指定使用的RTC設備,rtc_id通常從0開始編號。rtc_servinfo中的rtc_id即用于指定該設備對應的ID號,如果設置為0,則用戶在使用RTC通用接口時,將rtc_id參數(shù)設置為0即可操作到此處定義的硬件設備。

addr為PCF85063的7位I2C從機地址,通過查看PCF85063的數(shù)據(jù)手冊可知,PCF85063的7位I2C從機地址為0x51。

基于rtc_id和addr的值,可以完成PCF85063設備信息的定義,詳見程序清單12.9。

程序清單12.9 PCF85063設備信息定義范例

完成設備信息的定義后,其地址

&__g_pcf85063_0_devinfo即可作為設備描述中p_devinfo的值。

12.3.3 設備描述宏定義

在g_awbl_devhcf_list[]數(shù)組中,每個元素都是以“AWBL_HWCONF_”作為前綴的一個宏。該宏本質(zhì)上完成了一個設備描述的定義。

例如,對于i.MX28x的片上I2C1設備,其對應的宏為:AWBL_HWCONF_IMX28_I2C0。基于前面介紹的設備描述中各個成員的值,可以完成該宏的定義,詳見程序清單12.10。

程序清單12.10 I2C1設備描述宏定義

對于PCF85063設備,其對應的宏為

AWBL_HWCONF_PCF8563_0,基于前面介紹的設備描述中各個成員的值,可以完成該宏的定義,詳見程序清單12.11。

程序清單12.11 PCF85063設備描述宏定義

通常情況下,為了保持

awbus_lite_hwconf_usrcfg.c文件的簡潔,將設備描述宏的定義(包括設備、設備信息的定義)單獨存放到一個頭文件中,I2C1設備描述宏定義相關的信息存放在awbl_hwconf_imx28_i2c1.h文件中,PCF85063設備描述宏定義相關的信息存放在awbl_hwconf_pcf85063_0.h文件中。

這些文件已經(jīng)在模板工程中提供,在硬件設備列表中,只需加入該宏即可,詳見程序清單12.1。通過設備的描述可知,I2C1設備掛在PLB總線上,PCF85063設備掛在I2C1總線上,設備描述與拓撲結(jié)構(gòu)的關系詳見圖12.4。

圖12.4 I2C1和PCF85063設備描述與拓撲結(jié)構(gòu)的對應關系

12.3.4 設備的配置與裁剪

設備配置主要是基于工程模板中提供的配置文件,進行設備描述或設備信息的修改。用戶若需修改硬件設備的配置,只需找到該硬件設備相應的頭文件,修改其中的相關信息即可。

例如,需要修改PCF85063的rtc_id為1,僅需將程序清單12.9中的第3行修改為1。若需調(diào)整設備在總線拓撲結(jié)構(gòu)中的位置。一般來講,一個設備的父總線類型是確定的,不會修改。如PCF85063,其父總線類型必定為:

AWBL_BUSID_I2C。調(diào)整設備在總線拓撲結(jié)構(gòu)中的位置往往是修改父總線的編號,如要將PCF85063掛在I2C0上,僅需將程序清單12.11中,第6行對應的父總線編號修改為I2C0對應的總線總線編號,即:IMX28_I2C0_BUSID。

除簡單的配置外,另外一種特殊的操作是裁剪,例如,用戶不需要使用PCF85063,則可以在硬件列表中刪除該設備的描述宏:

AWBL_HWCONF_PCF85063_0。為了便于用戶裁剪,避免直接操作g_awbl_devhcf_list[]數(shù)組,在awbl_hwconf_pcf85063_0.h文件中,使用了另外一個使能宏來控制

AWBL_HWCONF_PCF85063_0宏的定義,詳見程序清單12.12。

程序清單12.12 增加PCF85063設備使能宏(awbl_hwconf_pcf85063_0.h)

程序中,增加了一個使能宏:

AW_DEV_EXTEND_PCF85063_0。若該宏被有效定義,則AWBL_HWCONF_PCF85063_0宏的定義為完整的設備描述,此時,PCF85063設備正常的加入到設備列表中;反之,若使能宏未被定義,則AWBL_HWCONF_PCF85063_0宏將是一個空的宏定義,同時,相關的設備實例,設備信息也不會被定義。此時,在設備列表中,將不存在PCF85063設備的描述,相當于裁剪掉了該設備。同理可以新增一個I2C1設備的使能宏,以便對I2C1設備進行裁剪,詳見程序清單12.13。

程序清單12.13 增加I2C1設備使能宏(awbl_hwconf_imx28_i2c1.h)

程序中,新增了AW_DEV_IMX28_I2C_1宏對I2C1設備是否使能進行控制。為便于查找,在AWorks中,類似的設備相關的使能宏均在模板工程下的aw_prj_params.h文件中進行統(tǒng)一的定義,詳見程序清單12.14。

程序清單12.14 設備使能宏定義(aw_prj_params.h)

若其中的某一個宏被用戶注釋掉了,則對應的設備就會被裁剪。通過查看aw_prj_params.h文件,用戶可以了解哪些設備被使能了,哪些設備被禁能了,并根據(jù)需要,靈活的調(diào)整。例如,不再使用PCF85063,則可以注釋掉該宏,詳見程序清單12.15。

程序清單12.15 設備裁剪范例(aw_prj_params.h)

值得注意的是,部分特殊的片上外設,例如,GPIO、中斷控制器等,系統(tǒng)必須使用,不能被裁剪,此時,將不會在相應的配置文件中增加額外的使能宏。

12.3.5 注冊設備驅(qū)動

在描述一個設備時,通過設備名指定了該設備對應的驅(qū)動,要使設備正常工作,系統(tǒng)中必須存在設備對應的驅(qū)動。AWorks作為一個完備的軟件平臺,已經(jīng)支持眾多的芯片和外圍器件,提供了許許多多的設備驅(qū)動,隨著AWorks的進一步發(fā)展,提供的驅(qū)動還會越來越多。

顯然,為了節(jié)省系統(tǒng)資源,并不能將所有驅(qū)動都加載到系統(tǒng)中,而應該只將使用到的驅(qū)動加載到系統(tǒng)中,驅(qū)動的加載在aw_prj_config.c文件中的awbl_group_init()函數(shù)中完成,該函數(shù)在系統(tǒng)啟動時被自動調(diào)用。

每個驅(qū)動都提供了一個驅(qū)動注冊函數(shù),要使用該驅(qū)動,則應在awbl_group_init()函數(shù)中調(diào)用驅(qū)動提供的注冊函數(shù)。例如,對于PCF85063設備驅(qū)動,其提供的驅(qū)動注冊函數(shù)在驅(qū)動頭文件awbl_pcf85063.h文件中聲明,即:

如需使用PCF85063,則應將該驅(qū)動加載到系統(tǒng)中,即:

一般來講,新增的驅(qū)動都添加到函數(shù)尾部。同理,為了便于裁剪,不直接修改aw_prj_config.c文件,往往使用一個宏對是否注冊相應驅(qū)動進行控制,只有當宏使能時,才進行相應的驅(qū)動注冊,詳見程序清單12.16。

程序清單12.16 通過宏控制驅(qū)動是否注冊的原理

程序中,若定義了

AW_DRV_EXTEND_PCF85063_0宏,則會調(diào)用驅(qū)動注冊函數(shù)將驅(qū)動注冊到系統(tǒng)之中;否則,驅(qū)動將不會被注冊,相應的驅(qū)動代碼就得到了裁剪。

為便于管理,在AWorks中,類似的驅(qū)動相關的使能宏均在模板工程下的aw_prj_params.h文件中進行統(tǒng)一的定義,例如:

實際中,只要使用PCF85063設備,就必須將PCF85063的設備驅(qū)動注冊到系統(tǒng)之中,為了確保這一關系,模板工程中,做了一個簡單的自動定義操作,在設備和設備驅(qū)動的使能宏之間進行了恰當?shù)年P聯(lián),即:

由此可見,只要PCF85063設備被使能,AW_DRV_AWBL_EXTEND_PCF85063_0宏將被自動定義,使相應的驅(qū)動也隨之注冊到系統(tǒng)之中。

這里僅僅只是簡單的展示了設備驅(qū)動加載的原理,幫助用戶更深入的理解AWBus-lite。實際中,模板工程已經(jīng)對此進行了恰當?shù)奶幚?,當一個設備被使能后,其相應的驅(qū)動會被一并使能,用戶只需要控制設備的使能/禁能即可。

12.3.6 硬件設備的父總線設備

對于PCF85063,其父總線類型為:

AWBL_BUSID_I2C,即PCF85063掛在某一I2C總線上,顯然I2C總線需要由I2C總線控制器設備產(chǎn)生,比如在i.MX28x中,片上外設I2C0和I2C1均可以產(chǎn)生I2C總線。

這也就意味著,要使用PCF85063設備,除使能PCF85063設備本身外,還必須使能其父總線對應的設備。如在i.MX28x中,I2C0和I2C1設備對應的使能宏在aw_prj_params.h文件中定義為:

基于此,若PCF85063掛在I2C0上,則必須使能AW_DEV_IMX28_I2C_0宏。若掛在I2C1上,則必須使能AW_DEV_IMX28_I2C_1宏。

在i.MX28x中,I2C設備又掛在PLB總線上,PLB總線作為CPU本地總線,不需要額外使能,始終有效。特別地,若父總線設備又掛在另外一條總線上,而不是PLB總線上,則相應的父總線設備對應的控制器同樣需要使能,以此類推,確保所有父總線設備均被使能。

例如,在圖12.1(b)所示的結(jié)構(gòu)圖中,若需要使用SC16IS752設備,則必須使能SC16IS752設備的父總線設備:SC18IS602B設備,同時,還需使能SC18IS602B設備的父總線設備:I2C0設備。

12.4 訪問設備

若系統(tǒng)硬件資源定義正確,并且所需的驅(qū)動也注冊到了系統(tǒng)中,則可以通過AWorks定義的通用接口訪問這些硬件設備。

12.4.1 通用接口

AWorks 為每一類設備都定義了一套精簡強大的通用接口,不同的平臺、不同的硬件,只要是通用接口支持的類型,都可以使用通用接口進行訪問。例如,使用RTC通用接口訪問RTC設備,使用GPIO通用接口訪問GPIO設備,使用LED通用接口訪問LED。

無論硬件設備掛在何種總線上,處在AWbus-lite拓撲結(jié)構(gòu)中的何種位置,對同一類硬件設備,均可使用相同的接口對它們進行訪問。例如,在一個基于i.MX28x的系統(tǒng)中,使用了兩個RTC設備:i.MX28x 片上RTC外設,外圍器件PCF85063。它們的編號分別為0、1,使用通用接口對它們進行訪問的示意圖詳見圖12.5。

圖12.5 使用RTC通用接口訪問RTC設備

由此可見,盡管它們處于不同的總線上,但卻可以使用相同的接口進行操作。對應用程序來說,硬件設備的具體位置并不會對應用程序產(chǎn)生任何影響。這就將硬件底層和應用層進行了很好的隔離,后續(xù)即使將PCF85063更換為其它RTC器件(例如,RX8025T、DS1302等),應用程序也不需要做任何改動。

再以串口為例,查看一種更加復雜的拓撲結(jié)構(gòu),示意圖詳見圖12.6。

圖12.6 使用RTC通用接口訪問RTC設備

在圖12.6中,SC16IS752是一種SPI轉(zhuǎn)兩路UART芯片。這里僅作為訪問UART設備的一種示例,以便于用戶理解,用戶無需深入了解這款芯片,僅需知道SC16IS752是一種SPI轉(zhuǎn)串口芯片即可。

在圖12.6中,總共有5個串口:MCU片內(nèi)有1個串口,兩片SC16IS752外擴了4個串口,它們的串口號分別為COM0、COM1、COM2、COM3和COM4。在實際硬件連接中,訪問SC16IS752芯片需要經(jīng)過PLB總線、I2C總線和SPI總線,進而使用其中的UART功能,但對于用戶來講,同樣只需要簡單的調(diào)用串行通用接口即可使用SC16IS752芯片提供的串口功能,和使用片內(nèi)的UART外設并無區(qū)別。

再如,每個MCU都具有一定數(shù)量的GPIO,但是,當GPIO不夠用時,可能需要通過外圍器件對GPIO進行擴展,示意圖詳見圖12.7。

圖12.7 使用GPIO通用接口訪問GPIO設備

在圖12.7中,總共有兩個GPIO設備:

  • MCU片內(nèi)GPIO,引腳編號范圍:

    PIO0_0~PIO6_24;

  • 外擴芯片CAT9555,引腳編號范圍:

    EXPIO0_0~EXPIO0_7、

    EXPIO1_0~EXPIO1_7。

它們同樣可以使用相同的接口進行訪問。

12.4.2 資源ID

在前面的例子中,一個系統(tǒng)中可能存在多個同類設備,它們之間使用“資源ID”進行區(qū)分,通用接口則使用“資源ID”指定要訪問的設備。

通常情況下,“資源ID”為int類型的整數(shù),并從0開始順序編號。為了便于管理以及增強程序的可讀性,通常將這些資源ID定義為宏,通過宏名體現(xiàn)其真實的含義。例如,在i.MX28x的I2C0配置文件awbl_hwconf_imx28_i2c0.h中,定義了I2C0設備的設備信息,詳見程序清單12.17。

程序清單12.17 I2C0設備信息配置(awbl_hwconf_imx28_i2c0.h)

在設備信息中,IMX28_I2C0_BUSID即為I2C0總線的ID宏,默認情況下,該宏在aw_prj_param.h文件中定義為0,詳見程序清單12.18。

程序清單12.18 I2C0設備對應的資源ID宏定義(aw_prj_param.h)

后續(xù)要修改I2C0的ID,僅需修改該宏的值即可。

需要注意的是,“資源ID”的類型并不局限于int類型,只要用于區(qū)分同種類型下的多個設備,都可以視為一種“資源ID”,可以是指針類型,字符串類型等等。

在同一個系統(tǒng)中,某類設備的資源ID必須統(tǒng)一分配,某一資源ID不能被重復分配至多個設備,確保每個設備資源ID的唯一性。例如,在i.MX28x的GPIO配置文件awbl_hwconf_imx28_gpio.h中,定義了GPIO設備信息,詳見程序清單12.19。

程序清單12.19 GPIO設備信息配置(awbl_hwconf_imx28_gpio.h)

其中,PIO0_0 ~ PIO6_24為GPIO資源ID宏,它們的定義詳見程序清單12.20。

程序清單12.20 GPIO設備資源ID宏定義(imx28x_pin.h)

由此可見,PIO0_0的值為0,PIO6_24的值為216,因此,i.MX28x的片上GPIO占用的資源ID范圍為:0 ~ 216。此時,若使用擴展芯片(比如:CAT9555)對GPIO進行了擴展,則為擴展芯片分配的資源ID范圍就必須大于216(不含),以避免范圍重疊。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    16667

    瀏覽量

    347774
  • 總線
    +關注

    關注

    10

    文章

    2817

    瀏覽量

    87705
  • AWorks
    +關注

    關注

    1

    文章

    16

    瀏覽量

    5662

原文標題:AWorks軟件篇 — AWBus-lite 總線框架

文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠電子】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    LDO芯片的拓撲結(jié)構(gòu)

    LDO(Low Dropout Regulator)芯片,即低壓差線性穩(wěn)壓器芯片,是一種用于電源穩(wěn)壓的集成電路芯片。其拓撲結(jié)構(gòu)是理解其工作原理和性能特點的基礎。
    的頭像 發(fā)表于 09-11 09:51 ?160次閱讀

    三電平dcdc拓撲結(jié)構(gòu)有幾種

    三電平DC-DC拓撲結(jié)構(gòu)是一種高效的電力轉(zhuǎn)換技術(shù),廣泛應用于電力電子領域。 三電平DC-DC拓撲結(jié)構(gòu)的基本原理 三電平DC-DC拓撲
    的頭像 發(fā)表于 07-12 09:45 ?651次閱讀

    開關電源幾種拓撲結(jié)構(gòu)介紹

    結(jié)構(gòu)有以下幾種: 降壓型(Buck)拓撲結(jié)構(gòu) 降壓型拓撲結(jié)構(gòu)的主要功能是將輸入電壓降至一個較低的電壓水平,使得輸出電壓低于輸入電壓。 在所有
    的頭像 發(fā)表于 06-09 16:47 ?763次閱讀
    開關電源幾種<b class='flag-5'>拓撲</b><b class='flag-5'>結(jié)構(gòu)</b>介紹

    儲能變流器拓撲結(jié)構(gòu)有哪些種類

    儲能變流器(PCS)的拓撲結(jié)構(gòu)是其設計和性能的核心部分,它決定了變流器的效率、可靠性和成本。
    的頭像 發(fā)表于 04-22 14:52 ?1587次閱讀

    什么是Mesh?Mesh組網(wǎng)拓撲結(jié)構(gòu)淺析

    什么是Mesh?Mesh組網(wǎng)拓撲結(jié)構(gòu)淺析? Mesh(網(wǎng)狀結(jié)構(gòu))是一種網(wǎng)絡拓撲結(jié)構(gòu),它由多個節(jié)點相互連接而成,每個節(jié)點都可以直接與其他節(jié)點通
    的頭像 發(fā)表于 02-04 14:07 ?1901次閱讀

    網(wǎng)絡拓撲結(jié)構(gòu)有哪幾種類型 網(wǎng)絡拓撲結(jié)構(gòu)的優(yōu)缺點

    網(wǎng)絡拓撲結(jié)構(gòu)是指計算機網(wǎng)絡中節(jié)點與連接線之間的總體布局形式。根據(jù)節(jié)點與連接線的布局形式,網(wǎng)絡拓撲結(jié)構(gòu)可以分為以下幾種類型: 星型拓撲:星型
    的頭像 發(fā)表于 02-04 10:22 ?1381次閱讀

    網(wǎng)絡拓撲結(jié)構(gòu)的隱患和網(wǎng)絡硬件的安全缺陷屬于

    網(wǎng)絡拓撲結(jié)構(gòu)的隱患和網(wǎng)絡硬件的安全缺陷是當前網(wǎng)絡安全領域中的重要問題。隨著互聯(lián)網(wǎng)的不斷發(fā)展和普及,網(wǎng)絡拓撲結(jié)構(gòu)和網(wǎng)絡硬件的安全問題日益凸顯。本文將詳細分析網(wǎng)絡
    的頭像 發(fā)表于 01-31 14:54 ?1178次閱讀

    什么是計算機網(wǎng)絡的拓撲結(jié)構(gòu)?主要的拓撲結(jié)構(gòu)有哪些?

    計算機網(wǎng)絡的拓撲結(jié)構(gòu)是指計算機網(wǎng)絡中各個節(jié)點(包括計算機、服務器、路由器等)之間連接的方式和形式。拓撲結(jié)構(gòu)可以影響到網(wǎng)絡的性能、可靠性和擴展性。在計算機網(wǎng)絡中,常見的
    的頭像 發(fā)表于 01-31 10:40 ?1332次閱讀

    網(wǎng)絡拓撲結(jié)構(gòu)有哪幾種類型 網(wǎng)絡拓撲結(jié)構(gòu)優(yōu)缺點

    網(wǎng)絡拓撲結(jié)構(gòu)是指網(wǎng)絡中各個節(jié)點(計算機、路由器等)之間的連接方式。根據(jù)節(jié)點之間的連接方式不同,網(wǎng)絡拓撲結(jié)構(gòu)可以分為以下幾種類型: 星型拓撲
    的頭像 發(fā)表于 01-30 10:04 ?1049次閱讀

    網(wǎng)絡拓撲結(jié)構(gòu)有幾種?各有什么優(yōu)缺點?

    網(wǎng)絡拓撲結(jié)構(gòu)是指在計算機網(wǎng)絡中,節(jié)點和連接線之間的物理布局方式,它決定了數(shù)據(jù)在網(wǎng)絡中的流動方式。現(xiàn)代計算機網(wǎng)絡主要有以下幾種常見的拓撲結(jié)構(gòu),分別是總線型、星型、環(huán)型、樹型和網(wǎng)狀型。每種
    的頭像 發(fā)表于 01-17 11:14 ?1659次閱讀

    如何快速掌握11種開關電源拓撲結(jié)構(gòu)?看這篇就夠了!

    本文主要講述常見的開關電源拓撲結(jié)構(gòu)特點和優(yōu)缺點對比。 常見的拓撲結(jié)構(gòu),包括Buck降壓、Boost升壓、Buck-Boost降壓-升壓、Flyback反激、Forward正激
    的頭像 發(fā)表于 01-05 05:24 ?2306次閱讀
    如何快速掌握11種開關電源<b class='flag-5'>拓撲</b><b class='flag-5'>結(jié)構(gòu)</b>?看這篇就夠了!

    DDR拓撲結(jié)構(gòu)的詳細解析

    在進行多片DDR設計的時候,通常DDR會存在拓撲結(jié)構(gòu), 下面我們將詳細介紹一下各種拓撲結(jié)構(gòu)的區(qū)別以以及應用場景。 首先我們先介紹一下,當只存在一片DDR的時候通常是采用點對點的連接方式
    的頭像 發(fā)表于 12-26 07:45 ?904次閱讀
    DDR<b class='flag-5'>拓撲</b><b class='flag-5'>結(jié)構(gòu)</b>的詳細解析

    開關式電源轉(zhuǎn)換中最常見的電路拓撲結(jié)構(gòu)

    電源拓撲結(jié)構(gòu)
    發(fā)表于 12-04 09:48 ?5次下載

    電路拓撲結(jié)構(gòu)方案介紹

    電子發(fā)燒友網(wǎng)站提供《電路拓撲結(jié)構(gòu)方案介紹.doc》資料免費下載
    發(fā)表于 11-14 11:27 ?1次下載
    電路<b class='flag-5'>拓撲</b><b class='flag-5'>結(jié)構(gòu)</b>方案介紹

    LED電源常用拓撲結(jié)構(gòu)介紹

    電子發(fā)燒友網(wǎng)站提供《LED電源常用拓撲結(jié)構(gòu)介紹.doc》資料免費下載
    發(fā)表于 11-14 10:05 ?0次下載
    LED電源常用<b class='flag-5'>拓撲</b><b class='flag-5'>結(jié)構(gòu)</b>介紹