📄 dsa.c
字号:
AVD_SetMediaInterrupt();
PostCommand(CMD_FUNC | CMD_FUNC_TIMEOUT);
#ifdef MONE_DSA_TIMEOUT
printf("ChkTrkTmByMSF Timeout\n");
printf("cd_trk_now:%d max:%d min:%d now:%d\n",now,max,min,msf);
#endif
return 0;
}
return 1;
}
#ifdef SUPPORT_SFT_DSA
void Sft_dsa_isr(void)
{
if( bDSATimer>1)
bDSATimer--;
}
void Sft_DSA_reset(void)
{
regs0->gpio_pinsel |=(1<<3);
regs0->gpio_pinsel |=(1<<8);
bDSATimer=0;
SetDSA_DAT(1);
SetDSA_STB(1);
SetDSA_ACK(1);
SetDAT_READ();
SetACK_READ();
SetSTB_READ();
dsa_state_sel = 0;
dsa_status_sel = DSA_IDLE;
}
/****************************************************************************/
/* Function : Sft_DsaSendCmmd(BYTE bCmd,BYTE bParameter) */
/* Description : 1. Transfer DSA command and parameter to external host by */
/* 2. Use 3 GPIO lines to simulate DSA_ACK, DSA_DATA, DSA_STB*/
/* Not using hardware DSA_ACK, DSA_DAT, DSA_STB pins */
/* Arguments : bCmd ==> DSA command to external host(Opcode) */
/* bParameter==> for DSA command parameter */
/* Return : SUCCESS:1 , FAIL:0 */
/* Kenny 2000/11/22 */
/****************************************************************************/
BYTE Sft_DSA_SendCmd(void)
{
switch(dsa_state_sel)
{
case 0: //set data low for sync start
SetACK_READ();
SetDAT_READ();
SetSTB_READ();
if(!GetDSA_DAT())
{
dsa_status_sel = DSA_RECEIVE;
return DSA_IDLE;
}
SetDSA_DAT(0);
dsa_state_sel = 1;
dsa_status_sel = DSA_SEND;
bDSATimer = DSA_250MS;
break;
case 1: //wait ack low for sync start
if(!GetDSA_ACK())
{
dsa_state_sel = 2;
SetDSA_DAT(1);
}
break;
case 2: //wait ack high for sync end
if(GetDSA_ACK())
{
dsa_state_sel = 3;
#ifdef SUPPORT_COMBO
dsa_send_data = dsa_cmd[dsa_cmd_tail];
#else
dsa_send_data = sft_dsa_cmd[sft_dsa_cmd_tail];
#endif
dsa_loop_count=0;
SetDSA_DAT(1);
}
break;
case 3: //data send start
SetDSA_DAT(MSB(dsa_send_data)); // send msb
dsa_send_data<<=1;
dsa_loop_count++;
dsa_state_sel = 4;
SetDSA_STB(0);
break;
case 4: //data send start
if(!GetDSA_ACK())
{
dsa_state_sel = 5;
SetDSA_STB(1);
}
break;
case 5: //data send end
if(GetDSA_ACK())
{
if(dsa_loop_count==16)
{
dsa_state_sel = 6;
SetDAT_READ();
SetSTB_READ();
SetDSA_ACK(0);
}
else
dsa_state_sel = 3;
}
break;
case 6: //check ack start
SetSTB_READ();
if(!GetDSA_STB())
{
dsa_state_sel = 7;
SetDSA_ACK(1);
}
break;
case 7: //check ack end
if(GetDSA_STB())
{
Sft_DSA_reset();
return DSA_SUCCESS;
}
break;
default:
dsa_state_sel = 0;
break;
}
if(bDSATimer==1)
{
Sft_DSA_reset();
return DSA_FAIL;
}
else
return DSA_IDLE;
}
/****************************************************************************/
/* Function : Sft_DSA_ReceiveCmd(BYTE bResponse) */
/* Description : 1. Receive DSA command and parameter from external host */
/* 2. Use 3 GPIO lines to simulate DSA_ACK, DSA_DATA,DSA_STB */
/* Not using hardware DSA_ACK, DSA_DAT, DSA_STB pins */
/* Arguments : bResponse: Wanted DSA command from host */
/* */
/* Return : Parameter for received dsa command */
/* */
/* Kenny 2000/11/22 */
/****************************************************************************/
BYTE Sft_DSA_ReceiveCmd(void)
{
switch(dsa_state_sel)
{
case 0: //wait data low for sync start
SetDAT_READ();
SetACK_READ();
SetSTB_READ();
if(!GetDSA_DAT())
{
dsa_state_sel = 1;
bDSATimer = DSA_250MS;
dsa_status_sel = DSA_RECEIVE;
SetDSA_ACK(0);
}
else
dsa_status_sel = DSA_IDLE;
return DSA_IDLE;
break;
case 1: //wait data high for sync end
if(GetDSA_DAT())
{
dsa_state_sel = 2;
dsa_loop_count =0;
dsa_receive_data =0;
SetDSA_ACK(1);
}
break;
case 2: //receive data start
if(!GetDSA_STB())
{
dsa_receive_data <<= 1;
SetDAT_READ();
if(GetDSA_DAT())
dsa_receive_data |= 0x0001;
dsa_loop_count++;
dsa_state_sel = 3;
SetDSA_ACK(0);
}
break;
case 3: //receive data end
if(GetDSA_STB())
{
SetDSA_ACK(1);
if(dsa_loop_count==16)
{
dsa_state_sel = 4;
SetACK_READ();
}
else
dsa_state_sel = 2;
}
break;
case 4: //check ack phase
if(!GetDSA_ACK())
{
SetDSA_DAT(1);
SetDSA_STB(0);
dsa_state_sel = 5;
}
break;
case 5: //check ack high phase
if(GetDSA_ACK())
{
Sft_DSA_reset();
return DSA_SUCCESS;
}
break;
default:
dsa_state_sel = 0;
break;
}
if(bDSATimer==1)
{
Sft_DSA_reset();
return DSA_FAIL;
}
return DSA_IDLE;
}
void polling_sft_dsa(void)
{
if(dsa_status_sel!=DSA_SEND)
{
if(Sft_DSA_ReceiveCmd()==DSA_SUCCESS)
{
if((dsa_receive_data & 0xff00) == 0xfc00)
{
irc_func_table[ir_mapcode[dsa_receive_data & 0xff]]();
}
}
}
if(dsa_status_sel!=DSA_RECEIVE)
{
#ifdef SUPPORT_COMBO
if(dsa_cmd_head != dsa_cmd_tail)
#else
if(sft_dsa_cmd_head != sft_dsa_cmd_tail)
#endif
{
if(Sft_DSA_SendCmd()==DSA_SUCCESS)
{
#ifdef SUPPORT_COMBO
dsa_cmd_tail = WRAPr(dsa_cmd_tail+1, DSA_CMD_BUF_SIZE);
#else
sft_dsa_cmd_tail = WRAPr(sft_dsa_cmd_tail+1, DSA_CMD_BUF_SIZE);
#endif
SetDAT_READ();
}
}
else
dsa_status_sel = DSA_IDLE;
}
}
void Sft_DsaSendCmmd(BYTE cmd,BYTE datas)
{
#ifdef SUPPORT_COMBO
dsa_cmd[dsa_cmd_head] = (cmd<<8)|datas;
dsa_cmd_head = WRAPr(dsa_cmd_head+1, DSA_CMD_BUF_SIZE);
#else
sft_dsa_cmd[sft_dsa_cmd_head] = (cmd<<8)|datas;
sft_dsa_cmd_head = WRAPr(sft_dsa_cmd_head+1, DSA_CMD_BUF_SIZE);
#endif
}
#endif
// #ifdef SUPPORT_SFT_DSA
#ifdef SUPPORT_EXT_HW_DSA //kenny 891122
/*********************************************************
*Function: dsa_hardware_response()
*Description:This function is for responsing dsa command
* which is from external host.
*
* Input: rx: High byte means dsa command,
* Low byte means command parameter
*
*
* Kenny 2000/11/22
********************************************************/
void extern_dsa_response(UINT32 rx)
{
BYTE low;
low=(BYTE)(rx&0xff);
// psprintf(linebuf,":%x\n",rx);
// osd_print2(linebuf);
switch(rx&0xff00)
{
//case 0xFC00:
case 0xF700: //kenny 891128
irc_func_table[low]();
break;
case 0xF500://kenny 891128
get_disc_type(low);
break;
case 0xF600://kenny 891128
get_sys_state();
break;
default:
break;
}
}
/********************************************
*Function: polling_hardware_dsar(void)
*Description:This function is for polling dsa command
* which is from external host
*
*
*
* Kenny 2000/11/21
********************************************************/
void polling_hardware_dsar(void)
{
if (IsDsaRxFull)
{
UINT32 rx = dsaReadRx();
//psprintf(linebuf,"RX:%x\n",rx);
//osd_print2(linebuf);
extern_dsa_response(rx);
}
}
/***********************************************************
*Function: HW_DsaSendCmmd(BYTE bCmd,BYTE bParameter)
*Description:This function is for send dsa command
* and parameter to external host by hardware method
*
*Input: bCmd: DSA command
* bParameter: parameter of DSA command
* Kenny 2000/11/21
*************************************************************/
void HW_DsaSendCmmd(BYTE bCmd,BYTE bParameter)
{
#if 0
WORD i;
if (IsDsaTxEmpty)
{
UINT32 x = (bCmd<<8)|bParameter;
// psprintf(linebuf,"X:%x\n",x);
// osd_print2(linebuf);
for(i=0;i<2600;i++);
dsaWriteTx(x);
for(i=0;i<2600;i++);
}
#endif
#if 1
int head = dsa_cmd_head;
int tail = dsa_cmd_tail;
UINT32 cmd = (bCmd<<8)|bParameter;
WORD i;
dsa_cmd[head] = cmd;
dsa_cmd_head = WRAPr(head+1, DSA_CMD_BUF_SIZE);
if (IsDsaTxEmpty)
{
UINT32 x = dsa_cmd[tail];
for(i=0;i<2600;i++);
dsaWriteTx(x);
for(i=0;i<2600;i++);
dsa_cmd_tail = WRAPr(tail+1, DSA_CMD_BUF_SIZE);
#ifdef MONE_DSA_WRITE
psprintf(linebuf, "DSAW: %04x\n", x);
epp_write(linebuf);
#endif
}
else
{
// osd_print2("ERROR\n");
}
#endif
}
#endif //SUPPORT_EXT_HW_DSA
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -