在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

AWorks如何編寫開發(fā)設(shè)備驅(qū)動(dòng)程序

UtFs_Zlgmcu7890 ? 來源:未知 ? 作者:佚名 ? 2018-06-20 09:58 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文導(dǎo)讀

本文詳細(xì)介紹了AWorks中開發(fā)設(shè)備驅(qū)動(dòng)的一般方法。基于這些通用的方法,用戶可以嘗試獨(dú)立開發(fā)一些設(shè)備的驅(qū)動(dòng),以進(jìn)一步加深對AWbus-lite的理解。同時(shí),當(dāng)后續(xù)遇到一些AWorks 暫不支持的設(shè)備時(shí),也可以自行開發(fā)設(shè)備相應(yīng)的驅(qū)動(dòng)。

本文為《面向AWorks框架和接口編程(上)》第三部分硬件篇——第13章——第4小節(jié):驅(qū)動(dòng)開發(fā)的一般方法。

13.4 驅(qū)動(dòng)開發(fā)的一般方法

上面以LED為例,從接口定義到驅(qū)動(dòng)開發(fā)都進(jìn)行了詳細(xì)的介紹,對AWbus-lite中相關(guān)的概念有了更加深入的理解。完整的設(shè)備相關(guān)程序主要分為三個(gè)部分:

  • 通用接口

位于最上層,與具體硬件無關(guān),由應(yīng)用程序直接訪問,構(gòu)成可以跨平臺(tái)復(fù)用的應(yīng)用程序。雖然通用接口看似簡單,但要完成其完善的定義并不容易,往往需要經(jīng)過大量項(xiàng)目的積累,從接口功能和設(shè)計(jì)原則等多個(gè)方面考慮,才能定義出既簡潔又實(shí)用的通用接口,一般來講,通用接口無需用戶定義,由廣州致遠(yuǎn)電子有限公司統(tǒng)一定義和維護(hù)。

  • 接口實(shí)現(xiàn)

位于中間層,完成如抽象方法、LED服務(wù)、METHOD類型等的定義。中間層同樣與具體硬件無關(guān),主要使用抽象方法的形式實(shí)現(xiàn)上層定義的通用接口。該層往往在定義通用接口時(shí)由廣州致遠(yuǎn)電子有限公司實(shí)現(xiàn)。對于驅(qū)動(dòng)開發(fā)者,僅需了解這里定義的各個(gè)抽象方法,以便在開發(fā)具體驅(qū)動(dòng)時(shí),根據(jù)具體硬件實(shí)現(xiàn)各個(gè)抽象方法。

  • 具體驅(qū)動(dòng)實(shí)現(xiàn)

位于最底層,根據(jù)具體硬件完成抽象方法的實(shí)現(xiàn),定義Method對象列表,提供相應(yīng)的服務(wù)。隨著AWorks的不斷發(fā)展和完善,迄今為止已經(jīng)積累了大量的設(shè)備驅(qū)動(dòng),常見設(shè)備均已支持。由于實(shí)際硬件的千差萬別,用戶可能遇到AWorks暫不支持的設(shè)備(暫無對應(yīng)驅(qū)動(dòng)),此時(shí),用戶可以自行開發(fā)設(shè)備驅(qū)動(dòng)。

LED驅(qū)動(dòng)開發(fā)的介紹中,由于很多概念初次遇到,因而花費(fèi)了較多篇幅介紹這些基本概念,略顯繁瑣。實(shí)質(zhì)上,驅(qū)動(dòng)開發(fā)的核心就是完成一個(gè)驅(qū)動(dòng)信息結(jié)構(gòu)體常量的定義,比如LED驅(qū)動(dòng)開發(fā)的結(jié)果,就是完成了結(jié)構(gòu)體常量__g_drvinfo_led_gpio的定義(詳見程序清單13.48)。下面,針對驅(qū)動(dòng)開發(fā)進(jìn)行簡要的梳理,歸納出驅(qū)動(dòng)開發(fā)的一般步驟。

1、定義驅(qū)動(dòng)名;

2、 確定總線類型和設(shè)備類型;

3、 定義實(shí)際設(shè)備類型;

4、 定義設(shè)備信息類型;

5、 實(shí)現(xiàn)三個(gè)階段的初始化函數(shù);

6、 實(shí)現(xiàn)設(shè)備要提供的服務(wù),比如LED服務(wù);

7、 定義Method對象,以便上層獲取設(shè)備提供的服務(wù);

8、 定義驅(qū)動(dòng)結(jié)構(gòu)體常量,實(shí)現(xiàn)驅(qū)動(dòng)注冊函數(shù)。

在上一章中,直接使用了PCF85063驅(qū)動(dòng)定義的驅(qū)動(dòng)名、設(shè)備類型、設(shè)備信息類型等,完成了PCF85063硬件資源的定義(詳見程序清單12.12)。下面,將按照驅(qū)動(dòng)開發(fā)的一般步驟,嘗試基于AWorks中現(xiàn)有的RTC架構(gòu),開發(fā)PCF85063實(shí)時(shí)時(shí)鐘芯片的驅(qū)動(dòng)。深入理解PCF85063驅(qū)動(dòng)的具體由來。

PCF85063是NXP半導(dǎo)體公司推出的一款低功耗實(shí)時(shí)時(shí)鐘/日歷芯片,它提供了實(shí)時(shí)時(shí)間的設(shè)置與獲取、鬧鐘、可編程時(shí)鐘輸出、定時(shí)器/報(bào)警/半分鐘/分鐘中斷輸出等功能。引腳封裝詳見圖13.3,其中,SCL和SDA為I2C接口引腳,VDD和VSS分別為電源和地;OSCI和OSCO為32.768KHz的晶振連接引腳,作為PCF85063的時(shí)鐘源;CLKOUT為時(shí)鐘信號(hào)輸出,供其它外部電路使用;INT為中斷引腳,主要用于鬧鐘等功能。

圖13.3 PCF85063引腳定義

13.4.1 定義驅(qū)動(dòng)名

作為PCF85063的驅(qū)動(dòng),可以直接將驅(qū)動(dòng)名定義為:"pcf85063",即:

基于此,基礎(chǔ)驅(qū)動(dòng)信息中p_drvname的值為:AWBL_PCF85063_NAME。

13.4.2 確定總線類型和設(shè)備類型

確定驅(qū)動(dòng)所處的總線類型,對PCF85063作簡要了解可知,該芯片通過I2C總線訪問,芯片所處總線的類型即為:AWBL_BUSID_I2C。總線類型是一個(gè)非常重要的信息,驅(qū)動(dòng)結(jié)構(gòu)體常量、設(shè)備類型的定義均與總線類型相關(guān)。

確定驅(qū)動(dòng)對應(yīng)設(shè)備的類型,是普通設(shè)備還是特殊的總線控制器設(shè)備。對于PCF85063設(shè)備,其不能再繼續(xù)擴(kuò)展下游總線,僅能提供RTC功能,是普通設(shè)備,即對應(yīng)的設(shè)備類型為:AWBL_DEVID_DEVICE。

基于此,基礎(chǔ)驅(qū)動(dòng)信息中bus_id的值為:AWBL_BUSID_I2C | AWBL_DEVID_DEVICE(或省略AWBL_DEVID_DEVICE,直接設(shè)置為AWBL_BUSID_I2C)。

13.4.3 定義設(shè)備類型

實(shí)際設(shè)備類型從基礎(chǔ)設(shè)備類型派生而來,以添加設(shè)備相關(guān)的私有成員。在AWBus-lite中,I2C總線上的設(shè)備基礎(chǔ)類型定義為:struct awbl_i2c_device。其定義詳見程序清單13.53。

程序清單13.53 struct awbl_i2c_device類型定義

由此可見,struct awbl_i2c_device類型是從AWBus-lite基礎(chǔ)設(shè)備類型派生而來的,當(dāng)前并未添加任何其它成員,主要是為了方便后續(xù)擴(kuò)展,增加I2C總線從機(jī)設(shè)備相關(guān)的私有成員。

基于此,PCF85063設(shè)備類型的定義形式詳見程序清單13.54。

程序清單13.54 PCF85063設(shè)備類型定義(1)

雖然PCF85063并未直接從AWBus-lite基礎(chǔ)設(shè)備類派生,但本質(zhì)上,其還是屬于AWBus-lite基礎(chǔ)設(shè)備類型的派生類。對應(yīng)類圖詳見圖13.4。

圖13.4 PCF85063設(shè)備類關(guān)系

顯然,要完成PCF85063設(shè)備類型的定義,重點(diǎn)是考慮需要增加哪些其它成員。PCF85063設(shè)備的核心功能是為系統(tǒng)提供RTC服務(wù),在AWBus-lite中,定義了RTC服務(wù)結(jié)構(gòu)體類型struct awbl_rtc_service,其具體定義詳見程序清單13.55。

程序清單13.55 RTC服務(wù)類型定義(awbl_rtc.h)

其中,p_next用于指向下一個(gè)RTC服務(wù),使系統(tǒng)可以以鏈表的形式組織多個(gè)RTC服務(wù)。p_servinfo為RTC服務(wù)相關(guān)的信息,提供RTC服務(wù)時(shí),必須指定RTC服務(wù)的信息,其類型struct awbl_rtc_servinfo的定義詳見程序清單13.56。

程序清單13.56 RTC服務(wù)信息定義(awbl_rtc.h)

由此可見,RTC服務(wù)信息中僅包含ID號(hào)信息。每個(gè)RTC服務(wù)都具有一個(gè)唯一ID,當(dāng)用戶使用通用接口訪問RTC服務(wù)時(shí),需要傳入一個(gè)ID號(hào),用于指定需要使用的RTC服務(wù)。系統(tǒng)將傳入的ID號(hào)與各個(gè)RTC服務(wù)對應(yīng)的ID號(hào)一一比對,進(jìn)而查找到指定的RTC服務(wù)。

p_servfuncs指向一個(gè)虛函數(shù)表,其類型struct awbl_rtc_servopts包含了RTC服務(wù)定義的抽象方法,詳見程序清單13.57。

程序清單13.57 RTC抽象方法的定義(awbl_rtc.h)

顯然,要使PCF85063能夠提供RTC服務(wù),驅(qū)動(dòng)就必須實(shí)現(xiàn)這里定義的抽象方法,抽象方法的具體實(shí)現(xiàn)將在提供RTC服務(wù)小節(jié)中詳細(xì)介紹。

p_cookie由驅(qū)動(dòng)設(shè)置,系統(tǒng)在調(diào)用抽象方法時(shí),將原封不動(dòng)將其的作為抽象方法的第一個(gè)參數(shù),傳遞給驅(qū)動(dòng)使用。

PCF85063可以提供RTC服務(wù),在設(shè)備類型中,應(yīng)該包含一個(gè)RTC服務(wù)結(jié)構(gòu)體成員,實(shí)現(xiàn)RTC服務(wù)實(shí)質(zhì)上就是完成RTC服務(wù)中各個(gè)成員的賦值,系統(tǒng)上層獲取RTC服務(wù)就是獲取指向RTC服務(wù)結(jié)構(gòu)體變量的指針。基于此,可以更新PCF85063設(shè)備類型的定義,詳見程序清單13.58。

程序清單13.58 PCF85063設(shè)備類型定義(2)

當(dāng)前僅僅從PCF85063的主要功能出發(fā),完成了PCF85063設(shè)備類型的定義,若在開發(fā)過程中,發(fā)現(xiàn)需要在設(shè)備類型中增加新的成員,可以隨時(shí)動(dòng)態(tài)添加。

13.4.4定義設(shè)備信息類型

PCF85063可以提供RTC服務(wù),提供RTC服務(wù)時(shí),需要一并設(shè)置相應(yīng)的RTC服務(wù)信息(為p_servinfo成員賦值),以供系統(tǒng)使用。當(dāng)前的RTC服務(wù)信息僅包含一個(gè)ID號(hào)(詳見程序清單13.56),ID號(hào)是一種唯一標(biāo)識(shí),不同設(shè)備提供的RTC服務(wù)對應(yīng)的ID號(hào)是不同的,具體數(shù)值應(yīng)由用戶分配,為此,用戶在使用PCF85063時(shí),應(yīng)該提供RTC服務(wù)信息,基于此,PCF85063設(shè)備信息類型的定義程序清單13.59。

程序清單13.59 PCF85063設(shè)備信息類型定義(1)

此外,PCF85063是一種I2C從機(jī)器件,I2C從機(jī)器件具有一個(gè)從機(jī)地址,該地址可以由用戶指定。為此,設(shè)備信息可以新增一個(gè)addr地址信息。完整的定義詳見程序清單13.60。

程序清單13.60 PCF85063設(shè)備信息類型定義(2)

13.4.5 實(shí)現(xiàn)三個(gè)階段的初始化函數(shù)

實(shí)現(xiàn)三個(gè)階段的初始化函數(shù),以便為基礎(chǔ)驅(qū)動(dòng)信息中的驅(qū)動(dòng)入口點(diǎn)p_busfuncs(詳見程序清單13.19)賦值。在具體實(shí)現(xiàn)前,可以先搭建好軟件結(jié)構(gòu),詳見程序清單13.61。

程序清單13.61 三個(gè)階段初始化函數(shù)的結(jié)構(gòu)性代碼

其中,__g_pcf85063_drvfuncs的地址即可作為驅(qū)動(dòng)入口點(diǎn)p_busfuncs的值。

在實(shí)現(xiàn)各個(gè)初始化函數(shù)前,需要梳理出具體要執(zhí)行哪些初始化操作。對于PCF85063,本驅(qū)動(dòng)僅使用其提供的通用實(shí)時(shí)時(shí)鐘功能,即獲取或設(shè)置當(dāng)前時(shí)間(年、月、日、時(shí)、分、秒等時(shí)間信息),鬧鐘、中斷、時(shí)鐘輸出等功能均不使用。PCF85063在上電后,其時(shí)間即會(huì)正常運(yùn)行,鬧鐘等功能處于關(guān)閉狀態(tài),由此可見,時(shí)鐘方面,并不需要作任何特殊的操作。

特別地,PCF85063可以通過CLKOUT引腳輸出時(shí)鐘信號(hào),信號(hào)的頻率可以通過控制和狀態(tài)寄存器2(control and status register2,寄存器地址為0x01)的低三位(bit2 ~ bit0)進(jìn)行設(shè)定,詳見表13.8。這些信息更加詳細(xì)的說明可以通過PCF85063的數(shù)據(jù)手冊獲得。

表13.8 CLKOUT控制值與輸出頻率的關(guān)系

控制值的默認(rèn)值為000,即輸出頻率為32768。由于本驅(qū)動(dòng)并未使用CLKOUT功能,因此,應(yīng)該將其輸出關(guān)閉,避免其對外部電路產(chǎn)生影響,這就需要將控制值修改為111。

PCF85063需要通過I2C總線對其中的寄存器值進(jìn)行訪問。在AWBus-lite中,提供了I2C讀寫函數(shù),用于對I2C從機(jī)設(shè)備進(jìn)行讀寫,接口原型詳見表13.9。

表13.9 I2C標(biāo)準(zhǔn)接口函數(shù)

在外設(shè)通用接口的介紹中,講解了I2C通用接口(詳見表7.14,接口命名前綴為“aw_”),對比可以發(fā)現(xiàn),它們的形式非常類似,不同之處的僅有兩點(diǎn)。

  • 操作的對象類型不同

在這里,以“awbl_”為前綴的讀寫接口操作的對象(第一個(gè)參數(shù))是AWBus-lite中的I2C從機(jī)設(shè)備,類型為struct awbl_i2c_device,該類型的從機(jī)設(shè)備掛載在AWBus-lite中,基于AWBus-lite拓?fù)浣Y(jié)構(gòu),可以知道該從機(jī)設(shè)備掛載的位置,從而獲得其對應(yīng)的I2C總線控制器,進(jìn)而完成讀寫操作。

以“aw_”為前綴的通用I2C讀寫接口操作的對象是用戶使用aw_i2c_mkdev()接口定義的通用I2C從機(jī)設(shè)備,類型為aw_i2c_device_t,這類設(shè)備是應(yīng)用程序直接操作的設(shè)備,并沒有掛載在AWBus-lite中,其對應(yīng)的I2C總線控制器無法通過AWbus-lite的拓?fù)浣Y(jié)構(gòu)獲得,因而,在定義設(shè)備時(shí),必須通過ID號(hào)指定該從機(jī)設(shè)備對應(yīng)的總線ID,系統(tǒng)通過ID找到對應(yīng)的I2C總線控制器,進(jìn)而完成讀寫操作。

顯然,在PCF85063驅(qū)動(dòng)程序中,I2C總線操作的對象是PCF85063。

PCF85063設(shè)備類型是基于struct awbl_i2c_device類型派生而來的,而struct awbl_i2c_device類型是基于AWBus-lite基礎(chǔ)設(shè)備類型派生而來的,因此,在各階段初始化函數(shù)中,若要對PCF85063進(jìn)行讀寫操作,則可以將基礎(chǔ)設(shè)備類型的p_dev指針(其實(shí)際指向的是PCF85063設(shè)備)直接強(qiáng)制轉(zhuǎn)換為struct awbl_i2c_device類型的指針使用。

  • 參數(shù)個(gè)數(shù)不同

在通用I2C讀寫接口中,除p_dev外,僅subaddr、p_buf和nbytes三個(gè)參數(shù),分別表示寄存器子地址、讀/寫數(shù)據(jù)緩存、讀/寫數(shù)據(jù)字節(jié)數(shù)。而這里的讀寫接口多了flags和addr兩個(gè)參數(shù),分別表示從機(jī)設(shè)備屬性和從機(jī)設(shè)備地址,實(shí)際上,通用I2C接口也有這兩個(gè)信息,不過是在使用aw_i2c_mkdev()定義從機(jī)設(shè)備時(shí),存儲(chǔ)在了從機(jī)設(shè)備中,對于通用I2C接口,這兩個(gè)信息在aw_i2c_mkdev()接口中指定。本質(zhì)上,它們表示的含義是完全相同的。

從機(jī)屬性的定義詳見表7.15,主要指定了從機(jī)地址的位數(shù)、是否忽略無應(yīng)答和器件內(nèi)子地址(通常又稱之為“寄存器地址”)的字節(jié)數(shù);從機(jī)地址即I2C設(shè)備的從機(jī)地址。

例如,要將控制和狀態(tài)寄存器2(寄存器地址為0x01)的低3位修改為111,以禁能CLKOUT輸出,范例程序詳見程序清單13.62。

程序清單13.62 禁能CLKOUT輸出的范例程序

程序中,首先將p_dev轉(zhuǎn)換為了PCF85063設(shè)備類型指針,并通過p_dev獲得了設(shè)備信息,以獲取其中的從機(jī)地址信息。然后使用讀取接口讀取出地址0x01的值,若其低三位不為111,則修改為111并重新寫入寄存器中。

該段程序作為PCF85063的初始化程序,應(yīng)該處于哪一階段呢,由于I2C是一種相對低速的通信接口,讀寫數(shù)據(jù)往往比較耗時(shí)(毫秒級(jí)別),因此,建議放在第三階段中。為此,可以完善第三階段初始化函數(shù)的實(shí)現(xiàn),詳見程序清單13.63。

程序清單13.63 第三階段初始化函數(shù)的實(shí)現(xiàn)

程序中,為了程序的簡潔和可讀性,使用宏的形式對p_dev的強(qiáng)制轉(zhuǎn)換、設(shè)備信息的獲取以及寄存器地址常量進(jìn)行了定義。

由于不再需要執(zhí)行其他初始化操作,因此,第一階段和第二階段的初始化函數(shù)可以為空。

13.4.6 實(shí)現(xiàn)通用服務(wù)

PCF85063可以提供RTC服務(wù),在提供RTC服務(wù)前,需要完成設(shè)備中rtc_serv的賦值,其類型為struct awbl_rtc_service,回顧其具體定義,詳見程序清單13.64。

程序清單13.64 RTC服務(wù)類型定義(awbl_rtc.h)

1. p_next成員賦值

p_next用于系統(tǒng)組織多個(gè)RTC服務(wù),對于單個(gè)RTC服務(wù)的提供者,其值設(shè)置為NULL。詳見程序清單13.65。

程序清單13.65 p_next成員的賦值

2. p_servinfo成員賦值

p_servinfo用于指向RTC服務(wù)信息,RTC服務(wù)信息由用戶通過設(shè)備信息提供,基于此,其值直接設(shè)置為指向設(shè)備信息中的rtc_servinfo即可,詳見程序清單13.66。

