www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 嵌入式 > 嵌入式軟件
[導讀] 引言隨著以計算機技術(shù)、通信技術(shù)和軟件技術(shù)為核心的信息技術(shù)的迅速發(fā)展,嵌入式系統(tǒng)在各行業(yè)得到了廣泛的應用,極大地推動了行業(yè)的滲透性應用。嵌入式系統(tǒng)是 “以應

 引言

隨著以計算機技術(shù)、通信技術(shù)和軟件技術(shù)為核心的信息技術(shù)的迅速發(fā)展,嵌入式系統(tǒng)在各行業(yè)得到了廣泛的應用,極大地推動了行業(yè)的滲透性應用。嵌入式系統(tǒng)是 “以應用為中心、以計算機技術(shù)為基礎(chǔ)、軟硬件可裁剪、適應應用系統(tǒng)對功能、可靠性、成本、體積、功耗嚴格要求的專用計算機系統(tǒng)”,由嵌入式硬件和嵌入式軟件兩部分組成。嵌入式軟件包括嵌入式操作系統(tǒng)和嵌入式應用軟件。Microsoft的桌面操作系統(tǒng)已經(jīng)為人們熟悉和使用,嵌入式的操作系統(tǒng)Windows CE.net也日益風行。Windows CE.net是Microsoft推出的功能強大的緊湊、高效、可伸縮的32位嵌入式操作系統(tǒng),主要面對各種各樣的嵌入式系統(tǒng)和產(chǎn)品。該系統(tǒng)所具有的多線程、多任務(wù)、完全搶占式的特點是專為各種具有嚴格資源限制的硬件系統(tǒng)所設(shè)計的。為了將操作系統(tǒng)和硬件設(shè)備連接起來,聯(lián)系硬件和軟件的驅(qū)動就顯得很重要。

下面主要針對三星公司ARM9內(nèi)核的芯片S3C2410進行分析,介紹在Windows CE.net系統(tǒng)下進行底層設(shè)備驅(qū)動開發(fā)的方法并提供I2C通信的實例。

1 I2C通信協(xié)議及S3C2410芯片介紹

I2C(Inter Integrated Circuit)總線是1980年由Philips公司推出的。 I2C總線用兩條線(SDA和SCL)在總線和裝置之間傳遞信息,在微控制器和外部設(shè)備之間進行串行通信或在主設(shè)備和從設(shè)備之間進行雙向數(shù)據(jù)傳送。兩條通信線通過上拉電阻被拉升至+5 V。在控制系統(tǒng)中的每個集成電路可以通過一個CMOS緩沖器來讀每一條線路,也可以通過一個柵極開路的FET管將每一條線的電平下拉。因此,對每個芯片來說,每條線既是輸入線,又是輸出線。

I2C總線遵從同步串行傳輸協(xié)議,即各位串行(一位接一位)發(fā)送,由時鐘(clock)線指示讀數(shù)據(jù)(data)線的時刻。每個數(shù)據(jù)包前有一個地址,以指示由哪個器件來接收該數(shù)據(jù)。

S3C2410是一款基于ARM920T的16/32位RISC微處理器,主要用于手持設(shè)備,擁有高性價比,低功耗等特點,也是目前市面上出現(xiàn)較多的嵌入式開發(fā)板的處理器之一。芯片擁有16 KB的指令和數(shù)據(jù)緩存器,有存儲管理單元(MMU)、LCD控制器、3個串口、4路DMA、4個時鐘定時器、8路10位的A/D轉(zhuǎn)換;支持I2C、I2S、SPI、主從USB等接口以及SD/MMC卡。

S3C2410微處理器的I2C總線可以處于下面4種模式下:主接收模式、主發(fā)送模式、從接收模式和從發(fā)送模式。處理器對I2C進行的操作,主要是對下面的幾個寄存器進行讀/寫:

◇ IIC控制寄存器,IICCON(物理地址0X54000000,內(nèi)存映射后的虛擬地址);

◇ IIC控制/狀態(tài)寄存器,IICSTAT(物理地址0X54000004);

◇ IIC數(shù)據(jù)寄存器,IICDS(物理地址0X54000008);

◇ IIC地址寄存器,IICADD(物理地址0X5400000C)。

本設(shè)計主要是CPU工作在主模式下與下面的I2C接口設(shè)備進行通信。

2 Windows CE系統(tǒng)驅(qū)動特點

Windows CE.net驅(qū)動有兩種模型:本機設(shè)備驅(qū)動程序和流接口驅(qū)動程序。本機設(shè)備驅(qū)動適于集成到基于Windows CE.net平臺的設(shè)備。這些設(shè)備驅(qū)動程序是一些硬件所必需的,是由原始設(shè)備制造商創(chuàng)建的,用以驅(qū)動如鍵盤、觸摸屏、音頻設(shè)備等,往往在設(shè)備售出后就不會再更換,如通用LED驅(qū)動、電源驅(qū)動、鍵盤驅(qū)動和顯示驅(qū)動等都是本機設(shè)備驅(qū)動。對于本機設(shè)備驅(qū)動程序,Platform Builder提供了一些驅(qū)動程序樣本,目的是為了方便開發(fā)人員快速開發(fā)出自己的驅(qū)動程序。當Win CE系統(tǒng)啟動時,本地設(shè)備驅(qū)動程序?qū)⒈患虞d到系統(tǒng)的內(nèi)存中。本地驅(qū)動程序的開發(fā)分為分層驅(qū)動和單片驅(qū)動程序。分層驅(qū)動要利用微軟提供的與應用程序通信的上層,稱為模塊驅(qū)動程序?qū)覯DD(Model Device Driver)。MDD層通過設(shè)備驅(qū)動程序接口DDI(Device Driver Interface)與應用程序通信,開發(fā)驅(qū)動程序通常不修改MDD層,主要關(guān)心與具體硬件相關(guān)的下層,依賴平臺的設(shè)備驅(qū)動程序?qū)覲DD (Platform Dependent Driver), PDD層通過設(shè)備驅(qū)動服務(wù)接口(Device Driver Service Provider Interface)直接管理硬件。流接口設(shè)備驅(qū)動程序(指可安裝的啟動程序)可以由第三方生產(chǎn)商提供,以支持添加到系統(tǒng)中的設(shè)備。Windows CE下的設(shè)備驅(qū)動程序在與應用程序相同的保護級上工作。當系統(tǒng)啟動時,大多數(shù)驅(qū)動程序是由設(shè)備管理進程(DEVICE.EXE)加載的,所有這些驅(qū)動程序?qū)⒐蚕硗粋€進程地址空間。

3 I2C總線底層驅(qū)動設(shè)計

I2C總線驅(qū)動是放在Windows CE操作系統(tǒng)的內(nèi)核下層,位于OEM Adaptation Layer(OAL)層的一個真正的驅(qū)動。

3.1 初始化I2C中斷和編寫ISR例程

I2C的通信是通過操作I2C的寄存器進行的。在I2C通信中主要對上面介紹的4個寄存器進行讀寫。通過讀寫這些寄存器中的命令狀態(tài)字可以檢測和控制I2C總線的行為。在Windows CE.net下,首先要在文件oalintr.h添加I2C的中斷號的宏定義:

#defineSYSINTR_I2C(SYSINTR_FIRMWARE+19)

然后在文件cfw.c的文件中添加I2C中斷的初始化,禁止和復位。具體代碼如下:

在OEMInterruptEnable函數(shù)中加入

case SYSINTR_IIC:

s2410INT->rSRCPND=BIT_IIC;

if (s2410INT->rINTPND & BIT_IIC) s2410INT->rINTPND = BIT_IIC;

s2410INT->rINTMSK&= ~BIT_IIC;

break;

在OEMInterruptDisable函數(shù)中加入

case SYSINTR_IIC:

s2410INT->rINTMSK|= BIT_IIC;

break;

在armint.c文件中添加ISR程序,處理中斷發(fā)生后返回定義的中斷號。具體代碼如下:

在OEMInterruptHandler函數(shù)中添加

else if (IntPendVal == INTSRC_IIC) {

s2410INT->rSRCPND= BIT_IIC; /* 清除中斷 */

if (s2410INT->rINTPND & BIT_IIC) s2410INT->rINTPND= BIT_IIC;

s2410INT->rINTMSK|= BIT_IIC; /* I2C中斷禁止 */

return (SYSINTR_RTC_ALARM);

}

3.2 編寫流驅(qū)動程序

I2C總線驅(qū)動程序采用的是Win CE流驅(qū)動的標準形式。在IIC_Init的函數(shù)中,首先通過函數(shù)VirtualAlloc()和VirtualCopy(),把芯片中針對I2C的物理地址和操作系統(tǒng)的虛存空間聯(lián)系起來,對虛擬地址空間的操作就相當于對芯片的物理地址進行操作。地址映射的代碼如下:[!--empirenews.page--]

