{
RETAILMSG(1,(TEXT('[KEY] For pGPIOregs: DrvLib_MapIoSpace failed!/r/n')));
bResult = FALSE;
goto CleanUp;
}
//禁止上下拉
pPublicKey->pGPIOregs->GPMPUD = 0x00000000;
//GPM0-GPM3設置成輸出
pPublicKey->pGPIOregs->GPMCON = 0x00001111;
//LED0-3熄滅
pPublicKey->pGPIOregs->GPMDAT = 0x0;
//設置EINT0中斷
//禁止GPN0和GPN1上下拉
pPublicKey->pGPIOregs->GPNPUD &= ~0x0F;
//GPN0-1設置成外中斷
pPublicKey->pGPIOregs->GPNCON |= 0x0a;
//使能外中斷EINT0-EINT1
pPublicKey->pGPIOregs->EINT0MASK &= ~0x3;
//EINT0-1下降沿觸發中斷
pPublicKey->pGPIOregs->EINT0CON0 |= 0x2;
do
{
//Button1 Thread
pPublicKey->FlagExitThrd = FALSE;
g_hEvent1 = CreateEvent(NULL, FALSE, FALSE, NULL);
g_SysIntr1 = SYSINTR_UNDEFINED;
dwHwIntr = IRQ_EINT0;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &dwHwIntr, sizeof(DWORD), &g_SysIntr1, sizeof(DWORD), NULL))
{
RETAILMSG(1,(TEXT('[KEY] Failed to request the KEY sysintr./n')));
g_SysIntr1 = SYSINTR_UNDEFINED;
bResult = FALSE;
break;
}
if (!InterruptInitialize(g_SysIntr1, g_hEvent1, NULL, 0))
{
RETAILMSG(1,(TEXT('[KEY] KEY Interrupt Initialization failed!!!/n')));
bResult = FALSE;
break;
}
g_hThread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Button1Thread, NULL, 0, NULL);
if (g_hThread1 == NULL)
{
RETAILMSG(1,(TEXT('[KEY] Key Button Thread creation error!!!/n')));
bResult = FALSE;
break;
}
//Button2 Thread
g_hEvent2 = CreateEvent(NULL, FALSE, FALSE, NULL);
g_SysIntr2 = SYSINTR_UNDEFINED;
dwHwIntr = IRQ_EINT1;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &dwHwIntr, sizeof(DWORD), &g_SysIntr2, sizeof(DWORD), NULL))
{
RETAILMSG(1,(TEXT('[KEY] Failed to request the KEY sysintr./n')));
g_SysIntr2 = SYSINTR_UNDEFINED;
bResult = FALSE;
break;
}
if (!InterruptInitialize(g_SysIntr2, g_hEvent2, NULL, 0))
{
RETAILMSG(1,(TEXT('[KEY] KEY Interrupt Initialization failed!!!/n')));
bResult = FALSE;
break;
}
g_hThread2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Button2Thread, NULL, 0, NULL);
if (g_hThread2 == NULL)
{
RETAILMSG(1,(TEXT('[KEY] Key Button2 Thread creation error!!!/n')));
bResult = FALSE;
break;
}
} while (0);
RETAILMSG(1,(TEXT('--[KEY] KEY_Init Function/r/n')));
if(bResult)
{
return pPublicKey;
}
else
{
return NULL;
}
CleanUp:
if (!bResult)
{
if (pPublicKey->pGPIOregs)
{
DrvLib_UnmapIoSpace((PVOID)pPublicKey->pGPIOregs);
pPublicKey->pGPIOregs = NULL;
}
return NULL;
}
}
DWORD KEY_Open(DWORD dwData, DWORD dwAccess, DWORD dwShareMode)
{
RETAILMSG(1, (TEXT('KEY_Open: KEY Device Open Successfully./r/n')));
return(dwData);
}
BOOL KEY_Close(DWORD Handle)
{
RETAILMSG(1, (TEXT('KEY_Close: KEY Device Close Successfully./r/n')));
return (TRUE);
}
DWORD KEY_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes)
{
UINT16 ch;
DWORD result;
RETAILMSG(1, (TEXT('KEY_Read: KEY Device Read Successfully./r/n')));
ch = (UINT16)pPublicKey->pGPIOregs->GPNDAT;
if( (ch & Butt1Mask) != 0)
{
result = 1;
RETAILMSG(1, (TEXT('Button 1 pressed:/r/n')));
}
else if( (ch & Butt2Mask) != 0)
{
result = 2;
RETAILMSG(1, (TEXT('Button 2 pressed:/r/n')));
}
else
{
result = -1;
RETAILMSG(1, (TEXT('No Button pressed:/r/n')));
}
dwNumBytes = result;
return (dwNumBytes);
}
DWORD KEY_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes)
{
RETAILMSG(1, (TEXT('BTN_Write:KEY Device Write Successfully./r/n')));
return(TRUE);
}
DWORD KEY_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod)
{
return (DWORD)-1;
}
void KEY_PowerDown(void)
{
return;
}
void KEY_PowerUp(void)
{
return;
}
BOOL KEY_IOControl(DWORD hOpenContext,DWORD dwCode,PBYTE pBufIn,DWORD dwLenIn,PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut)
{
RETAILMSG(1, (TEXT('BTN_IOControl:/r/n')));
return(TRUE);
}
/*******************************************************************************
*DLL入口函數
*******************************************************************************/
BOOL
DllEntry(
HINSTANCE hinstDll,
DWORD dwReason,
LPVOID lpReserved
)
{
if ( dwReason == DLL_PROCESS_ATTACH )
{
DEBUGMSG (1, (TEXT('[MyKey] Process Attach/r/n')));
}
if ( dwReason == DLL_PROCESS_DETACH )
{
DEBUGMSG (1, (TEXT('[MyKey] Process Detach/r/n')));
}
return(TRUE);
}
3.編寫配置文件,包括如下文件sources,MyKey.def,makefile如下:
技巧:可以到其他驅動程序目錄下拷貝在加以修改
Sources:
RELEASETYPE=PLATFORM
PREPROCESSDEFFILE=1
TARGETNAME=MyKey
TARGETTYPE=DYNLINK
DEFFILE=MyKey.def
DLLENTRY=DllEntry
TARGETLIBS= /
$(_PROJECTROOT)/cesysgen/sdk/lib/$(_CPUINDPATH)/coredll.lib /
$(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/DriverLib.lib
SOURCES= /
MyKey.c
MyKey.def:
LIBRARY MyKey
EXPORTS
KEY_Init
KEY_Deinit
KEY_Open
KEY_Close
KEY_Read
KEY_Write
KEY_Seek
KEY_IOControl
KEY_PowerDown
KEY_PowerUp
上一篇:基于gnu-arm-linux的LPC2220的簡單工程模板
下一篇:基于ARM7(LPC2131)平臺的μC/OS-Ⅱ的移植
推薦閱讀最新更新時間:2025-05-15 14:10

設計資源 培訓 開發板 精華推薦
- cdsj relay
- 用于 LED 照明的 DC 到 DC 單路輸出電源
- 使用 MCP1631 高速脈寬調制器和 +5.5V 至 +16.0V 輸入的典型應用電路
- AD8532ARMZ-REEL單電源直接接入調制解調器的典型應用
- 用于無線的 2.8 至 5.5V 差分放大器
- NSI45025ZT1G 用于基本交流應用的恒流 LED 驅動器的典型應用
- 使用 ROHM Semiconductor 的 BD45425 的參考設計
- 使用 ON Semiconductor 的 ILC7080 的參考設計
- 使用 ON Semiconductor 的 CS5203A-2G 的參考設計
- OP484ESZ 3V 單電源、50Hz 至 60Hz 有源陷波濾波器和假接地的典型應用
- 南芯科技推出高集成度多口移動電源解決方案,助力充電寶市場穩健發展
- 英飛凌推出具有超低導通電阻的CoolSiC? MOSFET 750 V G2,適用于汽車和工業功率電子應用
- DigiKey 慶祝 B 站賬號粉絲突破 10 萬,贈送驚喜禮包
- 碳化硅企業 Wolfspeed 啟動破產重組,預計 2025 年三季度末完成司法重整
- 蘋果被曝考慮放棄自研模型 轉而與Anthropic或OpenAI合作
- ?百度文心4.5來襲!英特爾Day0即支持端側部署
- 【廣瀨電機】關于中國發明專利侵權訴訟達成和解的公告
- 英飛凌BMS解決方案推動電動汽車創新
- 地平線的L3判斷與實踐路徑
- 汽車網絡升級攻略:CAN-CAN FD-車載以太網