當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]WINCE6.0 簡(jiǎn)單LED驅(qū)動(dòng)程序的編寫

把它寫成了實(shí)驗(yàn)報(bào)告的樣子! 在此BLOG中的有些函數(shù)是針對(duì)特定的BSP, 比如:地址的映射函數(shù), 在每一個(gè)BSP中它的地址映射函數(shù)都不同, 但是都是地址映射(廢話當(dāng)然是地址映射了)。其實(shí)里面有很多的東西都還可以添加:比如添加讀取LED信息狀態(tài), 優(yōu)化地址映射(不必把全部的GPIO都映射, 可以自定義一個(gè)小的結(jié)構(gòu)體來(lái)實(shí)現(xiàn))。
一. 實(shí)驗(yàn)?zāi)康?
a) 掌握流驅(qū)動(dòng)的結(jié)構(gòu)
b) 掌握一般流驅(qū)動(dòng)的編寫方法

二. 實(shí)驗(yàn)設(shè)備
a) S3C6410 開(kāi)發(fā)板一臺(tái)
b) PC 機(jī)一臺(tái), VS2005, CE6.0 環(huán)境

三. 實(shí)驗(yàn)內(nèi)容
a) 進(jìn)行簡(jiǎn)單 LED 驅(qū)動(dòng)的編寫。

四. 實(shí)驗(yàn)原理
a) 硬件原理圖
i.
ii.
iii. 從原理圖可以知道如果我們要點(diǎn)亮 LEDx , 只需要 GPMx 輸出高電平, 如果要熄滅 LEDx , 只需要 GPMx 輸出低電平即可。

b) 軟件原理設(shè)計(jì)
i. 由于在 WINCE 中使用都是虛擬的地址, 所以需要將實(shí)際的物理地址轉(zhuǎn)換為虛擬地址來(lái)使用。 在系統(tǒng)提供的 BSP 中提供了一個(gè)函數(shù)來(lái)實(shí)現(xiàn)從物理地址到虛擬地址的映射。
1. void *DrvLib_MapIoSpace (UINT32 PhysicalAddress , UINT32 NumberOfBytes , BOOL CacheEnable )
2. 把物理地址轉(zhuǎn)換為虛擬地址。(其實(shí)它就是在地址映射表中查找相應(yīng)的物理地址,然后返回對(duì)應(yīng)的虛擬地址加上它的偏移。)
3. UINT32 PhysicalAddress :要實(shí)現(xiàn)映射的物理地址的起始地址。
4. UINT32 NumberOfBytes : 要映射物理地址的長(zhǎng)度。
5. BOOL CacheEnable :該物理地址是否使用了CACHE.( 具體參照地址映射表) 。
ii. LED 上下文結(jié)構(gòu)體的定義
1. 定義了一個(gè) LED 驅(qū)動(dòng)的上下文, 用來(lái)保存 LED 驅(qū)動(dòng)的信息。 但是只是簡(jiǎn)單的 LED 驅(qū)動(dòng), 沒(méi)有包含多的數(shù)據(jù)。
typedef struct
{
volatile S3C6410_GPIO_REG *pGPIOReg ;
}LED_PUBLIC_CONTEXT , *PLED_PUBLIC_CONTEXT ;
2 . S3C6410_GPIO_REG 是BSP 預(yù)先定義的一個(gè)GPIO 使用的數(shù)據(jù)結(jié)構(gòu)。
iii. GPIO 寄存器的使用。 GPIO 寄存器的地址都映射到了虛擬的地址上。 BSP 提供了一個(gè)結(jié)構(gòu)體方便 GPIO 寄存器的使用。
1. typedef struct
{ ……………..
UINT32 GPMCON; // 820
UINT32 GPMDAT; // 824
UINT32 GPMPUD; // 828
………………..
} S3C6410_GPIO_REG, *PS3C6410_GPIO_REG;
2. 在使用這個(gè)結(jié)構(gòu)全的時(shí)候把 GPIO 的虛擬地址的基地址映射到此結(jié)構(gòu)的開(kāi)始即可以操作此結(jié)構(gòu)體的數(shù)據(jù)來(lái)操作實(shí)際的寄存器。
3. 進(jìn)行GPIO 物理地址到虛擬地址的映射: pLedContext ->pGPIOReg = (volatile S3C6410_GPIO_REG *)DrvLib_MapIoSpace (S3C6410_BASE_REG_PA_GPIO , sizeof (S3C6410_GPIO_REG ), FALSE ) ;
iv. 實(shí)現(xiàn) LED 燈狀態(tài)的操作。
1. 獲得了 GPIO 的虛擬地址就可以像實(shí)際的物理地址那樣實(shí)現(xiàn)寄存器的操作。
2.
a) // 使能上拉
b) pLedContext ->pGPIOReg ->GPMPUD |= 0x0ff;
c) // 設(shè)置為輸出
d) pLedContext ->pGPIOReg ->GPMCON = 0x111111;
e) // 關(guān)閉所有的LED
f) LED_ALL_OFF (pLedContext ->pGPIOReg ->GPMDAT );
3. 為了方便進(jìn)行操作,定義了一組宏。
// 打開(kāi)或關(guān)閉LED0
#define LED0_ON (x ) (x |= 0x00000001)
#define LED0_OFF (x ) (x &= 0xfffffffe)
// 打開(kāi)或關(guān)閉LED1
#define LED1_ON (x ) (x |= 0x00000002)
#define LED1_OFF (x ) (x &= 0xfffffffd)
// 打開(kāi)或關(guān)閉LED2
#define LED2_ON (x ) (x |= 0x00000004)
#define LED2_OFF (x ) (x &= 0xfffffffb)
// 打開(kāi)或關(guān)閉LED3
#define LED3_ON (x ) (x |= 0x00000008)
#define LED3_OFF (x ) (x &= 0xfffffff7)
// 打開(kāi)或關(guān)閉所有的LED
#define LED_ALL_ON (x ) (x |= 0x0000000f)
#define LED_ALL_OFF (x ) (x &= 0xfffffff0)
五. 實(shí)驗(yàn)步驟
a) Xxx_Init 函數(shù)的原型:
i. DWORD XXX_Init( LPCTSTR pContext , DWORD dwBusContext );
ii. pContext: Pointer to a string containing the registry path to the active key for the stream interface driver.
iii. lpvBusContext: Potentially process-mapped pointer passed as the fourth parameter to ActivateDeviceEx . If this driver was loaded through legacy mechanisms, then dwBusContext is zero. This pointer, if used, has only been mapped again as it passes through the protected server library (PSL). The XXX _Init function is responsible for performing all protection checking
iv. 返回值 : Returns a handle to the device context created if successful. Returns zero if not successful. This handle is passed to the XXX_Open (Device Manager) , XXX_PowerDown (Device Manager) , XXX_PowerUp (Device Manager) , and XXX_Deinit (Device Manager) functions
v. 注意:當(dāng)調(diào)用 設(shè)備管理程序當(dāng)調(diào)用 ActivateDeviceEx 函數(shù)的時(shí)候會(huì)間接調(diào)用到此函數(shù), ActivateDeviceEx 的作用就是加載設(shè)備
vi. LED_Init 函數(shù)的編寫。 LED_Init 最主要的功能就是進(jìn)行硬件的初使化。
vii. LED_Init 函數(shù)的實(shí)現(xiàn):
DWORD Led_Init (LPCTSTR pContext )
{
volatile PLED_PUBLIC_CONTEXT pLedContext ;

RETAILMSG (DEBUG_LED ,(TEXT ("Led_Init Function!/n" )));

// 申請(qǐng)LED 的CONTEXT
pLedContext = (PLED_PUBLIC_CONTEXT )LocalAlloc (LPTR , sizeof (pContext ));
if (!pLedContext )
{
RETAILMSG (DEBUG_LED , (TEXT ("Can't alloc memory for led context!/n" )));
return NULL ;
}

// 得到GPIO 寄存器的地址
pLedContext ->pGPIOReg = (volatile S3C6410_GPIO_REG *)DrvLib_MapIoSpace (S3C6410_BASE_REG_PA_GPIO , sizeof (S3C6410_GPIO_REG ), FALSE );
if (pLedContext ->pGPIOReg == NULL )
{
RETAILMSG (DEBUG_LED , (TEXT ("LED for pGPIORges: DrvLib_MapIoSpace failed!/n" )));
LocalFree (pLedContext );
return NULL ;
}

// 使能上拉
pLedContext ->pGPIOReg ->GPMPUD |= 0x0ff;
// 設(shè)置為輸出
pLedContext ->pGPIOReg ->GPMCON = 0x111111;
// 關(guān)閉所有的LED
LED_ALL_OFF (pLedContext ->pGPIOReg ->GPMDAT );
RETAILMSG (DEBUG_LED , (TEXT ("Led0 on! %d!/n" ), (pLedContext ->pGPIOReg ->GPMDAT )));

return pLedContext ;
` }
a) Xxx_Write 函數(shù)原型:
DWORD XXX_Write(DWORD
hOpenContext
, LPCVOID
pBuffer
, DWORD
Count
);


i. hOpenContext : Handle to the open context of the device. The call to the XXX_Open (Device Manager) function returns this identifier 。
ii. pBuffer : Pointer to the buffer that contains the data to write.
iii. Count: Number of bytes to write from the pBuffer buffer into the device.
iv. 返回值: The number of bytes written indicates success. A value of –1 indicates failure.
v. LED_Write 函數(shù)的作用只是進(jìn)行對(duì) LED 狀態(tài)的寫入。
自定義結(jié)構(gòu)體:
typedef struct
{
unsigned char cLedNum ;
unsigned char fLedStatue ;
}LED_DATA , *PLED_DATA ;
cLedNum :LED 的標(biāo)號(hào)。0 對(duì)應(yīng)第一個(gè)LED, 1 對(duì)應(yīng)第2 個(gè)LED … 4 表示全部熄滅(因?yàn)樗挥? 個(gè)LED )
fLegStatue :將要實(shí)現(xiàn)的操作。 0 熄滅, 1 點(diǎn)亮。
vi. LED_Write 函數(shù)的實(shí)現(xiàn)。
DWORD Led_Write (DWORD hOpenContext ,
DWORD pBuffer ,
DWORD Count )
{
PLED_DATA pLedData = (PLED_DATA )pBuffer ;
RETAILMSG (DEBUG_LED , (TEXT ("Current hOpenContext %d /n" )), hOpenContext );
RETAILMSG (DEBUG_LED , (TEXT ("Corrent GPMDATA %d!/n" ), (((PLED_PUBLIC_CONTEXT )hOpenContext )->pGPIOReg ->GPMDAT )));

switch (pLedData ->cLedNum )
{
case 0:
if (pLedData ->fLedStatue )
{
LED0_ON (((PLED_PUBLIC_CONTEXT )hOpenContext )->pGPIOReg ->GPMDAT );
RETAILMSG (DEBUG_LED , (TEXT ("Led0 on! %d/n!" ), ((PLED_PUBLIC_CONTEXT )hOpenContext )->pGPIOReg ->GPMDAT ));
}
else
{
LED0_OFF (((PLED_PUBLIC_CONTEXT )hOpenContext )->pGPIOReg ->GPMDAT );
RETAILMSG (DEBUG_LED , (TEXT ("Led0 off!/n!" )));
}
break ;
case 1:
。。。。。。
break ;
case 2:
。。。。。。
break ;
case 3:
。。。。。。
case 4:
if (pLedData ->fLedStatue )
{ LED_ALL_ON (((PLED_PUBLIC_CONTEXT )hOpenContext )->pGPIOReg ->GPMDAT );
}
else
{ LED_ALL_OFF (((PLED_PUBLIC_CONTEXT )hOpenContext )->pGPIOReg ->GPMDAT );
}
default :
break ;
}

return (Count );
}

b) 其它流接口函數(shù)的編寫:其它的流接口函數(shù)并沒(méi)有實(shí)現(xiàn)函數(shù)過(guò)程, 它們一般就直接返回。在Led_Deinit 函數(shù)中進(jìn)行了申請(qǐng)內(nèi)存的釋放,也調(diào)用了一個(gè)放棄映射的函數(shù)DrvLib_UnmapIoSpace , 其實(shí)這個(gè)函數(shù)在6.0 之中沒(méi)有作用, 它是直接返回結(jié)果的函數(shù)。
c) LED 的配置:
設(shè)備管理器要使用LED 流驅(qū)動(dòng)的接口,就必須將LED 提供的接口函數(shù)導(dǎo)出。在Led.def 文件中添加如下代碼:
LIBRARY LED

EXPORTS Led_Init
Led_Deinit
Led_Open
Led_Close
Led_Read
Led_Write
Led_Seek
Led_PowerDown
Led_PowerUp
Led_IOControl

導(dǎo)出了LED 的接口函數(shù),要把Led.dll 添加到鏡像文件中去還要修改platform.bib 文件。

在 MODULES 節(jié)中添加代碼如圖:


最后修改注冊(cè)表 platform.reg :
HKEY_LOCAL_MACHINE/Drives/BuildIn 下添加注冊(cè)表項(xiàng) LED( 任意名字都可 )
注冊(cè)表項(xiàng)中的內(nèi)容:

六. 實(shí)驗(yàn)結(jié)果及分析
a) 按照上述步驟進(jìn)行 LED 流驅(qū)動(dòng)的編寫, 再編寫一個(gè)簡(jiǎn)單的應(yīng)用程序即可進(jìn)行 LED 燈的控制。

 

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

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