reg = (PVOID)VirtualAlloc(0, sz, MEM_RESERVE, PAGE_NOACCESS);

if (reg) {

if (!VirtualCopy(reg, addr, sz, PAGE_READWRITE | PAGE_NOCACHE )) {

RETAILMSG( DEBUGMODE,( TEXT( "Initializing interrupt \\n\\r" ) ) );

VirtualFree(reg, sz, MEM_RELEASE);

reg = NULL;

}

}

其中sz是申請的長度,addr是申請?zhí)摂M地址空間的實際物理地址在Win CE中的映射地址。

然后對申請到的虛擬地址進行操作,安裝Windows中的流驅(qū)動的模型進行驅(qū)動的編寫,主要包括下面函數(shù)的編寫。

IIC_Init()

在函數(shù)中,主要是對I2C的初始化,主要語句如下:

v_pIICregs = ( volatile IICreg *)IIC_RegAlloc((PVOID)IIC_BASE, sizeof(IICreg));

v_pIOPregs = ( volatile IOPreg *)IOP_RegAlloc((PVOID)IOP_BASE, sizeof(IOPreg));

v_pIOPregs->rGPEUP|= 0xc000;

v_pIOPregs->rGPECON |= 0xa00000;

v_pIICregs->rIICCON = (1<<7) | (0<<6) | (1<<5) | (0xf);

v_pIICregs->rIICADD= 0x10;

v_pIICregs->rIICSTAT = 0x10;

VirtualFree( ( PVOID )v_pIOPregs,sizeof( IOPreg ),MEM_RELEASE );

v_pIOPregs = NULL;

if ( !StartDispatchThread( pIIcHead) )

{ IIC_Deinit( pIIcHead );return ( NULL );}在StartDispatchThread()函數(shù)中,主要是創(chuàng)建線程、關(guān)聯(lián)事件和中斷,主要語句如下:

InterruptInitialize( 36,pIicHead->hIicEvent,NULL,0 );//關(guān)聯(lián)時間和中斷

CreateThread( NULL,0,IicDispatchThread,pIicHead,0,NULL );//創(chuàng)建線程等待時間

在IicDispatchThread()函數(shù)中,主要是等待中斷的產(chǎn)生,然后去執(zhí)行:WaitReturn =        WaitForSingleObject( pIicHead->hIicEvent,INFINITE );

IicEventHandler( pIicHead );//事件處理函數(shù)

InterruptDone( 36 );

最后,在函數(shù)IIC_Open、IIC_Read、IIC_Write中,對各個寄存器進行操作,進行數(shù)據(jù)的賦值,得到I2C讀取的數(shù)據(jù)和發(fā)送數(shù)據(jù)。

4 I2C驅(qū)動的封裝和添加到Windows CE中

通過上面的工作,能編譯一個DLL函數(shù),但這還不能叫流接口驅(qū)動程序。因為它的接口函數(shù)還沒有導出,還需要告訴鏈接程序需要輸出什么樣的函數(shù),為此要建立一個自己的def文件,可以用記事本建一個,取名mydrive.Def:

LIBRARY MyDriver

EXPORTS

IIC_Close

IIC_Deinit

IIC_Init

IIC_IOControl

IIC_Open

IIC_PowerDown

IIC_PowerUp

IIC_Read

IIC_Seek

IIC_Write

然后同樣用記事本編寫一個注冊表文件,取名為mydrive.reg:

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\STRINGS]

"Index"=dword:1

"Prefix"="IIC"

"Dll"="MyDriver.dll"

"Order"=dword:0

最后編寫自己的CEC文件。主要是添加一個Build Method,任務(wù)是復制注冊表到Win CE的系統(tǒng)目錄下面。加一個Bib File,其主要功能是把編譯的mydrive.dll文件添加到系統(tǒng)內(nèi)核中去。保存寫好的CEC文件。打開Platform Builder,打開“File”菜單,添加剛剛編寫的CEC特征到系統(tǒng)選項中去。生成系統(tǒng)的時候,添加自己的CEC特性,就可以包含剛剛編寫的I2C驅(qū)動了。

以上介紹了Win CE的驅(qū)動結(jié)構(gòu),并給出了基于Win CE的 I2C驅(qū)動程序部分源代碼。實驗證明該設(shè)計是可行的。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