程序清單13.66 p_servinfo成員的賦值

3. p_servopts成員賦值

p_servopts是實(shí)現(xiàn)RTC服務(wù)的核心,其定義了RTC抽象方法,驅(qū)動(dòng)需要實(shí)現(xiàn)這些抽象方法, struct awbl_rtc_servopts類型的定義詳見程序清單13.57,其中定義了三個(gè)抽象方法:

  • time_get:獲取時(shí)間

  • time_set:設(shè)置時(shí)間

  • dev_ctrl:控制函數(shù),當(dāng)前未使用,保留給后續(xù)擴(kuò)展,設(shè)置為NULL即可在具體實(shí)現(xiàn)前,可以先搭建好軟件結(jié)構(gòu),詳見程序清單13.67。

程序清單13.67 實(shí)現(xiàn)RTC服務(wù)中定義的抽象方法結(jié)構(gòu)性代碼

其中,__g_pcf85063_servopts的地址即可作為RTC服務(wù)中p_servopts的值。接下來,需要具體實(shí)現(xiàn)時(shí)間獲取和時(shí)間設(shè)置函數(shù)。

在PCF85063中,地址0x04 ~ 0x0A的寄存器存儲(chǔ)了時(shí)間信息,詳見表13.10。對這些寄存器的讀寫即可完成時(shí)間信息的獲取和設(shè)置。

表13.10 時(shí)間信息相關(guān)寄存器

注意,在寄存器中,數(shù)值的存儲(chǔ)形式是BCD格式,即數(shù)值的十位和個(gè)位分別使用4位二進(jìn)制數(shù)(一位十六進(jìn)制數(shù))進(jìn)行表示。例如,秒值為23,則十位2使用4位二進(jìn)制表示,即0010,個(gè)位3使用4位二進(jìn)制表示,即0011,最終的結(jié)果即為0010 0011。對于秒值,由于十位的最大值為5,需要使用3位二進(jìn)制表示,因此,秒值占用的實(shí)際有效位為7位(十位占用3位,個(gè)位占用4位)。不同秒值對應(yīng)的寄存器值詳見表13.11。

表13.11 秒值對應(yīng)的寄存器值

分值與秒值的有效范圍相同,占用7位有效位;對于小時(shí)值,PCF85063支持24小時(shí)制(默認(rèn))和12小時(shí)制,但在AWorks平臺(tái)中,細(xì)分時(shí)間統(tǒng)一使用了24小時(shí)制,基于此,PCF85063也僅使用默認(rèn)的24小時(shí)制,此時(shí),小時(shí)值的有效范圍為0 ~ 23,由于十位的最大值為2,需要使用2位二進(jìn)制表示,因此,小時(shí)值占用的實(shí)際有效位為6位(十位占用2位,個(gè)位占用4位);對于日期值,其有效范圍為1 ~ 31,十位最大值為3,需要使用2位二進(jìn)制表示,因此,日期值占用的實(shí)際有效位為6位(十位占用2位,個(gè)位占用4位);對于星期值,其有效范圍為0 ~ 6,僅包含個(gè)位,且最大值為6,只需要使用3位二進(jìn)制數(shù)即可表示,因此,星期值占用的實(shí)際有效位為3位(僅個(gè)位占用3位);對于月份值,其有效范圍為1 ~ 12,十位最大值為1,需要使用1位二進(jìn)制表示,因此,月份值占用的實(shí)際有效位為5位(十位占用1位,個(gè)位占用4位);對于年份值,8位寄存器值全部用于表示年份值,十位和個(gè)位均占用4位,對于BCD碼,使用4位二進(jìn)制表示一位十進(jìn)制數(shù),個(gè)位和十位的最大值均為9,因此,年份值的有效范圍為0 ~ 99。

為便于BCD碼數(shù)據(jù)和實(shí)際數(shù)值之間相互轉(zhuǎn)換,在AWorks中,定義了兩個(gè)宏輔助宏,詳見程序清單13.68。

程序清單13.68 BCD碼轉(zhuǎn)換輔助宏(aw_common.h)

對于獲取時(shí)間,可以讀取出各個(gè)寄存器的值,然后為p_tm細(xì)分時(shí)間結(jié)構(gòu)體中的各個(gè)成員賦值,范例程序詳見程序清單13.69。

程序清單13.69 時(shí)間獲取函數(shù)的實(shí)現(xiàn)范例

程序中,將p_cookie強(qiáng)制轉(zhuǎn)換為指向設(shè)備自身的指針。這是由于在為RTC服務(wù)中的p_cookie成員賦值時(shí),往往將其賦值為指向設(shè)備自身的指針,下一小節(jié)將詳細(xì)介紹。

讀取時(shí)間信息時(shí),直接從秒寄存器開始,連續(xù)讀取了7個(gè)寄存器的值,以便一次性讀取出所有時(shí)間信息。讀取的時(shí)間值為BCD碼,在為細(xì)分時(shí)間賦值前需要將其轉(zhuǎn)換為實(shí)際數(shù)值。特別地,在細(xì)分時(shí)間中,tm_year是從1900年開始計(jì)算的,而PCF85063的年值有效范圍為0 ~ 99,實(shí)際年份的表示范圍則為1900 ~ 1999,滿足不了實(shí)際需求。為了擴(kuò)大表示范圍,當(dāng)tm_year小于70時(shí)(即PCF85063中年值寄存器的值小于70時(shí)),將tm_year的值增加100。如此一來,當(dāng)年值寄存器的值為0 ~ 69時(shí),實(shí)際表示的年值為100 ~ 169,當(dāng)值為70 ~ 99時(shí),表示的年值依舊就是70 ~ 99,使得年值的范圍擴(kuò)大到了70 ~ 169,對應(yīng)的年份范圍即為1970 ~ 2069,1970也是很多操作系統(tǒng)中的時(shí)間起點(diǎn)。

時(shí)間設(shè)置是一個(gè)相反的過程,即將細(xì)分時(shí)間中的值設(shè)置到PCF85063的相應(yīng)寄存器中,范例程序詳見程序清單13.70。

程序清單13.70 時(shí)間設(shè)置函數(shù)的實(shí)現(xiàn)范例

程序中,首先將細(xì)分時(shí)間值依次存儲(chǔ)到data數(shù)組中,然后一次性寫入所有時(shí)間信息。值得注意的是,在細(xì)分時(shí)間中,tm_mon表示月份,其值為實(shí)際月份減一(有效值為0 ~ 11)。而在PCF85063中,月份寄存器中的有效值為1 ~ 12,表示的是實(shí)際月份,因此,在將細(xì)分時(shí)間值寫入PCF85063的寄存器時(shí),需要作加1操作,以將tm_mon轉(zhuǎn)換為實(shí)際月份。特別地,在驅(qū)動(dòng)中,將tm_year的范圍限制在了70 ~ 169,以表示年份1970 ~ 2069。若tm_year的值超過該范圍,則表示是無效時(shí)間。年值寄存器的有效范圍為0 ~ 99,根據(jù)規(guī)則(小于70時(shí)加上100),年值為100 ~ 169時(shí),寄存器的值應(yīng)為0 ~ 69 ;年值為70 ~ 99時(shí),寄存器的值保持不變,同樣為70 ~ 99。年值寄存器的值不能超過100,大于100時(shí),應(yīng)該減去100,程序中,巧妙的將tm_year的值對100取余作為最終年值寄存器的值,完成了這一操作。

4. p_cookie成員賦值

p_cookie用于系統(tǒng)在調(diào)用設(shè)備實(shí)現(xiàn)的抽象方法時(shí),“原封不動(dòng)”的傳遞給各個(gè)抽象方法的p_cookie參數(shù)。這樣一來,傳入抽象方法中的p_cookie與RTC服務(wù)中的p_cookie是完全相同的。通常情況下,p_cookie都起到一個(gè)p_this的作用,用于指向設(shè)備自身,基于此,直接將RTC服務(wù)中p_cookie設(shè)置為p_this,詳見程序清單13.71。

程序清單13.71 p_cookie成員的賦值

正因?yàn)槿绱耍诔绦蚯鍐?3.69和程序清單13.70所示的RTC抽象方法的實(shí)現(xiàn)中,可以直接將p_cookie強(qiáng)制轉(zhuǎn)換為指向設(shè)備自身的指針。

至此,清楚了RTC服務(wù)中各成員應(yīng)該設(shè)置的具體值,可以在系統(tǒng)獲取RTC服務(wù)時(shí),再進(jìn)行相關(guān)成員的賦值。

13.4.7 定義Method對象

已知獲取RTC服務(wù)的Method類型為:awbl_rtcserv_get。為了使PCF85063可以向系統(tǒng)提供RTC服務(wù),需要使用該類型定義Method對象,核心需要實(shí)現(xiàn)一個(gè)用于系統(tǒng)獲取RTC服務(wù)的入口函數(shù),范例程序詳見程序清單13.72。

程序清單13.72 獲取RTC服務(wù)的入口函數(shù)實(shí)現(xiàn)范例

基于此,可以完成一個(gè)Method對象的定義,即:

一個(gè)驅(qū)動(dòng)提供的所有Method對象應(yīng)該存放在一個(gè)列表中,由于PCF85063設(shè)備僅能提供RTC服務(wù),因此,Method對象列表中僅包含一個(gè)用于獲取RTC服務(wù)的Method對象,詳見程序清單13.73。

程序清單13.73 PCF85063設(shè)備驅(qū)動(dòng)Method對象列表定義

其中,__g_pcf85063_dev_methods即可作為基礎(chǔ)驅(qū)動(dòng)信息中p_methods的值。

13.4.8 定義驅(qū)動(dòng)結(jié)構(gòu)體常量,實(shí)現(xiàn)驅(qū)動(dòng)注冊函數(shù)

驅(qū)動(dòng)信息常量的實(shí)際類型與設(shè)備所處的總線類型相關(guān)。PCF85063設(shè)備掛在I2C總線上,I2C總線上的所有設(shè)備驅(qū)動(dòng)對應(yīng)的信息結(jié)構(gòu)體類型為awbl_i2c_drvinfo_t,其是直接從基礎(chǔ)驅(qū)動(dòng)信息類型派生而來的,具體定義詳見程序清單13.74。

程序清單13.74 awbl_i2c_drvinfo_t類型定義(awbl_i2cbus.h)

由此可見,其并未擴(kuò)展任何其它新的成員,和基礎(chǔ)驅(qū)動(dòng)信息是完全一樣的,可以定義用于描述PCF85063驅(qū)動(dòng)的信息常量,詳見程序清單13.75。

程序清單13.75 定義描述PCF85063驅(qū)動(dòng)的信息常量

用戶若需使用該驅(qū)動(dòng),還需要將驅(qū)動(dòng)注冊到系統(tǒng)中,可以提供一個(gè)用于注冊PCF85063驅(qū)動(dòng)的專用函數(shù),其實(shí)現(xiàn)詳見程序清單13.76。

程序清單13.76 注冊PCF85063驅(qū)動(dòng)的專用函數(shù)

為便于查閱,PCF85063完整的驅(qū)動(dòng)文件內(nèi)容詳見程序清單13.77和程序清單13.78。

程序清單13.77 PCF85063驅(qū)動(dòng)頭文件(awbl_pcf85063.h)

程序清單13.78 PCF85063驅(qū)動(dòng)源文件(awbl_pcf85063.c)


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

    關(guān)注

    54

    文章

    8684

    瀏覽量

    149763
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8990

    瀏覽量

    153641
  • 總線
    +關(guān)注

    關(guān)注

    10

    文章

    2959

    瀏覽量

    89683

原文標(biāo)題:AWorks軟件篇 — 深入理解 AWbus-lite(開發(fā)設(shè)備驅(qū)動(dòng))

文章出處:【微信號(hào):Zlgmcu7890,微信公眾號(hào):周立功單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux環(huán)境再升級(jí):PLIN驅(qū)動(dòng)程序正式發(fā)布

    PLIN驅(qū)動(dòng)程序現(xiàn)已正式發(fā)布,本文將展示如何安裝PLIN驅(qū)動(dòng)程序,以及如何在Linux環(huán)境下進(jìn)行基本的PLIN通信操作,確保您能夠快速掌握并應(yīng)用這一新工具。
    的頭像 發(fā)表于 04-21 15:29 ?338次閱讀
    Linux環(huán)境再升級(jí):PLIN<b class='flag-5'>驅(qū)動(dòng)程序</b>正式發(fā)布

    迅為RK3568開發(fā)板helloworld 驅(qū)動(dòng)實(shí)驗(yàn)-驅(qū)動(dòng)編寫

    在學(xué)習(xí) C 語言或者其他語言的時(shí)候,我們通常是打印一句“helloworld”來開啟編程世界的大門。學(xué)習(xí)驅(qū)動(dòng)程序編程亦可以如此,使用 helloworld 作為我們的第一個(gè)驅(qū)動(dòng)程序。接下來開始編寫
    發(fā)表于 04-01 15:20

    AN3761-KSZ DSA驅(qū)動(dòng)程序的使用

    電子發(fā)燒友網(wǎng)站提供《AN3761-KSZ DSA驅(qū)動(dòng)程序的使用.pdf》資料免費(fèi)下載
    發(fā)表于 01-22 16:28 ?0次下載
    AN3761-KSZ DSA<b class='flag-5'>驅(qū)動(dòng)程序</b>的使用

    ub933驅(qū)動(dòng)程序是基于I2c編寫的,請問驅(qū)動(dòng)程序應(yīng)該放在內(nèi)核drivers目錄下的哪個(gè)子目錄里?

    ub933驅(qū)動(dòng)程序是基于I2c編寫的,請問驅(qū)動(dòng)程序應(yīng)該放在內(nèi)核drivers目錄下的哪個(gè)子目錄里,驅(qū)動(dòng)注冊時(shí)應(yīng)該使用什么函數(shù)?
    發(fā)表于 12-13 06:03

    Linux驅(qū)動(dòng)程序程序員指南

    電子發(fā)燒友網(wǎng)站提供《Linux驅(qū)動(dòng)程序程序員指南.pdf》資料免費(fèi)下載
    發(fā)表于 11-22 15:53 ?0次下載
    Linux<b class='flag-5'>驅(qū)動(dòng)程序</b><b class='flag-5'>程序</b>員指南

    pcie設(shè)備驅(qū)動(dòng)程序安裝步驟

    PCIe(Peripheral Component Interconnect Express)是一種高速串行計(jì)算機(jī)擴(kuò)展總線標(biāo)準(zhǔn),用于計(jì)算機(jī)內(nèi)部硬件組件之間的連接。安裝PCIe設(shè)備驅(qū)動(dòng)程序是確保硬件
    的頭像 發(fā)表于 11-13 10:32 ?3267次閱讀

    arduino 6軸同步電機(jī)驅(qū)動(dòng)程序

    arduino 6軸同步電機(jī)驅(qū)動(dòng)程序。含加加減速。
    發(fā)表于 11-09 14:09 ?0次下載

    硬盤電機(jī)怎么驅(qū)動(dòng)程序?它有什么典型特征?

    硬盤電機(jī)的驅(qū)動(dòng)程序是硬盤中一個(gè)非常重要的組成部分,它負(fù)責(zé)控制硬盤電機(jī)的啟動(dòng)、停止、轉(zhuǎn)速調(diào)節(jié)等操作。硬盤電機(jī)驅(qū)動(dòng)程序的設(shè)計(jì)和實(shí)現(xiàn)涉及到電機(jī)控制理論、電子技術(shù)、計(jì)算機(jī)編程等多個(gè)領(lǐng)域的知識(shí)。 一、硬盤電機(jī)
    的頭像 發(fā)表于 10-22 11:10 ?1134次閱讀

    LSP 2.10 DaVinci Linux驅(qū)動(dòng)程序

    電子發(fā)燒友網(wǎng)站提供《LSP 2.10 DaVinci Linux驅(qū)動(dòng)程序.pdf》資料免費(fèi)下載
    發(fā)表于 10-09 09:30 ?0次下載
    LSP 2.10 DaVinci Linux<b class='flag-5'>驅(qū)動(dòng)程序</b>

    Linux設(shè)備驅(qū)動(dòng)程序分類有哪些

    Linux設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)與硬件設(shè)備之間的橋梁,負(fù)責(zé)實(shí)現(xiàn)硬件設(shè)備與操作系統(tǒng)之間的通信和控制。Linux設(shè)備
    的頭像 發(fā)表于 08-30 15:11 ?1218次閱讀

    linux驅(qū)動(dòng)程序如何加載進(jìn)內(nèi)核

    在Linux系統(tǒng)中,驅(qū)動(dòng)程序是內(nèi)核與硬件設(shè)備之間的橋梁。它們允許內(nèi)核與硬件設(shè)備進(jìn)行通信,從而實(shí)現(xiàn)對硬件設(shè)備的控制和管理。 驅(qū)動(dòng)程序
    的頭像 發(fā)表于 08-30 15:02 ?1082次閱讀

    linux驅(qū)動(dòng)程序主要有哪些功能

    Linux驅(qū)動(dòng)程序是操作系統(tǒng)與硬件設(shè)備之間進(jìn)行通信的橋梁,負(fù)責(zé)實(shí)現(xiàn)硬件設(shè)備與操作系統(tǒng)之間的數(shù)據(jù)交換和控制。Linux驅(qū)動(dòng)程序的主要功能包括以下幾個(gè)方面:
    的頭像 發(fā)表于 08-30 14:47 ?889次閱讀

    linux驅(qū)動(dòng)程序的編譯方法是什么

    Linux驅(qū)動(dòng)程序的編譯方法主要包括兩種: 與內(nèi)核一起編譯 和 編譯成獨(dú)立的內(nèi)核模塊 。以下是對這兩種方法的介紹: 一、與內(nèi)核一起編譯 與內(nèi)核一起編譯意味著將驅(qū)動(dòng)程序的源代碼直接集成到Linux內(nèi)核
    的頭像 發(fā)表于 08-30 14:46 ?1223次閱讀

    linux驅(qū)動(dòng)程序運(yùn)行在什么空間

    Linux 驅(qū)動(dòng)程序是操作系統(tǒng)的一部分,負(fù)責(zé)管理硬件設(shè)備與操作系統(tǒng)之間的交互。驅(qū)動(dòng)程序運(yùn)行在內(nèi)核空間(Kernel Space),這是操作系統(tǒng)的核心部分,與用戶空間(User Space)相對。內(nèi)核
    的頭像 發(fā)表于 08-30 14:37 ?889次閱讀

    虹科技術(shù) 全新Linux環(huán)境PCAN驅(qū)動(dòng)程序發(fā)布!CAN/CAN FD通信體驗(yàn)全面升級(jí)!

    ”。想要體驗(yàn)字符模式設(shè)備驅(qū)動(dòng)接口(chardev)的便捷,還是SocketCAN設(shè)備驅(qū)動(dòng)接口(netdev)的高效?都由您說了算! 新版本驅(qū)動(dòng)
    的頭像 發(fā)表于 08-29 09:36 ?834次閱讀
    虹科技術(shù) 全新Linux環(huán)境PCAN<b class='flag-5'>驅(qū)動(dòng)程序</b>發(fā)布!CAN/CAN FD通信體驗(yàn)全面升級(jí)!
    主站蜘蛛池模板: 91在线免费看 | 日韩三级视频在线观看 | 日本欧美一区二区 | 在线播放色 | 亚洲综合伊人 | 特黄a大片免费视频 | 亚洲最色网| 日韩婷婷| 欧美一级视频在线高清观看 | 男人性天堂 | 国产精品久久久久久久人热 | 国产福利资源在线 | 免费观看在线观看 | 黄色小毛片 | 欧美zooz人禽交免费 | 欧美一级黄色影片 | 午夜国产在线观看 | 久草干 | 精品三级国产精品经典三 | 韩国男女无遮挡高清性视频 | 二区三区在线 | 国产美女精品一区二区三区 | 黄乱色伦 | 一区二区三区高清在线 | 奇米四色7777| 性生生活三级视频在线观看 | 精品新一区二区三区四区 | 国产精品午夜自在在线精品 | 91久久国产青草亚洲 | 国产亚洲美女精品久久久2020 | 男人午夜禁片在线观看 | 亚洲欧美成人在线 | 日本欧美一区二区三区视频 | 天天色色网| 天天爽夜夜爽夜夜爽精品视频 | 日本加勒比黑人 | 啪啪网免费视频 | 性做久久久久久久免费观看 | 美女扒开尿口给男人看大全 | 艹逼视频免费观看 | 女人张开腿 让男人桶个爽 免费观看 |