📄 spi_api.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 + -