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

📄 drv_nim.c

📁 tunner驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************
*
* FILENAME
*	DRV_NIM.c
*
* PURPOSE 
*	EMMA2L Reference Model NIM Driver
*
* AUTHOR
*	Kenji.Matsuura
*
* DATE/UPDATE
*	09/04/2002
*   29/08/2002
*
* HISTORY 
*
*
*****************************************************************/

#include <stdio.h>
#include <string.h>

#include "COM.h"
#include "DRV_Internal.h"

#include "mmac/rtos.h"

#include "DRV_NIM.h"
#include "DRV_NIM_QPSK_Internal.h"
#include "DRV_NIM_TUNER_Internal.h"
#include "DRV_GPIO.h"



/****************************************************************
*	Define Values
****************************************************************/
#define		NIM_TIMER_TICK			(500)			/* tick 200ms (200)	*/

#define		NIM_LOCKSCAN_EVENT		0x00000002		/* lockscan event flag		*/


/****************************************************************
*	Define Variable Types
****************************************************************/
typedef struct {							/* Callback Table				*/
	int  Device;							/* NIM Device Number			*/
	DRV_NIM_CALLBACK_TYPE  Type;			/* Type of Callback Function 	*/
	void  (*Function )(I32  Device);		/* Callback Function			*/
	BOOL  DeleteFlag;						/* Delete Flag					*/
}DRV_NIM_CALLBACK_TABLE_ELEM;


/*****************************************************************
		Global Variables
*****************************************************************/
BOOL	DRV_NIM_Initialized = FALSE;				/* NIM Driver Initialized Flag	*/
UI8		DRV_NIM_CallbackExistence;					/* Callback Table Registration presence	*/

UI8		DRV_NIM_FreqSweepControl;							/* Frequency Sweep Stop Enable	*/
UI8		DRV_NIM_FreqSweepStatus;							/* Frequency Sweep Status Run	*/
UI8		DRV_NIM_FreqAmendmentControl;						/* Frequency Amendment Control	*/
UI8		DRV_NIM_FreqAmendmentStatus;						/* Frequency Amendment Status Run	*/


MMAC_RTOS_SEMAPHORE DRV_NIM_CallbackTableSemaphore;	/* Semaphore for Callback Table		*/

MMAC_RTOS_SEMAPHORE DRV_NIM_Semaphore;						/* Semaphore for NIM Program		*/

MMAC_RTOS_TIMER_ID DRV_NIM_NimScanTimer;								/* Assume timer control block 		*/

MMAC_RTOS_MSG_QUEUE DRV_NIM_CallbackQueue;			/* Callback Function Dispatch Queue Pointer */

MMAC_RTOS_EVENT DRV_NIM_EventGroup;					/* LockScan Function Dispatch Queue Pointer */

/****************************************************************
*	Static Valiables
****************************************************************/
static DRV_NIM_CALLBACK_TABLE_ELEM 
			DRV_NIM_CallbackTable[DRV_NIM_MAX_CALLBACKS];		/* Callback Function Table			*/

static BOOL DRV_NIM_CallbackActive;								/* Callback Function Active Flag	*/


static UI32 DRV_NIM_CallbackTaskStack
			 [DRV_NIM_CALLBACK_TASK_STACK_SIZE/sizeof(UI32)];	/* Callback Function Task Stack Area */
static UI32 DRV_NIM_LockScanTaskStack
			 [DRV_NIM_LOCKSCAN_TASK_STACK_SIZE/sizeof(UI32)];	/* LockScan Function Task Stack Area	*/


static BOOL  DRV_NIM_CallbackTaskCreated = FALSE;				/* Callback Function Task Created Flag	*/
static BOOL  DRV_NIM_LockScanTaskCreated = FALSE;				/* LockScan Function Task Created Flag	*/




/****************************************************************
*	FORWARD DECLARATIONS
****************************************************************/
static void  DRV_NIM_CallbackTask( UI32  argc, void  *argv );
static void  DRV_NIM_LockScanTask( UI32  argc, void  *argv );
static void  DRV_NIM_LockScanTimeoutRoutine(UI32  argc);





/*****************************************************************
*
* Function Name
*	DRV_NIM_Initialize
*
* Prototype
*	DRV_NIM_RESULT DRV_NIM_Initialize( void );
*
* Inputs
*	None
*
* Outputs
*	None
*
* Return Codes
*	DRV_NIM_OK
*	DRV_NIM_ALREADY_INITIALIZED
*	DRV_NIM_FAIL
*
* Description
*	Initialize Function
*
*****************************************************************/

DRV_NIM_RESULT  DRV_NIM_Initialize( void  )
{

	UI8					PinNumber;
	DRV_GPIO_CONFIG		PinConfig;
	UI32	i;

	MMAC_RTOS_TIMER_CNTRL	iopb;
	MMAC_RTOS_TASK_ID	tid;



	if( DRV_NIM_Initialized ) {									/* Already Initialized ?*/
		return( DRV_NIM_ALREADY_INITIALIZED );					/* Already Initialized	*/
	}

	/*******************/
	/* NIM(TUNER)RESET */
	/*******************/
	PinNumber = 52;
	PinConfig.Direction		=DRV_GPIO_DIRECTION_OUTPUT;
	PinConfig.InterruptMode	=DRV_GPIO_INT_DISABLED;
	PinConfig.Callback		=NULL;
	if((DRV_GPIO_Configure(PinNumber,&PinConfig))!=DRV_GPIO_OK){
		return( DRV_NIM_FAIL );
	}
	if((DRV_GPIO_SetBit(DRV_GPIO_PIN_SET,52))!=DRV_GPIO_OK){
		return( DRV_NIM_FAIL );
	}
	for(i=0;i<0xFFFFFF;i++){};	/* Delay */
	if((DRV_GPIO_SetBit(DRV_GPIO_PIN_CLR,52))!=DRV_GPIO_OK){
		return( DRV_NIM_FAIL );
	}
	for(i=0;i<0xFFFFFF;i++){};	/* Delay */
	if((DRV_GPIO_SetBit(DRV_GPIO_PIN_SET,52))!=DRV_GPIO_OK){
		return( DRV_NIM_FAIL );
	}



	for( i = 0 ; i < DRV_NIM_MAX_CALLBACKS ; i++ ) {			/* Loop Number of Callback Functions */
		DRV_NIM_CallbackTable[i].Device = -1;					/* Initialize Callback Table */
		DRV_NIM_CallbackTable[i].Type = DRV_NIM_CALLBACK_TYPE_INIT;
		DRV_NIM_CallbackTable[i].DeleteFlag = FALSE;
		DRV_NIM_CallbackTable[i].Function = NULL;
	}

	/************************************************/
	/*			NIM Callback Task Create			*/
	/************************************************/
	DRV_NIM_CallbackActive = FALSE;								/* Clear Callback Active Flag */

	if( !DRV_NIM_CallbackTaskCreated ) {						/* Callback Function Dispatch Task Not Created ? */

		if( MMAC_RTOS_CreateSemaphore(								/* Create Semaphore for Callback Table */
			"NIM_CBD", 1, &DRV_NIM_CallbackTableSemaphore ) != MMAC_RTOS_OK ) {
																/* NG ? */
			return( DRV_NIM_FAIL );							/* Fail */
		}

		if( MMAC_RTOS_CreateMessageQueue( "NIM_CBQ",			/* Create Queue for Callback Function Dispatch */
				DRV_NIM_CALLBACK_QUEUE_SIZE, 1, 
				&DRV_NIM_CallbackQueue ) != MMAC_RTOS_OK ) {
																/* NG ? */
			return( DRV_NIM_FAIL );							/* Fail */
		}

		if( MMAC_RTOS_TaskCreate(										/* Create Callback Function Dispatch Task */
				(MMAC_RTOS_TASK_ENTRY)(UI32)DRV_NIM_CallbackTask, (MMAC_RTOS_TASK_ARG)0,
				DRV_NIM_CallbackTaskStack, DRV_NIM_CALLBACK_TASK_STACK_SIZE,
				DRV_NIM_CALLBACK_TASK_PRIORITY, &tid, MMAC_FALSE ) != MMAC_RTOS_OK ) {
			return( DRV_NIM_FAIL );							/* Fail */
		}

		if(MMAC_RTOS_TaskStart(tid) != MMAC_RTOS_OK)
			return( DRV_NIM_FAIL );							/* Fail */

		DRV_NIM_CallbackTaskCreated = TRUE;			/* Set Callback Function Dispatch Task Created Flag */

	}
	else {														/* Callback Function Dispatch Task Created ? */
		if( MMAC_RTOS_ReleaseSemaphore( DRV_NIM_CallbackTableSemaphore ) != MMAC_RTOS_OK ) {
																/* Free Semaphore for Callback Table */
			return( DRV_NIM_FAIL );								/* Fail */
		}
	}


	/************************************************/
	/*			NIM Lock Scan Task Create			*/
	/************************************************/
	if( !DRV_NIM_LockScanTaskCreated ) {			/* NIM Lock Scan Event Task Not Created ?	*/

		if( MMAC_RTOS_CreateSemaphore(								/* Create Semaphore for Callback Table */
			"NIM_SEM", 1, &DRV_NIM_Semaphore ) != MMAC_RTOS_OK ) {
																/* NG ? */
			return( DRV_NIM_FAIL );							/* Fail */
		}

		if( MMAC_RTOS_EventCreate(
			&DRV_NIM_EventGroup			/* Event group control block pointer */
			) != MMAC_RTOS_OK ){
			return( DRV_NIM_FAIL );		/* Fail */
		}

		if( MMAC_RTOS_TaskCreate(										/* Create Callback Function Dispatch Task */
				(MMAC_RTOS_TASK_ENTRY)(UI32)DRV_NIM_LockScanTask, (MMAC_RTOS_TASK_ARG)0,
				DRV_NIM_LockScanTaskStack, DRV_NIM_LOCKSCAN_TASK_STACK_SIZE,
				DRV_NIM_LOCKSCAN_TASK_PRIORITY, &tid, MMAC_FALSE ) != MMAC_RTOS_OK ) {
			return( DRV_NIM_FAIL );							/* Fail */
		}

		if(MMAC_RTOS_TaskStart(tid) != MMAC_RTOS_OK)
			return( DRV_NIM_FAIL );							/* Fail */

		DRV_NIM_LockScanTaskCreated = TRUE;		/* Set NIM Lock Scan Task Created Flag */

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

	/* Initialize value	*/
	DRV_NIM_FreqSweepControl	= QPSK_ENABLE;		/* Frequency Sweep Stop Enable	*/
	DRV_NIM_FreqSweepStatus		= QPSK_SW_ON;		/* Frequency Sweep Status Run	*/
	DRV_NIM_FreqAmendmentControl= TUNER_ENABLE;		/* Frequency Amendment Control	*/
	DRV_NIM_FreqAmendmentStatus	= TUNER_SW_ON;		/* Frequency Amendment Status Run	*/
	DRV_NIM_CallbackExistence=NIM_CALLBACK_TABLE_NOTHING;		/* callback table nothing	*/

	/************************************************/
	/*			NIM(TUNER) INITIALIZE				*/
	/************************************************/
	if(DRV_NIM_OK != DRV_NIM_Reset()){
		return( DRV_NIM_FAIL );
	}


	/************************************************/
	/*			NIM Lock Scan Timer Create			*/
	/************************************************/

	if( MMAC_RTOS_TimerCreate(										/* Create Scan Key Status Timer */
			"NIM_STM", DRV_NIM_LockScanTimeoutRoutine, 0,
			NIM_TIMER_TICK/COM_TimerTickPeriod, MMAC_RTOS_TIMER_CONTINUOUS,
			&DRV_NIM_NimScanTimer ) != MMAC_RTOS_OK ) {
																/* NG ? */
		return( DRV_NIM_FAIL );								/* Fail */
	}
	iopb.operation = MMAC_RTOS_TIMER_SET;
	iopb.state = MMAC_RTOS_TIMER_ENABLE;
	if( MMAC_RTOS_TimerCntrl( DRV_NIM_NimScanTimer
						, &iopb ) != MMAC_RTOS_OK ) {	/* Disable Scan Key Status Timer NG ? */
		return( DRV_NIM_FAIL );								/* Fail */
	}

	DRV_NIM_Initialized	= TRUE;				/* Set Initialized Flag 		*/
	return( DRV_NIM_OK );

}


/*****************************************************************
*
* Function Name
*	DRV_NIM_Finalize
*
* Prototype
*	DRV_NIM_RESULT DRV_NIM_Finalize( void );
*
* Inputs
*	None
*
* Outputs
*	None
*
* Return Codes
*	DRV_NIM_OK
*	DRV_NIM_NOT_INITIALIZED
*	DRV_NIM_FAIL
*
* Description
*	Finalize Function
*
*****************************************************************/
DRV_NIM_RESULT  DRV_NIM_Finalize( void  )
{
	UI32	i;

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

	for( i = 0 ; i < DRV_NIM_MAX_CALLBACKS ; i++ ) {			/* Loop Number of Callback Functions	*/
		DRV_NIM_CallbackTable[i].Device = -1;					/* Initialize Callback Table 			*/
		DRV_NIM_CallbackTable[i].Type = DRV_NIM_CALLBACK_TYPE_INIT;
		DRV_NIM_CallbackTable[i].DeleteFlag = FALSE;
		DRV_NIM_CallbackTable[i].Function = NULL;
	}

	DRV_NIM_Initialized = FALSE;								/* Clear Initialized Flag */

	return( DRV_NIM_OK );
}


/*****************************************************************
*
* Function Name
*	DRV_NIM_InstallCallback
*
* Prototype
*	DRV_NIM_RESULT  DRV_NIM_InstallCallback(
*					I32		Device,
*					DRV_NIM_CALLBACK_TYPE CallbackType,
*					void ( *Callback )(I32  Device ))
*
* Inputs
*	Device 			: NIM Device Number
*	CallbackType	: Callback Type
*	Callback		: Pointer to callback function
*

⌨️ 快捷键说明

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