📄 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 "Sys_call_abstract.h"
#include "S5h_common_reg.h"
#include "Select_cap.h"
#include "..\..\api\s5h_capability.h"
#include "Spi_api.h"
#include "Fp_data.h"
#include "Gpio_api.h"
#include "All_Event.h"
#include "vcd_def.h"
#include "mp3_include.h"
//#define display_mode1
//#define Boom_box
#ifdef Boom_box
#include "function.h"
#endif
extern BOOL gTrkSelectEnd_flag ;
extern DspStatus_t OsdGetStatus(void);
/***************************************************************************
* VFD driver
****************************************************************************/
BOOL bEnRefreshVfd = TRUE;
#define SetOutputMode_VFDStb() SetOutputModeGPIO10()
#define SetOutputMode_VFDClk() SetOutputModeGPIO13()
#define SetOutputMode_VFDData() SetOutputModeGPIO11()
#define SetVFDStb() SetPortGPIO10()
#define SetVFDClk() SetPortGPIO13()
#define SetVFDData() SetPortGPIO11()
#define ClearVFDStb() ClrPortGPIO10()
#define ClearVFDClk() ClrPortGPIO13()
#define ClearVFDData() ClrPortGPIO11()
#define SetInputMode_VFDData() SetInputModeGPIO11()
#define GetVFDData() GetPortGPIO11()
#if Test_Mode
extern BOOL flash_lcd;
extern BOOL led_flag;
extern UINT key_value, dot;
#endif
#if VFD16312
#define UPD16311_CLOCK_DELAY 1
#define UPD16311_TW_CLOCK_DELAY 1
#define DISPLAYMODE 0x02
#define WRITE_AUTO_DISPLAY_COMMAND 0x40
#define WRITE_VFD_ADDRESS_MASK 0xc0
#define WRITE_FIXED_DISPLAY_COMMAND 0x44
#define CONTROLDISPLAY 0x8f
#define WRITE_LED_PORT_COMMAND 0x41
#define READ_KEY_DATA_COMMAND 0x42
#define READ_SW_DATA_COMMAND 0x43
#define FP_MAX_BUF 13 //0x10
#define KB_KEYSIZE 3
#define NUM_SEGMENT 6
unsigned char FpKeyBuf[KB_KEYSIZE];
#endif
#if LED1623
#if 0 //1:1623
#define UPD16311_CLOCK_DELAY 1
#define UPD16311_TW_CLOCK_DELAY 1
#define DISPLAYMODE 0x03 //0x02
#define WRITE_AUTO_DISPLAY_COMMAND 0x40 //0x40
#define WRITE_VFD_ADDRESS_MASK 0xc0 //0x80 //0xc0
#define WRITE_FIXED_DISPLAY_COMMAND 0x44 //0x44
#define CONTROLDISPLAY 0x8f//0x8b //0xcb //0x8f
#define WRITE_LED_PORT_COMMAND 0x41
#define READ_KEY_DATA_COMMAND 0x42
#define READ_SW_DATA_COMMAND 0x43
#define CONTROLDISPLAY_OFF 0xc0
#define FP_MAX_BUF 15 //0x10
#define KB_KEYSIZE 1
#define NUM_SEGMENT 10
unsigned char FpKeyBuf[KB_KEYSIZE];
#else //1628
#define UPD16311_CLOCK_DELAY 1
#define UPD16311_TW_CLOCK_DELAY 1
#define DISPLAYMODE 0x03 //0x02
#define WRITE_AUTO_DISPLAY_COMMAND 0x40 //0x40
#define WRITE_VFD_ADDRESS_MASK 0xc0 //0x80 //0xc0
#define WRITE_FIXED_DISPLAY_COMMAND 0x44 //0x44
#define CONTROLDISPLAY 0x8b //0xcb //0x8f
#define WRITE_LED_PORT_COMMAND 0x41
#define READ_KEY_DATA_COMMAND 0x42
#define READ_SW_DATA_COMMAND 0x43
#define CONTROLDISPLAY_OFF 0xc0
#define FP_MAX_BUF 14 //0x10
#define KB_KEYSIZE 2
#define NUM_SEGMENT 10
unsigned char FpKeyBuf[KB_KEYSIZE];
#endif
#endif
#if HT1621
#define LCD_SYS_EN 0x01 /*turn on system oscillator*/
#define LCD_LCD_ON 0x03 /*trun on LCD bias generator*/
#define LCD_RC_256 0x18 /*on-chip RC oscillator*/
#define LCD_IRQ_DIS 0x80 /*disable IRQ output*/
#define LCD_BIAS 0x29 /*4COM & LCD 1/3 bias option */
//#define LCD_BIAS 0x24
#define LCD_CLOCK_DELAY 16
#define FP_MAX_BUF 0x21
#define LCD_COMMAND 0x04 // lcd command mode
#define LCD_WRITE 0x05 // lcd write mode
#define LCD_NORMAL 0xe3 //normal
#define LCD_OFF_TONE 0x08 // turn off tone output
#define DIS_TBT 0x04 //normal
#define DIS_WDT 0x05 // turn off tone output
#endif
#define TIMER_VALUE_FOR_KEY_SCAN 10
unsigned char FpBuf[FP_MAX_BUF];
unsigned char FpBufBak[FP_MAX_BUF];
unsigned char FpBackupBuf[FP_MAX_BUF];
unsigned char FpDateSize;
typedef struct {
unsigned char position;
unsigned char data;
}VFDDateInfor;
unsigned char VFDRefreshPtr;
VFDDateInfor VFDRefreshStack[FP_MAX_BUF];
SysTimer_t gTimer_KEY_SCAN;
SysSema_t gVfd_RWSema;
unsigned char FpKeyArray[];
//extern void IR_Send_Msg(USHORT IR_Key, SINT Para);
extern S5H_FPCALLBACK AttachedKeySendCallback;
extern S5L_DisplayStdType_t gOutput_tv_system;
extern UCHAR gAudio_state;
#if Mp3_Total
extern USHORT gMp3TotalFile;
#endif
char VfdDiscTurnF;
void VFD_state_init(void);
void VFD_state_scan_key_0(void);
void VFD_state_scan_key_1(void);
void VFD_state_scan_key_2(void);
void VFD_state_scan_key_3(void);
void VFD_state_scan_key_4(void);
void VFD_state_refresh_0(void);
void VFD_state_refresh_1(void);
#ifdef display_mode1
void VFD_state_refresh_01_plugin(void);
#endif
void VFD_state_refresh_2(void);
void VFD_state_refresh_3(void);
void VFD_state_refresh_4(void);
void VFD_state_refresh_5(void);
typedef void (*PFV)(void); /* Pointer to func. returning void */
PFV VFD_next_state = VFD_state_init;
/******************************************************************************
* Function Defines
******************************************************************************/
void FP_Delay(unsigned int i)
{
for(;i>0;i--);
}
void FPClearFp()
{
unsigned char i;
if(SysGetSema(&gVfd_RWSema,SYS_NO_WAIT ) == SYS_RETURN_SUCCESS )
{
for(i=0;i<FP_MAX_BUF;i++){
FpBuf[i] = 0;
//FpBufBak[i] = 0;
}
SysReleaseSema(&gVfd_RWSema );
}
}
#if Five_5plus
extern BOOL gFiveplus_flag;
extern UCHAR Fivetimer;
extern void KeyMsgSender(UINT data, void * param);
#endif
#ifdef Boom_box
extern void KeyMsgSender(UINT data, void * param);
extern BOOL bIs_Closed;
extern BOOL Is_close_flag;
extern BOOL First_time;
#endif
void FpMain(UNSIGNED id)
{
VFD_next_state(); //POWL VFD ON/FF if block , off
#if Five_5plus
if(gFiveplus_flag)
{
Fivetimer--;
if(Fivetimer==0)
KeyMsgSender(KEY_NUM0, 0 );
}
#endif
}
void SetVFDTime()
{
SysSetTimer( &gTimer_KEY_SCAN, "KEY_T", FpMain,
0, TIMER_VALUE_FOR_KEY_SCAN, TIMER_VALUE_FOR_KEY_SCAN, TIMER_ENABLE );
}
void FP_Init( void )
{
UINT status;
SetOutputMode_VFDStb();
SetOutputMode_VFDClk();
SetOutputMode_VFDData();
SetVFDStb();
SetVFDClk();
SetVFDData();
SetVFDTime();
#ifdef Boom_box
if(Check_CLOPSW())
{
Is_close_flag=FALSE;
KeyMsgSender(KEY_OPEN_CLOSE, 0 );
}
else
Is_close_flag=TRUE;
First_time = FALSE;
#endif
status = SysCreateSema(&gVfd_RWSema, "VfdSEMA", 1, SYS_FIFO );
#if SPI_DEBUG_PRINT
if( status == SYS_RETURN_FAIL ) {
SysPrintf( "\n Cannot Create semaphore. %s %d", __FILE__, __LINE__ );
}
#endif
FPClearFp();
}
void DeInit_FP(void)
{
VFD_state_init();
SysKillTimer(&gTimer_KEY_SCAN );
SysDeleteSema(&gVfd_RWSema );
}
void vfd_dot(unsigned char method, int vfd_dot)
{
if(method)
FpBuf[(unsigned char)(vfd_dot / 8)] |= (unsigned char)(1 << (vfd_dot % 8));
else
FpBuf[(unsigned char)(vfd_dot / 8)] &= (unsigned char)(~(1 << (vfd_dot % 8)));
}
extern void EI(void);
extern BOOL gOpen_pressed;
void vfd_display_mode(void)
{
if ( gOutput_tv_system == DISPLAY_NTSC_M ){
vfd_dot(VFD_DOT_ON, VFD_DOT_NTSC);
vfd_dot(VFD_DOT_OFF, VFD_DOT_PAL);
}else{
vfd_dot(VFD_DOT_ON, VFD_DOT_PAL);
vfd_dot(VFD_DOT_OFF, VFD_DOT_NTSC);
}
}
void vfd_audio_channel(void)
{
switch(gAudio_state){
case 1:
vfd_dot(VFD_DOT_ON, VFD_DOT_1L);
vfd_dot(VFD_DOT_OFF, VFD_DOT_2R);
break;
case 2:
vfd_dot(VFD_DOT_ON, VFD_DOT_2R);
vfd_dot(VFD_DOT_OFF, VFD_DOT_1L);
break;
default:
vfd_dot(VFD_DOT_ON, VFD_DOT_1L);
vfd_dot(VFD_DOT_ON, VFD_DOT_2R);
break;
}
}
void vfd_pause(void)
{
VfdDiscTurnF = 0;
vfd_dot(VFD_DOT_ON, VFD_DOT_PAUSE);
vfd_dot(VFD_DOT_OFF, VFD_DOT_PLAY);
}
void vfd_play(void)
{
VfdDiscTurnF = 1;
vfd_dot(VFD_DOT_OFF, VFD_DOT_PAUSE);
vfd_dot(VFD_DOT_ON, VFD_DOT_PLAY);
}
#if VFD16312
/********************************************************************
VFD 16312
********************************************************************/
void ShowVFD(OsdMsg_t * vfd_msg)
{
ULONG32 CurrentTime;
CurrentTime = VcdGetCurSec();
switch(vfd_msg->mode){
case DSP_VCD:
vfd_dot(VFD_DOT_ON, VFD_DOT_VCD);
vfd_dot(VFD_DOT_ON, VFD_DOT_CD);
//vfd_readtoc();
VfdDiscTurnF = 0;
break;
case DSP_CDDA:
//vfd_readtoc();
vfd_dot(VFD_DOT_ON, VFD_DOT_CD);
VfdDiscTurnF = 0;
break;
case DSP_PLAY:
vfd_play();
break;
case DSP_PAUSE:
vfd_pause();
VfdDiscTurnF = 0;
break;
case DSP_STOP:
vfd_show_time(gVcdTrackInfo.Total_track_cnt, (gVcdTrackInfo.TrackLBAList[gVcdTrackInfo.Total_track_cnt]-gVcdTrackInfo.TrackLBAList[0])/75);
VfdDiscTurnF = 0;
vfd_dot(VFD_DOT_OFF, VFD_DOT_REP1);
vfd_dot(VFD_DOT_OFF, VFD_DOT_REPALL);
vfd_dot(VFD_DOT_OFF, VFD_DOT_PLAY);
vfd_dot(VFD_DOT_OFF, VFD_DOT_PAUSE);
vfd_dot(VFD_DOT_ON, VFD_DOT_COLON);
//vfd_dot(VFD_DOT_OFF, VFD_DOT_PLAYA);
//vfd_dot(VFD_DOT_OFF, VFD_DOT_PLAYB);
//vfd_dot(VFD_DOT_OFF, VFD_DOT_PGM);
//vfd_dot(VFD_DOT_OFF, VFD_DOT_RAN);
break;
case DSP_PREV:
case DSP_NEXT:
case DSP_FR:
case DSP_FF:
case DSP_SR:
case DSP_SF:
vfd_show_time(gVcdTrackInfo.CurrTrack_no , CurrentTime);
VfdDiscTurnF = 0;
break;
/* case DSP_OPEN:
FPClearFp();;
vfd_open();
break;*/
case DSP_REPEAT_TRK:
vfd_dot(VFD_DOT_ON, VFD_DOT_REP1);
break;
case DSP_REPEAT_ALL:
vfd_dot(VFD_DOT_ON, VFD_DOT_REP1);
vfd_dot(VFD_DOT_ON, VFD_DOT_REPALL);
break;
#if _SUPPORT_REPEAT_AB
case DSP_REPEAT_A:
vfd_dot(VFD_DOT_ON, VFD_DOT_PLAYA);
break;
case DSP_REPEAT_AB:
vfd_dot(VFD_DOT_ON, VFD_DOT_PLAYA);
vfd_dot(VFD_DOT_ON, VFD_DOT_PLAYB);
break;
#endif
case DSP_REPEAT_OFF:
vfd_dot(VFD_DOT_OFF, VFD_DOT_PLAYA);
vfd_dot(VFD_DOT_OFF, VFD_DOT_PLAYB);
vfd_dot(VFD_DOT_OFF, VFD_DOT_REP1);
vfd_dot(VFD_DOT_OFF, VFD_DOT_REPALL);
break;
case DSP_ON:
if( PBC_PROGRAM == Vcd_GetPBCState())
vfd_dot(VFD_DOT_ON, VFD_DOT_PGM);
else if(PBC_RANDOM == Vcd_GetPBCState())
{
vfd_dot(VFD_DOT_OFF, VFD_DOT_PGM);
vfd_dot(VFD_DOT_ON, VFD_DOT_RAN);
}
else
{
vfd_dot(VFD_DOT_OFF, VFD_DOT_PGM);
vfd_dot(VFD_DOT_OFF, VFD_DOT_RAN);
}
break;
default:
if(PBC_PBCON == Vcd_GetPBCState())
vfd_dot(VFD_DOT_ON, VFD_DOT_PBC);
else if(PBC_NORMAL== Vcd_GetPBCState())
vfd_dot(VFD_DOT_OFF, VFD_DOT_PBC);
break;
}
switch(vfd_msg->control)
{
case CTRL_UPDATED_TIME:
vfd_normal_state();
VfdDiscTurnF = 1;
break;
default:
break;
}
}
unsigned char ReceiveByte()
{
unsigned char i,value=0;
SetInputMode_VFDData();
SetVFDClk();
for(i=0;i<8;i++)
{
ClearVFDClk();
FP_Delay(UPD16311_TW_CLOCK_DELAY);
SetVFDClk();
FP_Delay(UPD16311_TW_CLOCK_DELAY);
value<<=1;
if(GetVFDData())
value++;
}
return value;
}
void SendByte(unsigned char uctemp)
{
unsigned char i;
SetOutputMode_VFDData();
FP_Delay(UPD16311_TW_CLOCK_DELAY);
for (i = 0; i < 8; i++)
{
ClearVFDClk();
FP_Delay(UPD16311_TW_CLOCK_DELAY);
if(uctemp & 0x01)
SetVFDData();
else
ClearVFDData();
FP_Delay(UPD16311_TW_CLOCK_DELAY);
SetVFDClk();
uctemp >>= 1;
FP_Delay(UPD16311_TW_CLOCK_DELAY);
}
FP_Delay(UPD16311_TW_CLOCK_DELAY);
}
void SendCmd(unsigned char Cmd)
{
ClearVFDStb();
SendByte(Cmd);
SetVFDStb();
FP_Delay(UPD16311_TW_CLOCK_DELAY);
}
void ReadKeyData(unsigned char* scanData,unsigned char size)
{
unsigned char i;
ClearVFDStb();
SendByte(READ_KEY_DATA_COMMAND);
for (i = 0; i < size; i++)
{
scanData[i] = ReceiveByte();
}
SetVFDStb();
}
unsigned char FPGetKeyIndex( void )
{
unsigned char i, j,mask;
unsigned char temp;
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)
{
temp = ((i<<3)+j)+1;
return temp;
}
mask<<=1;
}
}
}
return 0;
}
void VFD_state_init()
{
unsigned char i;
//command 1
SendCmd(DISPLAYMODE);
//command 2
SendCmd(WRITE_AUTO_DISPLAY_COMMAND);
ClearVFDStb();
//command 3
SendByte(WRITE_VFD_ADDRESS_MASK);
//data 0..size-1
for (i = 0; i < FP_MAX_BUF; i++)
{
FpBuf[i] = FpBufBak[i] = 0;
SendByte(0x00);
}
SetVFDStb();
//command 4
SendCmd(CONTROLDISPLAY);
#if !Test_Mode
vfd_readtoc();
#endif
VFD_next_state = VFD_state_scan_key_0;
}
void VFD_state_scan_key_0()
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -