?? gpio.c
字號(hào):
ULONG Read_Data;
ULONG Port;
DWORD PA;
DWORD Timeout;
DWORD Flag;
DWORD errorcode = ERROR_SUCCESS;
DWORD dwGpioNum;
DWORD dwPortNum;
if (pBufIn){
dwGpioNum = pPort -> dwBlock;
dwPortNum = pPort -> dwPort;
}
Port = 0x00000001 << (pOpen -> dwPort);
PA = pOpen -> dwPort;
Flag = pOpen -> dwFlag;
switch(dwCode){
case IOCTL_GPIO_SET_PORT :
pOpen -> dwPort = dwPortNum;
if( (pOpen -> dwPort) > 31 ){
errorcode = GPIO_PORT_ERROR;
break;
}
Port = 0x00000001 << (pOpen -> dwPort);
PA = pOpen -> dwPort;
pOpen -> dwFlag = 1;
Flag = pOpen -> dwFlag;
break;
case IOCTL_GPIO_SET_LOCK :
if((Flag != 1) | (PA > 31)){
errorcode = GPIO_PORT_ERROR;
break;
}
if( dwPortNum == GPIO_PORT_LOCK ){
pGpio->dwLock[dwGpioNum] = pGpio->dwLock[dwGpioNum] | Port;
}else{
pGpio->dwLock[dwGpioNum] = pGpio->dwLock[dwGpioNum] &
~(Port & ~pGpio->Lock[dwGpioNum]);
}
break;
case IOCTL_GPIO_SET_POSNEG :
if((Flag != 1) | (PA > 31)){
errorcode = GPIO_PORT_ERROR;
break;
}
if((Port & pGpio->dwLock[dwGpioNum]) == Port){
errorcode = GPIO_PORT_LOCKED;
break;
}
if( dwPortNum == GPIO_POSNEG_NEGATIVE ){
WRITE_REGISTER_ULONG(pGpio -> POSNEG[dwGpioNum],
READ_REGISTER_ULONG(pGpio -> POSNEG[dwGpioNum]) | Port);
}else{
WRITE_REGISTER_ULONG(pGpio -> POSNEG[dwGpioNum],
READ_REGISTER_ULONG(pGpio -> POSNEG[dwGpioNum]) & ~Port);
}
break;
case IOCTL_GPIO_SET_EDGLEVEL :
if((Flag != 1) | (PA > 31)){
errorcode = GPIO_PORT_ERROR;
break;
}
if((Port & pGpio->dwLock[dwGpioNum]) == Port){
errorcode = GPIO_PORT_LOCKED;
break;
}
if( dwPortNum == GPIO_EDGLEV_EDGE ){
WRITE_REGISTER_ULONG(pGpio -> EDGLEVEL[dwGpioNum],
READ_REGISTER_ULONG(pGpio -> EDGLEVEL[dwGpioNum]) | Port);
}else{
WRITE_REGISTER_ULONG(pGpio -> EDGLEVEL[dwGpioNum],
READ_REGISTER_ULONG(pGpio -> EDGLEVEL[dwGpioNum]) & ~Port);
}
break;
case IOCTL_GPIO_SET_FILTER :
if((Flag != 1) | (PA > 31)){
errorcode = GPIO_PORT_ERROR;
break;
}
if((Port & pGpio->dwLock[dwGpioNum]) == Port){
errorcode = GPIO_PORT_LOCKED;
break;
}
if( dwPortNum == GPIO_FILONOFF_ON ){
WRITE_REGISTER_ULONG(pGpio -> FILONOFF[dwGpioNum],
READ_REGISTER_ULONG(pGpio -> FILONOFF[dwGpioNum]) | Port);
}else{
WRITE_REGISTER_ULONG(pGpio -> FILONOFF[dwGpioNum],
READ_REGISTER_ULONG(pGpio -> FILONOFF[dwGpioNum]) & ~Port);
}
break;
case IOCTL_GPIO_SET_IOINT :
if((Flag != 1) | (PA > 31)){
errorcode = GPIO_PORT_ERROR;
break;
}
if((Port & pGpio->dwLock[dwGpioNum]) == Port){
errorcode = GPIO_PORT_LOCKED;
break;
}
if( dwPortNum == GPIO_IOINT_INTERRUPT){
WRITE_REGISTER_ULONG(pGpio -> IOINTSEL[dwGpioNum],
READ_REGISTER_ULONG(pGpio -> IOINTSEL[dwGpioNum]) | Port);
//If interrupt mode is selected,create event object.
if( hEvent[dwGpioNum][PA] == NULL ){
hEvent[dwGpioNum][PA] = CreateEvent(NULL,FALSE,FALSE,NULL);
}
}else{
WRITE_REGISTER_ULONG(pGpio -> IOINTSEL[dwGpioNum],
READ_REGISTER_ULONG(pGpio -> IOINTSEL[dwGpioNum]) & ~Port);
//If event object is created,release event object.
if( hEvent[dwGpioNum][PA] != NULL ){
CloseHandle ( hEvent[dwGpioNum][PA] );
hEvent[dwGpioNum][PA] = NULL;
}
}
break;
case IOCTL_GPIO_SET_INTMSK :
if((Flag != 1) | (PA > 31)){
errorcode = GPIO_PORT_ERROR;
break;
}
if((Port & pGpio->dwLock[dwGpioNum]) == Port){
errorcode = GPIO_PORT_LOCKED;
break;
}
WRITE_REGISTER_ULONG(pGpio -> INTMSK[dwGpioNum],
READ_REGISTER_ULONG(pGpio -> INTMSK[dwGpioNum]) & ~Port);
break;
case IOCTL_GPIO_SET_INTCLR :
if((Flag != 1) | (PA > 31)){
errorcode = GPIO_PORT_ERROR;
break;
}
if((Port & pGpio->dwLock[dwGpioNum]) == Port){
errorcode = GPIO_PORT_LOCKED;
break;
}
WRITE_REGISTER_ULONG(pGpio -> INTCLR[dwGpioNum],
READ_REGISTER_ULONG(pGpio -> INTCLR[dwGpioNum]) | Port);
break;
case IOCTL_GPIO_SET_MSKCLR :
if((Flag != 1) | (PA > 31)){
errorcode = GPIO_PORT_ERROR;
break;
}
if((Port & pGpio->dwLock[dwGpioNum]) == Port){
errorcode = GPIO_PORT_LOCKED;
break;
}
WRITE_REGISTER_ULONG(pGpio -> MSKCLR[dwGpioNum],
READ_REGISTER_ULONG(pGpio -> MSKCLR[dwGpioNum]) | Port);
break;
case IOCTL_GPIO_SET_INOUT :
if((Flag != 1) | (PA > 31)){
errorcode = GPIO_PORT_ERROR;
break;
}
if((Port & pGpio->dwLock[dwGpioNum]) == Port){
errorcode = GPIO_PORT_LOCKED;
break;
}
if( dwPortNum == GPIO_INOUT_OUT){
WRITE_REGISTER_ULONG(pGpio -> INOUTSEL[dwGpioNum],
READ_REGISTER_ULONG(pGpio -> INOUTSEL[dwGpioNum]) | Port);
}else{
WRITE_REGISTER_ULONG(pGpio -> INOUTSEL[dwGpioNum],
READ_REGISTER_ULONG(pGpio -> INOUTSEL[dwGpioNum]) & ~Port);
}
break;
case IOCTL_GPIO_WRITE_PORT :
if((Flag != 1) | (PA > 31)){
errorcode = GPIO_PORT_ERROR;
break;
}
if((Port & pGpio->dwLock[dwGpioNum]) == Port){
errorcode = GPIO_PORT_LOCKED;
break;
}
if( dwPortNum == GPIO_OUT_HIGH ){
WRITE_REGISTER_ULONG(pGpio -> OUTDT[dwGpioNum],
READ_REGISTER_ULONG(pGpio -> OUTDT[dwGpioNum]) | Port);
}else{
WRITE_REGISTER_ULONG(pGpio -> OUTDT[dwGpioNum],
READ_REGISTER_ULONG(pGpio -> OUTDT[dwGpioNum]) & ~Port);
}
break;
case IOCTL_GPIO_READ_PORT :
if((Flag != 1) | (PA > 31)){
errorcode = GPIO_PORT_ERROR;
break;
}
Read_Data = READ_REGISTER_ULONG(pGpio -> INDT[dwGpioNum]) & Port;
if((Read_Data) != 0){
*((DWORD *)pBufOut) = 1;
}else{
*((DWORD *)pBufOut) = 0;
}
break;
case IOCTL_GPIO_GET_EVENT:
if((Flag != 1) | (PA > 31)){
errorcode = GPIO_PORT_ERROR;
break;
}
if((Port & pGpio->dwLock[dwGpioNum]) == Port){
errorcode = GPIO_PORT_LOCKED;
break;
}
Timeout = dwPortNum;
RETAILMSG( 1, (TEXT("GPIO driver :Wait Event[%d]-[%d].\r\n"),dwGpioNum,PA));
dwRet = WaitForSingleObject(hEvent[dwGpioNum][PA],Timeout);
if( (READ_REGISTER_ULONG(pGpio -> EDGLEVEL[dwGpioNum]) & PA) != 0){
WRITE_REGISTER_ULONG(pGpio -> INTCLR[dwGpioNum],
READ_REGISTER_ULONG(pGpio -> INTCLR[dwGpioNum]) | PA);
WRITE_REGISTER_ULONG(pGpio -> MSKCLR[dwGpioNum],
READ_REGISTER_ULONG(pGpio -> MSKCLR[dwGpioNum]) | PA);
}
*((DWORD *)pBufOut) = dwRet;
break;
default :
errorcode = ERROR_INVALID_PARAMETER;
break;
}
if( errorcode == ERROR_SUCCESS ){
return TRUE;
}else{
SetLastError( errorcode );
return FALSE;
}
}
VOID
EventHandler(
PGPIO_DRIVER_INFO pGpio
)
{
HANDLE hEvntInt;
ULONG IntType[4];
int i;
DWORD dwBlockNum;
hEvntInt = CreateEvent(NULL,FALSE,FALSE,NULL);
if ( hEvntInt == NULL ){
DEBUGMSG( ZONE_ERROR, (TEXT("GPIO driver :Failed to get event handler.\r\n")));
CloseHandle ( hEvntInt );
}
if ( !InterruptInitialize( SYSINTR_GPIO, hEvntInt, NULL, 0 ) ){
DEBUGMSG( ZONE_ERROR, (TEXT("GPIO driver :Failed to bind event handler.\r\n")));
CloseHandle ( hEvntInt );
}
SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_HIGHEST );
while (1){
if( WaitForSingleObject( hEvntInt, INFINITE ) == WAIT_OBJECT_0)
{
for ( dwBlockNum = 0; dwBlockNum < 4; dwBlockNum++){
IntType[dwBlockNum] = READ_REGISTER_ULONG(pGpio -> INTDT[dwBlockNum]);
}
for ( dwBlockNum = 0; dwBlockNum < 4; dwBlockNum++){
for( i=0; i<32; i++ ){
if( ((IntType[dwBlockNum] & (0x00000001<<i)) != 0) && (hEvent[dwBlockNum][i] != NULL) ){
SetEvent(hEvent[dwBlockNum][i]);
WRITE_REGISTER_ULONG(pGpio -> INTMSK[dwBlockNum],
READ_REGISTER_ULONG(pGpio -> INTMSK[dwBlockNum]) & ~(0x00000001<<i));
}
}
}
InterruptDone(SYSINTR_GPIO);
}
}
return ;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -