#include <config.h>
#include <common.h>
#include <asm/io.h>
#include <asm/sizes.h>
#include <asm/arch/platform.h>
#include <asm/errno.h>
//#include "common.h"
//#include "command.h"
//μ¥???úéy??3ìDò
#define FALSE 0
#define TRUE 1
#define MINBAUD 2400L
#define MAXBAUD 115200L
extern void mcu_pwr_on(void);
extern void mcu_pwr_off(void);
#define Stc15wPowerOn() mcu_pwr_on()
#define Stc15wPowerOff() mcu_pwr_off()
//#define FUSER 24000000L
#define FUSER 22118400L
#define RL(n) (65536L - FUSER/4/(n))
#define isp_prove 2
unsigned long SerialBaud;
unsigned char SerialReceived;
unsigned char SerialRecvStep;
unsigned int TimeCount10us;
unsigned int SysFocs;
unsigned char RxBuffer[256];
unsigned char TxBuffer[512];
unsigned int RecvSum;
unsigned int RecvIndex;
unsigned int RecvCount;
unsigned char arg;
unsigned char fwver;
//unsigned long serial_1_baud;
//unsigned char serial_prove;
#define CMD_STAR_FLAG 0x46
#define CMD_STAR_FLAG1 0xB9
#define CMD_SEND_COMMAND 0x6A
#define CMD_RECV_COMMAND 0x68
#define CMD_END_FLAG 0x16
#define DEBUG_FLAG 0
#define POWER_DOWN_US 3000000L
extern void pl01x_putc(int portnum,char c);
extern void serial_1_puthex(unsigned char c);
extern void serial_1_putc (const char c);
extern int serial_1_tstc (void);
extern int serial_1_getc (void);
extern int serial_init_base (int chn);
extern int set_gpiox_y(int offset,int idx,int idy,int mux,int val);
extern void set_serial_1_baud(unsigned long baud);
extern void set_serial_1_prove(unsigned char prove);
//extern void clear_serial(void);
static void ClearSerial(void)
{
char ch = 0;
while(serial_1_tstc())
{
ch = serial_1_getc();
}
}
void SerialInit(void)
{
SerialReceived = 0;
TimeCount10us = 50000;
SerialRecvStep = 0;
RecvSum = 0;
}
void CommSend (unsigned char *Txbuff,char SendSize)
{
unsigned char SendIndex = 0;
unsigned int sum = 0;
unsigned int len = 0;
serial_1_puthex(CMD_STAR_FLAG);
serial_1_puthex(CMD_STAR_FLAG1);
serial_1_puthex(CMD_SEND_COMMAND);
serial_1_puthex(0x00);
len = SendSize + 6;
sum = len + CMD_SEND_COMMAND;
serial_1_puthex(len);
for(SendIndex=0; SendIndex < SendSize; SendIndex++)
{
// udelay(10);
sum += Txbuff[SendIndex];
serial_1_puthex(Txbuff[SendIndex]);
}
serial_1_puthex(sum >> 8);
serial_1_puthex(sum & 0xff);
serial_1_puthex(CMD_END_FLAG);
udelay(10);
SerialInit();
}
unsigned char SerialReceiveData(void)
{
int ch = 0;
ch = serial_1_getc();
if (ch > 0xff)
{
//return;
#if DEBUG_FLAG == 1
printf("error:%x\n",(ch >> 8)&0xff);
#endif
ch &= 0xff;
}
// printf("%02X ",ch);
switch(SerialRecvStep)
{
case 1:
if(ch != CMD_STAR_FLAG1)
SerialRecvStep = 0;
else
SerialRecvStep++;
break;
case 2:
if(ch != CMD_RECV_COMMAND)
SerialRecvStep = 0;
else
SerialRecvStep++;
break;
case 3:
if(ch != 0x00)
SerialRecvStep = 0;
else
SerialRecvStep++;
break;
case 4:
RecvSum = CMD_RECV_COMMAND + ch;
RecvCount = ch - 6;
RecvIndex = 0;
SerialRecvStep++;
break;
case 5:
RecvSum += ch;
RxBuffer[RecvIndex++] = ch;
if(RecvIndex == RecvCount)
SerialRecvStep++;
break;
case 6:
if(ch != ((RecvSum >> 8) & 0xff))
{
#if DEBUG_FLAG == 1
printf("sumh error %04x\n",RecvSum);
#endif
SerialRecvStep = 0;
}
else
{
#if DEBUG_FLAG == 1
printf("sumh ok\n");
#endif
SerialRecvStep++;
}
break;
case 7:
if(ch != (RecvSum & 0xff))
{
#if DEBUG_FLAG == 1
printf("suml error\n");
#endif
SerialRecvStep = 0;
}
else
{
#if DEBUG_FLAG == 1
printf("suml ok\n");
#endif
SerialRecvStep++;
}
break;
case 8:
if(ch != CMD_END_FLAG)
{
#if DEBUG_FLAG == 1
printf("endflag error\n");
#endif
SerialRecvStep = 0;
}
else
{
#if DEBUG_FLAG == 1
printf("resive ok\n");
#endif
SerialRecvStep++;
SerialReceived = 1;
}
break;
default:
SerialInit();
SerialRecvStep = (ch == CMD_STAR_FLAG ? 1:0);
break;
}
if(SerialRecvStep == 0)
{
SerialInit();
SerialRecvStep = (ch == 0x46 ? 1:0);
}
return ch;
}
unsigned char CheckResive(unsigned char ch)
{
while(1)
{
if(serial_1_tstc())
SerialReceiveData();
if(SerialReceived == 1)
{
if(RxBuffer[0] == ch)
return TRUE;
printf("Error\n");
return FALSE;
}
udelay(10);
TimeCount10us--;
if(TimeCount10us == 0)
{
printf("Timeout\n");
return FALSE;
}
}
return TRUE;
}
void SendUpdateCommand(void)
{
//send update command
printf("Update\n");
SerialBaud = MAXBAUD;
set_serial_1_baud(SerialBaud);
set_serial_1_prove(0);
serial_init_base(1);
udelay(10);
serial_1_puthex(0xC0);
serial_1_puthex(0x60);
serial_1_puthex(0x08);
serial_1_puthex(0x68);
serial_1_puthex(0xC0);
udelay(1000);
//set baud 2400, even
SerialBaud = MINBAUD;
set_serial_1_baud(SerialBaud);
set_serial_1_prove(isp_prove); //--必须为偶校验--
serial_init_base(1);
set_serial_1_prove(0);
udelay(100);
}
unsigned char EnterIsp(unsigned int *focs)
{
unsigned int count = 0;
unsigned char test_count = 0;
Stc15wPowerOff();
printf("\nPower down\n");
//Stc15wPowerOff();
//set baud 2400, even
SerialBaud = MINBAUD;
set_serial_1_baud(SerialBaud);
set_serial_1_prove(isp_prove); //--必须为偶校验--
serial_init_base(1);
set_serial_1_prove(0);
udelay(POWER_DOWN_US);
// SendUpdateCommand();
ClearSerial();
SerialInit();
Stc15wPowerOn();
printf("Power up\n");
test_count = 0;
while(1)
{
if(0 == SerialRecvStep)
{
serial_1_puthex(0x7f);
}
udelay(10000); //--10毫秒很重要,必须有
while(serial_1_tstc())
{
SerialReceiveData();
if(SerialReceived == 1)
{
arg = RxBuffer[38];//[4];
fwver = RxBuffer[17];
if(RxBuffer[0] == 0x50)
{
*focs = RxBuffer[8];
*focs = *focs * 256 + RxBuffer[9];
*focs = *focs * 256 + RxBuffer[10];
*focs = *focs * 256 + RxBuffer[11];
#if DEBUG_FLAG == 1
printf("arg:%02X %02X\n",arg,fwver);
#endif
break;
}
else
{
printf("Error\n");
test_count++;
if(test_count >= 5)
{
return FALSE;
}
printf("power down\n");
Stc15wPowerOff();
udelay(POWER_DOWN_US);
//SendUpdateCommand();
count = 0;
ClearSerial();
SerialInit();
Stc15wPowerOn();
printf("Power up\n");
}
}
}
if(SerialReceived == 1)
break;
count++;
if(count > 200) // 2000ms
{
printf("Timeout\n");
test_count++;
if(test_count >= 5)
{
return FALSE;
}
// power off 3s
printf("Power down\n");
Stc15wPowerOff();
udelay(POWER_DOWN_US);
// SendUpdateCommand();
count = 0;
ClearSerial();
SerialInit();
Stc15wPowerOn();
printf("Power up\n");
}
}
return TRUE;
}
unsigned char AdjFocs(void)
{
unsigned int count = 0;
unsigned char ADJ_FOCS1[] = {0x00,0x0B,0x00,0xC0,0x80,0xC0,0xFF,0xC0,0x00,0x80,0x80,0x80
,0xFF,0x80,0x00,0x40,0x80,0x40,0xFF,0x40,0x00,0x00,0x80,0x00,0x00,0x00};
unsigned char FOCS_22118400[]= {0x00,0x0C,0x80,0x40,0x81,0x40,0x82,0x40,0x83,0x40,0x84,0x40
,0x85,0x40,0x80,0x40,0x81,0x40,0x82,0x40,0x83,0x40,0x84,0x40,0x85,0x40};
printf("Adj focs\n");
memcpy(TxBuffer,ADJ_FOCS1,26);
CommSend(TxBuffer,26);
udelay(100);
count = 0;
while(1)
{
serial_1_puthex(0xFE);
udelay(100);
while(serial_1_tstc())
{
SerialReceiveData();
if(SerialReceived == 1)
{
if(RxBuffer[0] == 0x00)
{
break;
}
else
{
return FALSE;
}
}
}
if