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

📄 drv_nim.c

📁 tunner驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
* Outputs
*	None
*
* Return Codes
*	DRV_NIM_OK,
*	DRV_NIM_ALREADY_INITIALIZED,
*	DRV_NIM_NOT_INITIALIZED,
*	DRV_NIM_INVALID_PARAMETER,
*	DRV_NIM_FAIL,
*	DRV_NIM_CALLBACK_TABLE_NOT_ENOUGH
*
* Description
*	Install Callback Function.
*
*****************************************************************/
DRV_NIM_RESULT  DRV_NIM_InstallCallback(
					I32		Device,
					DRV_NIM_CALLBACK_TYPE CallbackType,
					void ( *Callback )(I32  Device ))
{
	UI32	i;

	if( !DRV_NIM_Initialized ) {								/* Not Initialized ? */
		return( DRV_NIM_NOT_INITIALIZED );						/* Not Initialized */
	}
#if DRV_NIM_CHECK_PARAMETER
	if(!((0<=Device)&&(Device<DRV_NIM_NUMBER_OF_DEVICES))){		/* Invalid Device Number ?	*/
		return( DRV_NIM_INVALID_PARAMETER );					/* Invalid Parameter		*/
	}
	if(!((0<=Type)&&(Type<DRV_NIM_CALLBACK_TYPE_NUM))){		/* Invalid Vallback Type ?	*/
		return( DRV_NIM_INVALID_PARAMETER );					/* Invalid Parameter		*/
	}
	if(Callback==NULL){											/* Pointer is NULL ? 		*/
		return( DRV_NIM_INVALID_PARAMETER );					/* Invalid Parameter 		*/
	}
#endif

	if( MMAC_RTOS_AcquireSemaphore( DRV_NIM_CallbackTableSemaphore
							, MMAC_RTOS_SUSPEND ) != MMAC_RTOS_OK ) {	/* Take Semaphore for Callback Table NG ? */
		return( DRV_NIM_FAIL );									/* Fail */
	}

	for( i = 0 ; i < DRV_NIM_MAX_CALLBACKS ; i++ ) {			/* Loop Number of Callback Functions */
		if( DRV_NIM_CallbackTable[i].Function == NULL ) {		/* Callback Function Not Installed ? */
			DRV_NIM_CallbackTable[i].Device = Device;			/* Store Callback Table */
			DRV_NIM_CallbackTable[i].Type = CallbackType;
			DRV_NIM_CallbackTable[i].DeleteFlag = FALSE;
			DRV_NIM_CallbackTable[i].Function = Callback;

			if( MMAC_RTOS_ReleaseSemaphore( DRV_NIM_CallbackTableSemaphore ) != MMAC_RTOS_OK ) {
																/* Free Semaphore for Callback Table */
				return( DRV_NIM_FAIL );							/* Fail */
			}

			DRV_NIM_CallbackExistence=NIM_CALLBACK_TABLE_EXIST;		/* callback table exist		*/
			return( DRV_NIM_OK );	/* Ok */
		}
	}

	if( MMAC_RTOS_ReleaseSemaphore( DRV_NIM_CallbackTableSemaphore ) != MMAC_RTOS_OK ) {
																/* Free Semaphore for Callback Table */
		return( DRV_NIM_FAIL );									/* Fail */
	}

	return( DRV_NIM_CALLBACK_TABLE_NOT_ENOUGH );				/* Callback Table Not Enough */

}


/*****************************************************************
*
* Function Name
*	DRV_NIM_UninstallCallback
*
* Prototype
*	DRV_NIM_RESULT  DRV_NIM_UninstallCallback(
*			int  Device,
*			void  ( *Callback )( int  Device ) );
*
* Inputs
*	Device		:	NIM Device Number
*	Callback	:	Pointer to Callback Function
*
* Outputs
*	None
*
* Return Codes
*	DRV_NIM_OK
*	DRV_NIM_NOT_INITIALIZED
*	DRV_NIM_INVALID_PARAMETER
*	DRV_NIM_FAIL
*
* Description
*	Uninstall Callback Function
*
*****************************************************************/

DRV_NIM_RESULT  DRV_NIM_UninstallCallback(I32 Device,void (*Callback)(I32  Device))
{
	int  i, j;													/* Loop Counter */

	if( !DRV_NIM_Initialized ) {								/* Not Initialized ? */
		return( DRV_NIM_NOT_INITIALIZED );						/* Not Initialized */
	}

#if DRV_NIM_CHECK_PARAMETER
	if(!((0<=Device)&&(Device<DRV_NIM_NUMBER_OF_DEVICES))){		/* Invalid Device Number ?	*/
		return( DRV_NIM_INVALID_PARAMETER );					/* Invalid Parameter 		*/
	}
	if(Callback==NULL){											/* Pointer is NULL ? */
		return( DRV_NIM_INVALID_PARAMETER );					/* Invalid Parameter */
	}
#endif

	if( MMAC_RTOS_AcquireSemaphore( DRV_NIM_CallbackTableSemaphore
							, MMAC_RTOS_SUSPEND ) != MMAC_RTOS_OK ) {	/* Take Semaphore for Callback Table NG ? */
		return( DRV_NIM_FAIL );									/* Fail */
	}

	for( i = 0 ; i < DRV_NIM_MAX_CALLBACKS ; i++ ) {			/* Loop Number of Callback Functions */
		if( ( DRV_NIM_CallbackTable[i].Device == Device ) && ( DRV_NIM_CallbackTable[i].Function == Callback ) ) {
																/* Callback Function Match ? */
			if( !DRV_NIM_CallbackActive ) {						/* Callback Function Inactive ? */
				for( j = i + 1 ; j < DRV_NIM_MAX_CALLBACKS ; j++ ) {
																/* Loop from Next Entry to End of Table */
					DRV_NIM_CallbackTable[j-1] = DRV_NIM_CallbackTable[j];
																/* Slide Callback Table Element */
				}
				/* Clear Last Callback Table */
				DRV_NIM_CallbackTable[DRV_NIM_MAX_CALLBACKS-1].Device = -1;
				DRV_NIM_CallbackTable[DRV_NIM_MAX_CALLBACKS-1].Type = DRV_NIM_CALLBACK_TYPE_INIT;
				DRV_NIM_CallbackTable[DRV_NIM_MAX_CALLBACKS-1].DeleteFlag = FALSE;
				DRV_NIM_CallbackTable[DRV_NIM_MAX_CALLBACKS-1].Function = NULL;
			}
			else {												/* Callback Function Active ? */
				DRV_NIM_CallbackTable[i].DeleteFlag = TRUE;		/* Set Delete Flag */
			}
			break;												/* Exit Loop */
		}
	}

	/* Callback is not registered? */
	if(DRV_NIM_CallbackTable[0].Function == NULL){
		DRV_NIM_CallbackExistence=NIM_CALLBACK_TABLE_NOTHING;		/* callback table nothing	*/

	}

	if( MMAC_RTOS_ReleaseSemaphore( DRV_NIM_CallbackTableSemaphore ) != MMAC_RTOS_OK ) {
																/* Free Semaphore for Callback Table */
		return( DRV_NIM_FAIL );								/* Fail */
	}

	return( DRV_NIM_OK );										/* Ok */
}


/*****************************************************************
*
* Function Name
*	DRV_NIM_CallbackTask
*
* Prototype
*	static void  DRV_NIM_CallbackTask(
*		UI32  argc,
*		void  *argv );
*
* Inputs
*	argc	:	Argument Count
*	argv	:	Argument Value
*
* Outputs
*	None
*
* Return Codes
*	None
*
* Description
*	Callback Function Dispatch Task
*	This Function Can Use Only in NIM Driver.
*
*****************************************************************/

static void  DRV_NIM_CallbackTask( UI32  argc, void  *argv )
{
/*	UI32  Message, ActualSize;	*/		/* Message, Actual Size Buffer	*/
	UI32  Message;						/* Message Size Buffer	*/
	DRV_NIM_CALLBACK_TYPE  Type;								/* Callback Type */
	int  Device;												/* Device Number */
	void  ( *Function )(I32 Device);							/* Callback Function */
	int  i, j;													/* Loop Counter */

	for( ; ; ) {												/* Eternal Loop */

		while( MMAC_RTOS_ReceiveMessageQueue( DRV_NIM_CallbackQueue
				, MMAC_RTOS_MSG_QUEUE_BLOCKING, &Message ) != MMAC_RTOS_OK ) {
																/* Receive from Callback Dispatch Queue */
		}														/* Loop while NG */
		if( DRV_NIM_Initialized ) {							/* Driver Initialized ? */

			while( MMAC_RTOS_AcquireSemaphore( DRV_NIM_CallbackTableSemaphore
									, MMAC_RTOS_SUSPEND ) != MMAC_RTOS_OK ) {	/* Take Semaphore for Callback Table NG ? */
			}

			DRV_NIM_CallbackActive = TRUE;						/* Set Callback Active Flag */

			Type = (DRV_NIM_CALLBACK_TYPE)Message;				/* Get Callback Type */

			for( i = 0 ; i < DRV_NIM_MAX_CALLBACKS ; i++ ) {	/* Loop Number of Callback Functions */
				if( DRV_NIM_CallbackTable[i].Function != NULL ) {
																/* Callback Function Installed ? */
					if( !DRV_NIM_CallbackTable[i].DeleteFlag ) {
																/* Callback Function Not Deleted ? */
						if( DRV_NIM_CallbackTable[i].Type == Type ) {
																/* Callback Function Type Is Match ? */
																/* Get Device Number & Callback Function Pointer */
							Device = DRV_NIM_CallbackTable[i].Device;
							Function = DRV_NIM_CallbackTable[i].Function;

							MMAC_RTOS_ReleaseSemaphore( DRV_NIM_CallbackTableSemaphore );
																/* Free Semaphore for Callback Table */

							Function( Device );					/* Execute Callback Function */

							while( MMAC_RTOS_AcquireSemaphore( DRV_NIM_CallbackTableSemaphore
													, MMAC_RTOS_SUSPEND ) != MMAC_RTOS_OK ) {	/* Take Semaphore for Callback Table NG ? */
							}
						}
					}
				}
			}

			for( i = 0 ; i < DRV_NIM_MAX_CALLBACKS ; i++ ) {	/* Loop Number of Callback Functions */
				if( DRV_NIM_CallbackTable[i].DeleteFlag ) {		/* Callback Function Deleted ? */
					for( j = i + 1 ; j < DRV_NIM_MAX_CALLBACKS ; j++ ) {
																/* Loop from Next Entry to End of Table */
						DRV_NIM_CallbackTable[j-1] = DRV_NIM_CallbackTable[j];
																/* Slide Callback Table Element */
					}

																/* Clear Last Callback Table */
					DRV_NIM_CallbackTable[DRV_NIM_MAX_CALLBACKS-1].Device = -1;
					DRV_NIM_CallbackTable[DRV_NIM_MAX_CALLBACKS-1].Type = DRV_NIM_CALLBACK_TYPE_INIT;
					DRV_NIM_CallbackTable[DRV_NIM_MAX_CALLBACKS-1].Function = NULL;
					DRV_NIM_CallbackTable[DRV_NIM_MAX_CALLBACKS-1].DeleteFlag = FALSE;
				}
			}

			DRV_NIM_CallbackActive = FALSE;						/* Clear Callback Active Flag */

			MMAC_RTOS_ReleaseSemaphore( DRV_NIM_CallbackTableSemaphore );
																/* Free Semaphore for Callback Table */
		}
	}
}


/*****************************************************************
*
* Function Name
*	DRV_NIM_LockScanTask
*
* Prototype
*	static void  DRV_NIM_LockScanTask(
*		UI32  argc,
*		void  *argv );
*
* Inputs
*	argc	:	Argument Count
*	argv	:	Argument Value
*
* Outputs
*	None
*
* Return Codes
*	None
*
* Description
*	NIM Lock Scan Task
*	This Function Can Use Only in NIM Driver.
*
*****************************************************************/
static void  DRV_NIM_LockScanTask( UI32  argc, void  *argv )
{
	
	UI32  Message;				/* Message Buffer */
	UI32  ReceiveEventFlag;		/* Event flag receive buffer	*/




	BOOL		ChangeSw;

	for( ; ; ) {												/* Eternal Loop */

		while( MMAC_RTOS_EventRetrieve(
			DRV_NIM_EventGroup,			/* Event Group control block	*/
			MMAC_RTOS_SUSPEND,			/* SUSPEND						*/
			NIM_LOCKSCAN_EVENT,			/* Event Flag					*/
			&ReceiveEventFlag,			/* Receive Event Flag			*/
			MMAC_RTOS_EVENT_OP_AND		/* only bit event				*/
			) != MMAC_RTOS_OK ) {
										/* Receive from Callback Dispatch Queue */
		}								/* Loop while NG */

		if( DRV_NIM_Initialized ){								/* Driver Initialized ? */

			MMAC_RTOS_AcquireSemaphore( DRV_NIM_Semaphore, MMAC_RTOS_SUSPEND );	/* Take Semaphore for Callback Table NG ? */

			ChangeSw=DRV_NIM_QPSK_StatusCheck();

			MMAC_RTOS_ReleaseSemaphore( DRV_NIM_Semaphore );

			if((FALSE==ChangeSw)&&(DRV_NIM_CallbackExistence==NIM_CALLBACK_TABLE_EXIST)){
				Message = (UI32)DRV_NIM_CHANGE_NIM_STATUS;	/* Dispatch Lock Status Scan Callback */
				MMAC_RTOS_SendMessageQueue( DRV_NIM_CallbackQueue, MMAC_RTOS_MSG_QUEUE_BLOCKING, &Message, MMAC_FALSE );
			}
		}
	}
}


/*****************************************************************
*
* Function Name
*	DRV_NIM_LockScanTimeoutRoutine
*
* Prototype
*	static void DRV_NIM_LockScanTimeoutRoutine(UI32  argc)
*
* Inputs
*	argc	:	Argument Count
*	argv	:	Argument Value
*
* Outputs
*	None
*
* Return Codes
*	None
*
* Description
* 	Lock Scan Timeout Routine   <<< HISR >>>
*
*****************************************************************/
static void DRV_NIM_LockScanTimeoutRoutine(UI32  argc)
{

	MMAC_RTOS_SetEvent(
		DRV_NIM_EventGroup,			/* Event Group control block	*/
		NIM_LOCKSCAN_EVENT,			/* Event Flag					*/
		MMAC_RTOS_EVENT_OP_OR);		/* OR							*/

}


⌨️ 快捷键说明

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