⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpio.c

📁 WinCE5.0BSP for Renesas SH7770
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -