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

📄 spi_api.c

📁 SAMSUNG 5009的源代码
💻 C
字号:
/******************************************************************************
 * File name  : Spi_api.c
 * Start date : 2003. 5. 13
 * By         : Taejin Kwon
 * Contact    : eric.kwon@samsung.com
 * Description: SPI api for external serial device
 * 
 *****************************************************************************/
   
 
/******************************************************************************
 *   INCLUDES                                                                 *
 ******************************************************************************/
#include "Basic_typedefs.h"
#include "CUSTOM/Custom_option.h"
#include "OS/OS_abstract.h"
#include "API/SH_types.h"
#include "API/SH_api.h"
#include "API/SH_reg.h"

#include "CUSTOM/Fp_data.h"
#include "CUSTOM/Spi_api.h"

#include "CUSTOM/Gpio_api.h"
#include "CUSTOM/Key_defs.h"
/* <<<@: 5008CHN-XXX.Rainbow 050912:FP_PANEL:Dynamic scan the VFD_DOT Message*/
#if _APP_CAP_PERI_VFD
#ifdef _SUPPORT_DYNAMIC_SCAN_VFDDOT
extern unsigned char VfdMode;
extern VOID DvdShowSetupInfoToVfd(VOID);
extern VOID SvcdShowSetupInfoToVfd(VOID);
extern VOID MmpShowSetupInfoToVfd(VOID);
#endif//_SUPPORT_DYNAMIC_SCAN_VFDDOT
#endif//_APP_CAP_PERI_VFD
/* >>>@: 5008CHN-XXX.Rainbow 050912:FP_PANEL:Dynamic scan the VFD_DOT Message*/

#define UPD16311_CLOCK_DELAY  50
#define UPD16311_TW_CLOCK_DELAY 50


#define WRITE_AUTO_DISPLAY_COMMAND		0x40
#define WRITE_FIXED_DISPLAY_COMMAND		0x44
#define WRITE_LED_PORT_COMMAND			0x41
#define READ_KEY_DATA_COMMAND			0x42
#define READ_SW_DATA_COMMAND			0x43

#define SetStb()				SetP31()
#define SetClk()				SetP33()
#define SetData()				SetP32()

#define ClearStb()				ClrP31()
#define ClearClk()				ClrP33()
#define ClearData()			ClrP32()

#define GetData()				GetP32()

extern unsigned short gridarray[NUM_SEGMENT][14];
extern unsigned short uiLedMaskArray[];
extern unsigned char FpKeyArray[];

VOID myKeyMsgSender(unsigned char ucdata,unsigned short usparam );
extern VOID UpDateIcon(void);
/******************************************************************************
 *  Global Defines
 ******************************************************************************/

SysTimer_t	gTimer_KEY_SCAN;
SysSema_t	gVfd_RWSema;

#define 		TIMER_VALUE_FOR_KEY_SCAN	20


unsigned char FpBuf[FP_MAX_BUF];
unsigned char FpBufBak[FP_MAX_BUF];
unsigned char FpKeyBuf[KB_KEYSIZE];
unsigned char FpBackupBuf[FP_MAX_BUF];


unsigned char const Led_Array[]={
//number
	VALUE0,VALUE1,VALUE2,VALUE3,VALUE4,
	VALUE5,VALUE6,VALUE7,VALUE8,VALUE9,
//character
	CHAR_A,CHAR_B,CHAR_C,CHAR_D,CHAR_E,CHAR_F,
	CHAR_G,CHAR_H,CHAR_I,CHAR_J,CHAR_K,CHAR_L,
	CHAR_M,CHAR_N,CHAR_O,CHAR_P,CHAR_Q,CHAR_R,
	CHAR_S,CHAR_T,CHAR_U,CHAR_V,CHAR_W,CHAR_X,
	CHAR_Y,CHAR_Z,
	CHAR_SPACE
};

VOID FP_Delay(unsigned int i)
{
	for(;i>0;i--);
}

unsigned char ReceiveByte()
{
	unsigned char i,value=0;
#ifndef _ADM_DEBUG/*rainbow.zhang 050826:support vfd*/
	SetClk();
	SetData();
	for(i=0;i<8;i++)
{
		ClearClk();
		FP_Delay(UPD16311_TW_CLOCK_DELAY);
		SetClk();
		FP_Delay(UPD16311_TW_CLOCK_DELAY);
		value<<=1;
		if(GetData())	value++;
	}
#endif
	return value;
}
	
VOID SendByte(unsigned char uctemp)
	{
#ifndef _ADM_DEBUG/*rainbow.zhang 050826:support vfd*/
	unsigned char i;
	FP_Delay(UPD16311_TW_CLOCK_DELAY);
		
	for (i = 0; i < 8; i++)
		{
		ClearClk();
		FP_Delay(UPD16311_TW_CLOCK_DELAY);
		
		if(uctemp & 0x01)
			SetData();
		else 
			ClearData();

		FP_Delay(UPD16311_TW_CLOCK_DELAY);
		SetClk();
		uctemp >>= 1;
		FP_Delay(UPD16311_TW_CLOCK_DELAY);
	}
	FP_Delay(UPD16311_TW_CLOCK_DELAY);
#endif
}

VOID SendCmd(unsigned char Cmd)
{
#ifndef _ADM_DEBUG/*rainbow.zhang 050826:support vfd*/
	ClearStb();
	SendByte(Cmd);
	SetStb();
	FP_Delay(UPD16311_TW_CLOCK_DELAY);
#endif
}


//Updating display memory by incrementing address
VOID WriteSegmentData(unsigned char grid, unsigned char* segmentData, unsigned char size)
{
#ifndef _ADM_DEBUG/*rainbow.zhang 050826:support vfd*/
	unsigned char controlCode = 0xC0 | grid;
	unsigned char i;
//command 1
	SendCmd(DISPLAYMODE);
//command 2
	SendCmd(WRITE_AUTO_DISPLAY_COMMAND);
	ClearStb();
//command 3
	SendByte(controlCode);
//data 0..size-1
	for (i = 0; i < size; i++)
	{    	
		SendByte(segmentData[i]);
	}

	SetStb();
//command 4
	SendCmd(CONTROLDISPLAY);
#endif
}
			
				
VOID ReadKeyData(unsigned char* scanData,unsigned char size)
{
#ifndef _ADM_DEBUG/*rainbow.zhang 050826:support vfd*/
	unsigned char i;
	ClearStb();
	SendByte(READ_KEY_DATA_COMMAND);
	for (i = 0; i < size; i++)
	{
		scanData[i] = ReceiveByte();
			}
	SetStb();
#endif
	}

VOID FPDisplayIcon(unsigned int icondata,unsigned char bLight)
	{    	
	unsigned char dsp_grid;
	unsigned char dsp_segment;

	dsp_grid = (icondata)>>8;
	if (dsp_grid > FP_MAX_BUF)
			{
		return;
	}
	dsp_segment = icondata & 0x00FF;

	if(SysGetSema(&gVfd_RWSema,SYS_NO_WAIT, NULL ) == SYS_RETURN_SUCCESS ){
		if(bLight)
			FpBuf[dsp_grid] |= dsp_segment;
		else
			FpBuf[dsp_grid] &=  (~dsp_segment);
		SysReleaseSema(&gVfd_RWSema, NULL);
	}
}
			
				
VOID FPOutChar(unsigned char addr,char ucchar)
			{
	const unsigned char pos_array[NUM_SEGMENT] ={
/*rainbow.zhang 050830:support vfd*/
		0x07,0x05,0x02,0x03,0x00,0x01
/*rainbow.zhang 050830:support vfd*/
	};
	unsigned char grid_pos = pos_array[addr];
	unsigned char uctemp;

	if(ucchar>='0'&&ucchar<='9')
		uctemp = Led_Array[ucchar-'0'];
	else if(ucchar>='A'&&ucchar<='Z')
		uctemp = Led_Array[ucchar-'A'+10];
	else if(ucchar>='a'&&ucchar<='z')
		uctemp = Led_Array[ucchar-'a'+10];
	else{
		switch(ucchar){
			case '-':
				uctemp = CHAR_DOT;
					break;
				default:
				uctemp = 0;
					break;
			}
	}
//error,we will do nothing.
	if(addr>=NUM_SEGMENT)
		return;
	if(SysGetSema(&gVfd_RWSema,SYS_NO_WAIT, NULL ) == SYS_RETURN_SUCCESS ){
/*rainbow.zhang 050830:support vfd*/
		FpBuf[grid_pos] &= 0x80;
		FpBuf[grid_pos] |= (uctemp&0x7F);
/*rainbow.zhang 050830:support vfd*/
		SysReleaseSema(&gVfd_RWSema, NULL);
	}
}


VOID FPClearFp()
{
	unsigned char i;
	if(SysGetSema(&gVfd_RWSema,SYS_NO_WAIT, NULL ) == SYS_RETURN_SUCCESS )
	{
		for(i=0;i<FP_MAX_BUF;i++){
			FpBuf[i] = 0x0;
			FpBufBak[i] = 0xff;
		}
		SysReleaseSema(&gVfd_RWSema, NULL);
	}
}

		
VOID FPOutString(unsigned char addr,char *str)
		{
	while(addr<NUM_SEGMENT){
		if(*str)
			FPOutChar(addr,*str);
		else
			break;
		addr++;
		str++;
		}
		}

VOID FpClearStr()
		{	
	unsigned char i;
	for(i=0;i<NUM_SEGMENT;i++){
		FPOutChar(i,' ');
		}
}

/*rainbow.zhang 050826:support vfd*/
#if _APP_CAP_PERI_VFD
VOID SaveFp()
{
	unsigned char i;
	if(SysGetSema(&gVfd_RWSema,SYS_NO_WAIT, NULL ) == SYS_RETURN_SUCCESS )
	{
		for(i=0;i<FP_MAX_BUF;i++){
			FpBackupBuf[i] = FpBuf[i];
		}
		SysReleaseSema(&gVfd_RWSema, NULL);
	}
}

VOID RestoreFp()
{
	unsigned char i;
	if(SysGetSema(&gVfd_RWSema,SYS_NO_WAIT, NULL ) == SYS_RETURN_SUCCESS )
	{
		for(i=0;i<FP_MAX_BUF;i++){
			FpBuf[i] = FpBackupBuf[i];
		}
		SysReleaseSema(&gVfd_RWSema, NULL);
	}
}
#else
void SaveFp()
{
}
void RestoreFp()
{
}
#endif /* _APP_CAP_PERI_VFD */

/*rainbow.zhang 050826:support vfd*/
unsigned char FPGetKeyIndex( VOID )
{
	unsigned char i, j,mask;
		
	ReadKeyData(FpKeyBuf,KB_KEYSIZE);
	for (i=0; i<KB_KEYSIZE; i++)
	{
		if(FpKeyBuf[i]){
			mask = 0x01;
			for (j=0; j<8; j++)
			{
				if (FpKeyBuf[i] & mask)
				{
					return ((i<<3)+j)+1;
				}
				mask<<=1;
			}
		}
	}
	return 0;
					}

unsigned char FPGetKey()
{
	static unsigned char OldIndex = 0;
	unsigned char index = FPGetKeyIndex();
	if(OldIndex!=index){
		OldIndex = index;
		if(index){
			SysPrintf("\n FpGet Index = 0x%02X",index);
			if(RC_KEY_XXXX!=FpKeyArray[index])
				myKeyMsgSender(FpKeyArray[index],0);
		}
		return index;
	}
	OldIndex = index;
	return 0;
}



VOID FpMain(UNSIGNED id)
	{
	unsigned char i;
	#ifdef _SUPPORT_DYNAMIC_SCAN_VFDDOT
	S5H_App_t	app_type = S5H_GetAppType();
	#endif//_SUPPORT_DYNAMIC_SCAN_VFDDOT

//adjust the buffer have changed?if not I will return directly.
	for(i=0;i<FP_MAX_BUF;i++){
		if(FpBufBak[i]!=FpBuf[i])
				break;
					}
	UpDateIcon();
	#ifdef _SUPPORT_DYNAMIC_SCAN_VFDDOT
	if(VfdMode == FP_MAIN_PLAY||VfdMode == FP_MAIN_PAUSE||\
		VfdMode == FP_MAIN_NL_PLAY||VfdMode == FP_MAIN_STANDBY)
	{
		if(app_type == APP_DVD)
			DvdShowSetupInfoToVfd();
		else if(app_type == APP_VCD)
			SvcdShowSetupInfoToVfd();
		else
			MmpShowSetupInfoToVfd();
	}
	#endif//_SUPPORT_DYNAMIC_SCAN_VFDDOT
	if(i>=FP_MAX_BUF){
		FPGetKey();
		return;
				}
	WriteSegmentData(0,FpBuf,FP_MAX_BUF);
	for(i=0;i<FP_MAX_BUF;i++){
		FpBufBak[i]=FpBuf[i];
	}
}

VOID SPI_Init( VOID )
{
	UINT status;

	SysSetTimer( &gTimer_KEY_SCAN, "KEY_T", FpMain, 
				0, TIMER_VALUE_FOR_KEY_SCAN, TIMER_VALUE_FOR_KEY_SCAN, TIMER_ENABLE, 0 );	

	status = SysCreateSema(&gVfd_RWSema, "VfdSEMA", 1, SYS_FIFO, NULL );
	if( status == SYS_RETURN_FAIL )	{
		SysPrintf( "\n Cannot Create semaphore. %s %d", __FILE__, __LINE__ );
	}
	
	SendCmd(DISPLAYMODE);
	SendCmd(CONTROLDISPLAY);
	FPClearFp();
//	WriteSegmentData(0,FpBuf,FP_MAX_BUF);
}

⌨️ 快捷键说明

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