2283 lines
62 KiB
C
2283 lines
62 KiB
C
#include <stdio.h>
|
||
#include <string.h>
|
||
#include <stdlib.h>
|
||
#include <string.h>
|
||
#include <math.h>
|
||
#include <sys/types.h>
|
||
#include <sys/socket.h>
|
||
#include <netinet/in.h>
|
||
#include <unistd.h>
|
||
#include <netinet/in.h>
|
||
#include <arpa/inet.h>
|
||
#include <netdb.h> /* netdb is necessary for struct hostent */
|
||
|
||
#include "../inc/config.h"
|
||
#include "../inc/os_task.h"
|
||
#include "../inc/type.h"
|
||
#include "../inc/tcp_task.h"
|
||
#include "../inc/general_api.h"
|
||
#include "../inc/isys_config.h"
|
||
#include "../inc/delay.h"
|
||
#include "../inc/i2c_drv.h"
|
||
#include "../inc/lcd_task.h"
|
||
#include "../inc/iuart_user.h"
|
||
|
||
#include "../inc/eeprom.h"
|
||
#include "../inc/log_task.h"
|
||
#include "../inc/isys_com.h"
|
||
#include "../inc/upgrade.h"
|
||
|
||
|
||
uint8 fpga_up_sys_reboot = 0;
|
||
|
||
#if USE_LOG_MODULE//@STAY_FINAL_PROC:留在最后处理
|
||
|
||
#else//
|
||
uint32 log_system_event_generate(S_SYS_TIME* ptime,uint32 type,uint8 *pcontent,uint32 ctlen)
|
||
{
|
||
}
|
||
|
||
#endif
|
||
|
||
//#include "stm32f4x7_eth.h"
|
||
//#include "stm32f4x7_eth_bsp.h"
|
||
/*
|
||
#include "stm32f4xx_hal.h"
|
||
#include "sockets.h"
|
||
#include "os_task.h"
|
||
#include "type.h"
|
||
#include "tcp_task.h"
|
||
#include "cgifuncs.h"
|
||
#include "os_task.h"
|
||
#include "eeprom.h"
|
||
#include "lcd_task.h"
|
||
#include "i2c_drv.h"
|
||
#include "uart_user.h"
|
||
#include "tcp.h"
|
||
#include "delay.h"
|
||
#include "general_api.h"
|
||
#include "sys_config.h"
|
||
#include "config.h"
|
||
#include "fpga.h"
|
||
*/
|
||
|
||
#if ALARM_USE_UDP
|
||
extern struct sockaddr_in alarm_clientaddr;
|
||
extern int alarm_sockfd;
|
||
#endif
|
||
|
||
|
||
|
||
#if USE_TCP_COMM
|
||
extern uint8 std_r[];
|
||
extern uint8 std_w[];
|
||
#define TCP_REMOTE_MAX_REC_LEN 128
|
||
#define TCP_REMOTE_MAX_SEND_LEN 128
|
||
|
||
static uint32 tcp_remote(uint8 *pbuf,uint8* poutbuf)
|
||
{
|
||
uint32 send_len = 0;
|
||
uint32 set_result = 0;
|
||
|
||
if(memcmp(std_r,pbuf,3)==0) //头部检查
|
||
{
|
||
if(get_check_sum(pbuf,4)==pbuf[4])//查询命令
|
||
{
|
||
send_len = protocol_read(pbuf,poutbuf);//回复
|
||
}
|
||
}
|
||
if(memcmp(std_w,pbuf,3)==0)
|
||
{
|
||
if(get_check_sum(pbuf,8)==pbuf[8])//设置命令
|
||
{
|
||
set_result = protocol_write(pbuf,poutbuf);//配置本地参数
|
||
}
|
||
else
|
||
{
|
||
set_result = UART_PARA_SET_ERR_SUM;
|
||
}
|
||
send_len = uart_init_set_result_frame(pbuf,poutbuf,set_result); //串口和网口一套协议
|
||
}
|
||
return send_len;
|
||
}
|
||
/*
|
||
void tcp_remote_task(void * pvParameters)
|
||
{
|
||
struct sockaddr_in server_addr;
|
||
struct sockaddr_in conn_addr;
|
||
int sock_fd;
|
||
int sock_conn;
|
||
socklen_t addr_len;
|
||
int err;
|
||
int length;
|
||
static uint8 inbuf_tcp[TCP_REMOTE_MAX_REC_LEN] = {0,};
|
||
static uint8 outbuf_tcp[TCP_REMOTE_MAX_SEND_LEN] = {0,};
|
||
|
||
|
||
(void)pvParameters;
|
||
task_set_ignore_chk(TCP_REMOTE_TASK_ID);
|
||
|
||
vTaskDelay(15);
|
||
printf("%s init start...\n",__FUNCTION__);
|
||
|
||
|
||
sock_fd = lwip_socket(AF_INET, SOCK_STREAM, 0);
|
||
if (sock_fd == -1)
|
||
{
|
||
printf("failed to create tcp sock_fd!\n");
|
||
}
|
||
|
||
memset(&server_addr, 0, sizeof(server_addr));
|
||
server_addr.sin_family = AF_INET;
|
||
server_addr.sin_addr.s_addr =htonl(INADDR_ANY);
|
||
server_addr.sin_port = htons(TCP_COMM_PORT);
|
||
|
||
err = lwip_bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
|
||
if (err < 0)
|
||
{
|
||
printf("failed to bind sock_fd!\n");
|
||
}
|
||
|
||
err = lwip_listen(sock_fd, 5);
|
||
if (err < 0)
|
||
{
|
||
printf("failed to listen sock_fd!\n");
|
||
}
|
||
|
||
addr_len = sizeof(struct sockaddr_in);
|
||
|
||
printf("%s init over.\n",__FUNCTION__);
|
||
|
||
while(1)
|
||
{ //均为阻塞性
|
||
sock_conn = lwip_accept(sock_fd, (struct sockaddr *)&conn_addr, &addr_len);
|
||
while(sock_conn!=-1)
|
||
{
|
||
memset(inbuf_tcp, 0, sizeof(inbuf_tcp));
|
||
|
||
length = lwip_recv(sock_conn, (unsigned int *)inbuf_tcp, TCP_REMOTE_MAX_REC_LEN, 0);
|
||
if(length)
|
||
{
|
||
length = tcp_remote(inbuf_tcp,outbuf_tcp);
|
||
if(length)
|
||
{
|
||
lwip_send(sock_conn,outbuf_tcp ,length, 0);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
lwip_close(sock_conn);
|
||
sock_conn = -1;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void udp_remote_task(void* pvParameters)
|
||
{
|
||
struct sockaddr_in server_addr;
|
||
int sock_fd;
|
||
int err;
|
||
int length;
|
||
struct sockaddr from;
|
||
socklen_t fromlen;
|
||
static uint8 udp_inbuf[TCP_REMOTE_MAX_REC_LEN] = {0,};
|
||
static uint8 udp_outbuf[TCP_REMOTE_MAX_SEND_LEN] = {0,};
|
||
|
||
task_set_ignore_chk(UDP_REMOTE_TASK_ID);
|
||
printf("%s init start...\n",__FUNCTION__);
|
||
|
||
sock_fd = lwip_socket(AF_INET, SOCK_DGRAM, 0);
|
||
if(sock_fd == -1)
|
||
{
|
||
printf("failed to create tcp sock_fd!\n");
|
||
}
|
||
|
||
memset(&server_addr, 0, sizeof(server_addr));
|
||
server_addr.sin_family = AF_INET;
|
||
server_addr.sin_addr.s_addr =htonl(INADDR_ANY);
|
||
server_addr.sin_port = htons(TCP_COMM_PORT);
|
||
|
||
err = lwip_bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
|
||
if(err < 0)
|
||
{
|
||
printf("failed to bind sock_fd!\n");
|
||
}
|
||
|
||
printf("%s init over.\n",__FUNCTION__);
|
||
|
||
while(1)
|
||
{ //阻塞型
|
||
length = lwip_recvfrom(sock_fd,udp_inbuf,TCP_REMOTE_MAX_REC_LEN, 0,&from,&fromlen);
|
||
|
||
if(length) //具体处理待定
|
||
{
|
||
length = tcp_remote(udp_inbuf,udp_outbuf);
|
||
if(length)
|
||
{
|
||
lwip_sendto(sock_fd, udp_outbuf,length, 0,&from,fromlen);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
*/
|
||
#endif
|
||
|
||
|
||
#if FPGA_UPGRADE
|
||
//----------------------------------------------
|
||
static uint8 rxdata[MAX_DATA_LEN]={0}; //TCP通讯 接收
|
||
static uint8 txdata[TX_DATA_LEN] = //TCP通讯 发送
|
||
{
|
||
0x7E, // head
|
||
0xFF,0xFF, // address
|
||
0x00, // cmd
|
||
0x02,0x00, // data len
|
||
0x00,0x00, // data
|
||
0x00, // sum
|
||
0x0D // tail
|
||
};
|
||
static uint8 recvData[MAX_DATA_LEN]={0}; //TCP通讯 解析
|
||
static uint8 writeBuf[MAX_PER_FRAME_LEN]={0};
|
||
|
||
|
||
S_UP_STATE upState={0};
|
||
static const char div_str[]={":"};
|
||
|
||
//-----------------------------------------------
|
||
|
||
void send_upgrade_msg(uint8 lcdDisplayType)
|
||
{
|
||
set_trigger_lcd_menu(lcdDisplayType);
|
||
|
||
/*MSG *pmsg = alloc_msg();
|
||
|
||
if(pmsg)
|
||
{
|
||
pmsg->type = msgType;
|
||
pmsg->need_free = MSG_NEED_FREE;
|
||
send_msg(LCD_TASK_ID,pmsg);
|
||
}*/
|
||
|
||
#if 0//WEB_MSG_CFG
|
||
MSG msg;
|
||
|
||
msg.type = MSG_FPGA_UPGRADE;
|
||
msg.need_free = MSG_NO_NEED_FREE;
|
||
msg.wPara = lcdDisplayType;
|
||
msg_send_to_lcd(&msg);
|
||
#endif
|
||
}
|
||
|
||
uint8 char_to_hex(uint8 ch)
|
||
{
|
||
uint8 value = 0;
|
||
if(ch >= '0' && ch <= '9')
|
||
{
|
||
value = ch -0x30;
|
||
}
|
||
else if(ch >='A' && ch <='F')
|
||
{
|
||
value = (ch-'A') + 10;
|
||
}
|
||
else if(ch >='a' && ch <='f')
|
||
{
|
||
value = (ch-'a') + 10;
|
||
}
|
||
return value;
|
||
}
|
||
|
||
int conv_ascii2hex(uint8 *charBuf,uint8 *hexBuf,uint16 charLen)
|
||
{
|
||
uint16 retLen=0;
|
||
uint16 i,j;
|
||
|
||
if(!charBuf)
|
||
return -1;
|
||
if(!hexBuf)
|
||
return -1;
|
||
|
||
if(charLen%2!=0)
|
||
return -1;
|
||
|
||
if(charLen<2)
|
||
return -1;
|
||
|
||
for(i=0,retLen=0;i<charLen;)
|
||
{
|
||
hexBuf[retLen++]=(char_to_hex(charBuf[i])<<4)|(char_to_hex(charBuf[i+1]));
|
||
i=i+2;
|
||
}
|
||
hexBuf[retLen]='\0';
|
||
|
||
return retLen;
|
||
}
|
||
|
||
|
||
int recv_upgrade_data_parse(uint8 *recvBuf,uint8 *parseBuf,uint16 recvLen)
|
||
{
|
||
uint8 test;
|
||
uint8 type;
|
||
uint8 length;
|
||
int retLen=0;
|
||
|
||
uint8 lenh,lenl;
|
||
uint8 typeh,typel;
|
||
|
||
S_FGPA_UPDATA_FRAME *pUpFrame=NULL;
|
||
uint8 tempBuf[100];
|
||
|
||
if(recvLen>UPDATA_RAW_FRAME_MAX_LEN){
|
||
return -2;
|
||
}
|
||
if(recvLen<UPDATA_RAW_FRAME_MIN_LEN){
|
||
return -2;
|
||
}
|
||
|
||
pUpFrame = (S_FGPA_UPDATA_FRAME*)recvBuf;
|
||
|
||
lenh = char_to_hex(pUpFrame->lenH);
|
||
lenl = char_to_hex(pUpFrame->lenL);
|
||
length = (lenh<<4)|(lenl);
|
||
|
||
typeh = char_to_hex(pUpFrame->typeH);
|
||
typel = char_to_hex(pUpFrame->typeL);
|
||
type = (typeh<<4)|(typel);
|
||
|
||
if(length==0x10)
|
||
{
|
||
if(type==0x00)//数据
|
||
{
|
||
memset(tempBuf,0,sizeof(tempBuf));
|
||
memcpy(tempBuf,pUpFrame->data,32);
|
||
retLen = conv_ascii2hex(tempBuf,parseBuf,32);
|
||
}
|
||
}
|
||
else if(length==0x00)//结束
|
||
{
|
||
if(type==0x01)//文件末尾
|
||
{
|
||
retLen = -1;
|
||
}
|
||
}
|
||
return retLen;
|
||
}
|
||
|
||
uint8 check_fpga_write_busy(void)
|
||
{
|
||
uint16 timeout=0;
|
||
uint8 rstate=0;
|
||
uint8 ret=0;
|
||
|
||
//管脚为1时,进行检测
|
||
while(GET_FPGA_SPI_MISO()==1)
|
||
{
|
||
rstate = fpga_byte_read(0x01,FPGA_UPGRADE_CTRL_ADDR);
|
||
while((rstate&FPGA_UP_STATUS_BUSY_MASK==0)){
|
||
rstate = fpga_byte_read(0x01,FPGA_UPGRADE_CTRL_ADDR);
|
||
delay_us(10);
|
||
timeout++;
|
||
if(timeout>=1000){// 10ms
|
||
return 0xff;
|
||
}
|
||
};
|
||
}
|
||
return ret;
|
||
}
|
||
int check_fpga_write_busy_V2(void)
|
||
{
|
||
uint16 timeout=0;
|
||
uint8 rstate=0;
|
||
uint8 ret=0;
|
||
uint8 i = 0;
|
||
uint8 count = 0;
|
||
|
||
|
||
//管脚为1时,进行检测
|
||
while(GET_FPGA_SPI_MISO()==1)
|
||
{
|
||
delay_us(1);
|
||
|
||
count++;
|
||
|
||
if(count > 100) {
|
||
rstate = fpga_byte_read(0x01,FPGA_UPGRADE_CTRL_ADDR);
|
||
if(rstate & FPGA_UP_STATUS_BUSY_MASK) {
|
||
return -1;
|
||
}
|
||
}
|
||
}
|
||
return 0;
|
||
}
|
||
void reset_fpga_system(void)
|
||
{
|
||
fpga_byte_write(0x01,FPGA_UPGRADE_CTRL_ADDR,FPGA_UP_CTRL_RESET_EN_MASK|FPGA_UP_CTRL_HDRESET_EN_MASK);
|
||
}
|
||
void reset_imx_system(void)
|
||
{
|
||
system("sync");
|
||
system("reboot");
|
||
}
|
||
uint8 check_fpga_upgrade_done(void)
|
||
{
|
||
uint8 rstate = 0;
|
||
uint8 ret_data = READY;
|
||
|
||
//h-up-state
|
||
rstate = fpga_byte_read(0x01,FPGA_UPGRADE_CTRL_ADDR);
|
||
if(rstate&FPGA_UP_STATUS_DONE_MASK){
|
||
log_printf(LOG_DEBUG,I_NOUSED," rstate=0x%x\n",rstate);
|
||
//升级完成
|
||
//fpga_byte_write(0x01,FPGA_UPGRADE_CTRL_ADDR,FPGA_UP_CTRL_RESET_EN_MASK|FPGA_UP_CTRL_HDRESET_EN_MASK);
|
||
reset_fpga_system();
|
||
fpga_up_sys_reboot = 1; //reset_imx_system();
|
||
|
||
//
|
||
#if FPGA_UP_MSG
|
||
send_upgrade_msg(DISPLAY_FPGA_UPGRADE_OVER);//MSG_FPGA_UPGRADE_OVER
|
||
#endif
|
||
upState.curSate=UPSTATE_FEADBACK_END;
|
||
ret_data = ABORT_SUCCESS;
|
||
|
||
if(rstate&FPGA_UPGRADE_STATUS_ERROR_MASK){
|
||
//升级出错
|
||
fpga_byte_write(0x01,FPGA_UPGRADE_CTRL_ADDR,FPGA_UP_CTRL_RESET_EN_MASK);
|
||
#if FPGA_UP_MSG
|
||
|
||
send_upgrade_msg(DISPLAY_FPGA_UPGRADE_ERR);//MSG_FPGA_UPGRADE_ERR
|
||
#endif
|
||
upState.errCnt++;
|
||
ret_data = ABORT_ERROR;
|
||
}
|
||
}
|
||
|
||
return ret_data;
|
||
}
|
||
|
||
void recv_pkg_parse(uint8 *recvBuf,uint8 *pOutFrame)// get total linenum
|
||
{
|
||
if(!recvBuf)return;
|
||
if(!pOutFrame)return;
|
||
|
||
pOutFrame = strtok(recvBuf,":");// ':'
|
||
}
|
||
|
||
int find_char (char **strings,char value)
|
||
{
|
||
int num=0;
|
||
char *string;
|
||
while((string= *strings++)!=NULL)
|
||
{
|
||
while(*string!='\0')
|
||
{
|
||
if(*string++==value)
|
||
{
|
||
num++;
|
||
}
|
||
}
|
||
}
|
||
return num;
|
||
}
|
||
|
||
uint16 get_recv_pkg_line_num(uint8 *recvBuf,uint16 dataLen)
|
||
{
|
||
char *pStr=NULL;
|
||
uint16 lineNum=0;
|
||
|
||
if(!recvBuf)return 0;
|
||
if(!dataLen)return 0;
|
||
|
||
pStr=recvBuf;
|
||
while(1)
|
||
{
|
||
pStr = strchr(pStr,':');
|
||
if(pStr!='\0')
|
||
{
|
||
lineNum++;
|
||
}
|
||
else{
|
||
break;
|
||
}
|
||
}
|
||
|
||
return lineNum;
|
||
}
|
||
|
||
|
||
void test_only_write_file(void)
|
||
{
|
||
#define MAX_FILE_LEN (25*1024*1024)
|
||
#define MAX_LINE (1000)
|
||
FILE *fp;
|
||
char load_file[20] = "./cttb.mcs";
|
||
uint8 line[MAX_LINE];
|
||
int len = 0;
|
||
static int count = 0;
|
||
uint8 * pWriteData = NULL;
|
||
|
||
fp = fopen(load_file, "r");
|
||
if(fp == NULL)
|
||
{
|
||
log_printf(LOG_ERR,I_NOUSED,"can not load file!");
|
||
return ;
|
||
}
|
||
|
||
log_printf(LOG_DEBUG,I_NOUSED,"START get %s line \n",load_file);
|
||
while(fgets(line, MAX_LINE, fp) != NULL) {
|
||
len = strlen(line);
|
||
len = len - 1;
|
||
count++;
|
||
if(count >= 1024){
|
||
log_printf(LOG_DEBUG,I_NOUSED,"len=%d count 1024\n", len);
|
||
count = 0;
|
||
}
|
||
if(len>=4)//写到fpga
|
||
{
|
||
pWriteData = (uint8*)(line);
|
||
while(len){// 4字节写入
|
||
ispi_fpga_send_buf_4Byte(pWriteData);
|
||
pWriteData = pWriteData+4;
|
||
len= len-4;
|
||
//printf("-len=%d\n", len);
|
||
}
|
||
//printf("ready UPSTATE_WRITE\n");
|
||
}
|
||
}
|
||
log_printf(LOG_DEBUG,I_NOUSED,"%s write over\n", load_file);
|
||
|
||
fclose(fp);
|
||
|
||
|
||
}
|
||
|
||
extern void set_fpga_up_result(uint8 res);
|
||
int g_now_only_upgrade_fpga = 0;
|
||
|
||
static uint32 fpga_upgrade_process(void)
|
||
{
|
||
S_FPGA_UP_FRAME_NEW *pframe;
|
||
int datalen = 0;
|
||
uint8 sum = 0;
|
||
uint8 rstate = 0;
|
||
uint8 ret_data= 0;
|
||
|
||
uint8 *pSemi1 =NULL;
|
||
uint8 *pSemi2 =NULL;
|
||
uint8 *pLineData =NULL;
|
||
uint8 *pWriteData =NULL;
|
||
int lineDataLen =0;
|
||
int retDataLen =0;
|
||
uint8 pkgFirstFlg =0;
|
||
static uint8 tstFlg=0;
|
||
static uint16 ck_cnt;
|
||
static uint8 first_byte = 0;
|
||
int i = 0;
|
||
|
||
pframe = (S_FPGA_UP_FRAME_NEW*)&rxdata[0];
|
||
datalen = pframe->datalen;
|
||
|
||
txdata[0] = rxdata[0];
|
||
txdata[1] = rxdata[1];
|
||
|
||
if((rxdata[0] != 0xAA) || (rxdata[datalen + 5] != 0xBB))
|
||
{
|
||
log_printf(LOG_DEBUG,I_NOUSED,"no aa bb\n");
|
||
|
||
return 0;
|
||
}
|
||
|
||
if(!sys_ready)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
sum = get_check_sum(rxdata,datalen+4);
|
||
if(sum != rxdata[datalen + 4])
|
||
{
|
||
txdata[1] = 0xAA;
|
||
txdata[2] = 0;
|
||
txdata[3] = 1;
|
||
txdata[4] = NOT_READY;
|
||
txdata[5] = get_check_sum(txdata,4);
|
||
txdata[6] = 0xBB;
|
||
return 7;
|
||
}
|
||
|
||
|
||
//校验和通过,报文正常
|
||
pframe = (S_FPGA_UP_FRAME_NEW*)&rxdata[0];
|
||
|
||
switch(pframe->cmd)
|
||
{
|
||
case UPGRADE_START:
|
||
// 1:RU_inReset_EnableB 寄存器写1,RU_inCheckIdOnly 和 RU_inVerifyOnly 均置0;
|
||
fpga_byte_write(0x01,FPGA_UPGRADE_CTRL_ADDR,FPGA_UP_CTRL_RESET_EN_MASK);
|
||
log_printf(LOG_DEBUG,I_NOUSED,"1 FPGA_UPGRADE_CTRL_ADDR,FPGA_UP_CTRL_RESET_EN_MASK\n");
|
||
fpga_byte_write(0x01,FPGA_UPGRADE_CTRL_ADDR,FPGA_UP_CTRL_RESET_EN_MASK);
|
||
log_printf(LOG_DEBUG,I_NOUSED,"1 FPGA_UPGRADE_CTRL_ADDR,FPGA_UP_CTRL_RESET_EN_MASK\n");
|
||
|
||
// 2: RU_inReset_EnableB 再写0,开启远程升级;
|
||
fpga_byte_write(0x01,FPGA_UPGRADE_CTRL_ADDR,0);
|
||
fpga_byte_write(0x01,FPGA_UPGRADE_CTRL_ADDR,0);
|
||
ret_data = START_OK;
|
||
|
||
log_printf(LOG_DEBUG,I_NOUSED," 1 FPGA_UPGRADE_CTRL_ADDR,0\n");
|
||
|
||
|
||
upState.curSate=UPSTATE_START;
|
||
upState.errCnt=0;
|
||
upState.lineCnt=0;
|
||
set_fpga_up_result(0);
|
||
ck_cnt=0;
|
||
break;
|
||
|
||
case POLL_ERASER:
|
||
if(GET_FPGA_SPI_MISO()==1){
|
||
ret_data = ERASER_ING;
|
||
upState.curSate=UPSTATE_EARSEING;
|
||
log_printf(LOG_DEBUG,I_NOUSED,"eing--upState.curSate=%s\n", "UPSTATE_EARSEING");
|
||
}
|
||
else{
|
||
rstate = fpga_byte_read(0x01,FPGA_UPGRADE_CTRL_ADDR);
|
||
if(rstate&FPGA_UP_STATUS_EARSE_OK_MASK){
|
||
ret_data = ERASER_END;
|
||
upState.curSate=UPSTATE_EARSE_END;
|
||
g_now_only_upgrade_fpga = 1;
|
||
log_printf(LOG_DEBUG,I_NOUSED,"g_now_only_upgrade_fpga 1\n");
|
||
}
|
||
else{
|
||
ret_data = ERASER_ING;
|
||
upState.curSate=UPSTATE_EARSEING;
|
||
}
|
||
log_printf(LOG_DEBUG,I_NOUSED,"ing|end --- %s, rstate=0x%x\n", upState.curSate==UPSTATE_EARSE_END?"UPSTATE_EARSE_END":"UPSTATE_EARSEING",rstate);
|
||
}
|
||
if(tstFlg==1){
|
||
tstFlg=0;
|
||
ret_data = ERASER_END;
|
||
upState.curSate=UPSTATE_EARSE_END;
|
||
log_printf(LOG_DEBUG,I_NOUSED,"end------upState.curSate=%s\n", "UPSTATE_EARSE_END");
|
||
}
|
||
break;
|
||
|
||
case W_DATA_BLOCK:
|
||
|
||
//接收缓存数据
|
||
memset(recvData,0,sizeof(recvData));
|
||
memcpy(recvData,rxdata+4,datalen);
|
||
|
||
pkgFirstFlg = 1;
|
||
pSemi1 = recvData;
|
||
pSemi2 = recvData;
|
||
|
||
//解析缓存数据
|
||
while(1) {
|
||
//解析出一行数据
|
||
if(pkgFirstFlg){
|
||
pkgFirstFlg=0;
|
||
pSemi1 = strchr(pSemi1,':');
|
||
if(pSemi1==NULL) {
|
||
ret_data = ABORT_ERROR;//错误,一般不进这里
|
||
break;
|
||
}
|
||
}
|
||
|
||
pSemi2 = strchr(pSemi1+1,':');
|
||
if(pSemi2==NULL){
|
||
lineDataLen = strlen(pSemi1);
|
||
pLineData = pSemi1;
|
||
}
|
||
else{
|
||
pLineData = pSemi1;
|
||
lineDataLen = ((uint32)pSemi2 - (uint32)pSemi1);
|
||
pSemi1 = pSemi2;
|
||
}
|
||
|
||
//解析行数据并写入
|
||
if(lineDataLen!=0)
|
||
{
|
||
memset(writeBuf,0,sizeof(writeBuf));
|
||
retDataLen = recv_upgrade_data_parse(pLineData,writeBuf,lineDataLen);//行数据
|
||
upState.lineCnt++;
|
||
|
||
// 写到fpga [16 case .mcs file format .]
|
||
if(retDataLen >= 16)
|
||
{
|
||
//rstate=check_fpga_write_busy_V2();
|
||
rstate=check_fpga_write_busy();
|
||
if(rstate == 0xff){
|
||
log_printf(LOG_DEBUG,I_NOUSED,"check_fpga_write_busy ,rstate =%x\n", rstate);
|
||
#if FPGA_UP_MSG
|
||
send_upgrade_msg(DISPLAY_FPGA_UPGRADE_BUSY_TIMEOUT);
|
||
#endif
|
||
return 0xff;
|
||
}
|
||
|
||
pWriteData = (uint8*)(writeBuf);
|
||
// if(first_byte==0) {
|
||
// for(i = 0; i < retDataLen; i++)
|
||
// printf("0x%x ", pWriteData[i]);
|
||
// printf("\n");
|
||
// first_byte++;
|
||
// }
|
||
while(retDataLen){// 4字节写入
|
||
ispi_fpga_send_buf_4Byte(pWriteData);
|
||
pWriteData = pWriteData+4;
|
||
retDataLen= retDataLen-4;
|
||
}
|
||
upState.curSate = UPSTATE_WRITE;
|
||
ret_data = READY;
|
||
//printf("ready UPSTATE_WRITE\n");
|
||
}
|
||
else if(retDataLen==-1){//全部写结束
|
||
upState.curSate=UPSTATE_FILE_END;
|
||
ck_cnt=0;
|
||
delay_ms(200);
|
||
ret_data = check_fpga_upgrade_done();
|
||
log_printf(LOG_DEBUG,I_NOUSED,"cnt=0 UPSTATE_FILE_END\n");
|
||
g_now_only_upgrade_fpga = 0;
|
||
}
|
||
else if(retDataLen==-2){//长度错误
|
||
upState.curSate=UPSTATE_WRITE;
|
||
ret_data = ABORT_ERROR;
|
||
#if FPGA_UP_MSG
|
||
send_upgrade_msg(DISPLAY_FPGA_UPGRADE_ERR);//MSG_FPGA_UPGRADE_ERR
|
||
#endif
|
||
log_printf(LOG_DEBUG,I_NOUSED,"ABORT_ERROR UPSTATE_WRITE\n");
|
||
g_now_only_upgrade_fpga = 0;
|
||
}
|
||
else{//中间控制字段
|
||
ret_data = READY;
|
||
}
|
||
|
||
}
|
||
else{
|
||
ret_data = ABORT_ERROR;
|
||
g_now_only_upgrade_fpga = 0;
|
||
}
|
||
|
||
if(pSemi1==NULL||pSemi2==NULL)
|
||
{
|
||
break;
|
||
}
|
||
|
||
}
|
||
|
||
break;
|
||
|
||
case W_DATA_BLOCK_LAST:
|
||
if(upState.curSate==UPSTATE_FILE_END)
|
||
{
|
||
|
||
ret_data = check_fpga_upgrade_done();
|
||
if(ret_data==ABORT_SUCCESS){
|
||
ret_data = ABORT_SUCCESS;
|
||
#if FPGA_UP_MSG
|
||
send_upgrade_msg(DISPLAY_FPGA_UPGRADE_OVER);//MSG_FPGA_UPGRADE_OVER
|
||
#endif
|
||
g_now_only_upgrade_fpga = 0;
|
||
log_printf(LOG_DEBUG,I_NOUSED,"ABORT_SUCCESS DISPLAY_FPGA_UPGRADE_OVER g_now_only_upgrade_fpga 0\n");
|
||
}
|
||
else if(ret_data==ABORT_ERROR){
|
||
ret_data = ABORT_ERROR;
|
||
#if FPGA_UP_MSG
|
||
send_upgrade_msg(DISPLAY_FPGA_UPGRADE_ERR);//MSG_FPGA_UPGRADE_ERR
|
||
#endif
|
||
g_now_only_upgrade_fpga = 0;
|
||
log_printf(LOG_DEBUG,I_NOUSED,"ABORT_ERROR DISPLAY_FPGA_UPGRADE_ERR g_now_only_upgrade_fpga 0\n");
|
||
}
|
||
else{
|
||
ck_cnt++;
|
||
if(ck_cnt>=100){
|
||
ret_data = ABORT_ERROR;
|
||
#if FPGA_UP_MSG
|
||
send_upgrade_msg(DISPLAY_FPGA_UPGRADE_ERR);//MSG_FPGA_UPGRADE_ERR
|
||
#endif
|
||
g_now_only_upgrade_fpga = 0;
|
||
log_printf(LOG_DEBUG,I_NOUSED,"ABORT_ERROR DISPLAY_FPGA_UPGRADE_ERR g_now_only_upgrade_fpga 0\n");
|
||
}
|
||
}
|
||
delay_ms(200);
|
||
}
|
||
else{
|
||
ret_data = check_fpga_upgrade_done();
|
||
|
||
if(ret_data==ABORT_SUCCESS){
|
||
ret_data = ABORT_SUCCESS;
|
||
#if FPGA_UP_MSG
|
||
send_upgrade_msg(DISPLAY_FPGA_UPGRADE_OVER);//MSG_FPGA_UPGRADE_OVER
|
||
#endif
|
||
g_now_only_upgrade_fpga = 0;
|
||
log_printf(LOG_DEBUG,I_NOUSED,"ABORT_SUCCESS DISPLAY_FPGA_UPGRADE_OVER g_now_only_upgrade_fpga 0\n");
|
||
}
|
||
else if(ret_data==ABORT_ERROR){
|
||
ret_data = ABORT_ERROR;
|
||
#if FPGA_UP_MSG
|
||
send_upgrade_msg(DISPLAY_FPGA_UPGRADE_ERR);//MSG_FPGA_UPGRADE_ERR
|
||
#endif
|
||
g_now_only_upgrade_fpga = 0;
|
||
log_printf(LOG_DEBUG,I_NOUSED,"ABORT_SUCCESS DISPLAY_FPGA_UPGRADE_ERR g_now_only_upgrade_fpga 0\n");
|
||
}
|
||
else{
|
||
ck_cnt++;
|
||
if(ck_cnt>=100){
|
||
ret_data = ABORT_ERROR;
|
||
#if FPGA_UP_MSG
|
||
send_upgrade_msg(DISPLAY_FPGA_UPGRADE_ERR);//MSG_FPGA_UPGRADE_ERR
|
||
#endif
|
||
g_now_only_upgrade_fpga = 0;
|
||
log_printf(LOG_DEBUG,I_NOUSED,"ABORT_ERROR DISPLAY_FPGA_UPGRADE_ERR g_now_only_upgrade_fpga 0\n");
|
||
}
|
||
}
|
||
delay_ms(200);
|
||
}
|
||
break;
|
||
default:break;
|
||
}
|
||
|
||
txdata[0] = 0xAA;
|
||
txdata[1] = ret_data;
|
||
txdata[2] = 1;
|
||
txdata[3] = 0;
|
||
txdata[4] = ret_data;
|
||
txdata[5] = get_check_sum(txdata,5);
|
||
txdata[6] = 0xBB;
|
||
|
||
return 7;
|
||
}
|
||
|
||
|
||
/*
|
||
void fpga_upgrade_task(void * pvParameters)
|
||
{
|
||
struct sockaddr_in server_addr;
|
||
struct sockaddr_in conn_addr;
|
||
int sock_fd;
|
||
int sock_conn;
|
||
socklen_t addr_len;
|
||
int err;
|
||
int length;
|
||
|
||
task_set_ignore_chk(FPGA_UPGRADE_TASK_ID);
|
||
(void)pvParameters;
|
||
vTaskDelay(10);
|
||
printf("%s init start...\n",__FUNCTION__);
|
||
|
||
|
||
sock_fd = lwip_socket(AF_INET, SOCK_STREAM, 0);
|
||
if (sock_fd == -1)
|
||
{
|
||
printf("failed to create fpga sock_fd!\n");
|
||
}
|
||
|
||
memset(&server_addr, 0, sizeof(server_addr));
|
||
server_addr.sin_family = AF_INET;
|
||
server_addr.sin_addr.s_addr =htonl(INADDR_ANY);
|
||
server_addr.sin_port = htons(UPGRADE_LISTEN_PORT);
|
||
|
||
err = lwip_bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
|
||
if (err < 0)
|
||
{
|
||
printf("failed to bind sock_fd!\n");
|
||
}
|
||
|
||
err = lwip_listen(sock_fd,1); //只允许一个客户端连接
|
||
if (err < 0)
|
||
{
|
||
printf("failed to listen sock_fd!\n");
|
||
}
|
||
|
||
addr_len = sizeof(struct sockaddr_in);
|
||
|
||
printf("%s init over.\n",__FUNCTION__);
|
||
|
||
while(1)
|
||
{ //accept和recv均为阻塞性
|
||
sock_conn = lwip_accept(sock_fd, (struct sockaddr *)&conn_addr, &addr_len);
|
||
while(sock_conn!=-1)
|
||
{
|
||
memset(rxdata, 0, sizeof(rxdata));
|
||
|
||
length = lwip_recv(sock_conn, (unsigned int *)rxdata, MAX_DATA_LEN, 0);
|
||
if(length)
|
||
{
|
||
length = fpga_upgrade_process();
|
||
if(length==0xff){//出错后主动断开连接
|
||
lwip_close(sock_conn);
|
||
sock_conn = -1;
|
||
break;
|
||
|
||
}
|
||
lwip_send(sock_conn, txdata,length, 0);
|
||
}
|
||
else
|
||
{
|
||
lwip_close(sock_conn);
|
||
sock_conn = -1;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}*/
|
||
#endif//FPGA_UPGRADE
|
||
|
||
#if 0//FPGA_UPGRADE
|
||
|
||
#define FPGA1_UPGRADE_ADDRESS (0XFFFF)
|
||
#define FPGA2_UPGRADE_ADDRESS (0X1FFF)
|
||
|
||
#define MAX_DATA_LEN 544
|
||
#define TX_DATA_LEN 10
|
||
|
||
static uint8 rxdata[MAX_DATA_LEN]={0}; //TCP通讯 接收
|
||
static uint8 txdata[TX_DATA_LEN] = //TCP通讯 发送
|
||
{
|
||
0x7E, // head
|
||
0xFF,0xFF, // address
|
||
0x00, // cmd
|
||
0x02,0x00, // data len
|
||
0x00,0x00, // data
|
||
0x00, // sum
|
||
0x0D // tail
|
||
};
|
||
|
||
static uint32 fpga_upgrade_process(void)
|
||
{
|
||
uint32 len = 0;
|
||
uint8 sum = 0;
|
||
S_FPGA_UP_FRAME *pframe;
|
||
uint32 filelen;
|
||
uint32 offset;
|
||
uint8 data = 0;
|
||
|
||
len = (rxdata[5]<<8) | rxdata[4];
|
||
txdata[1] = rxdata[1];
|
||
txdata[2] = rxdata[2]; //address
|
||
|
||
txdata[6] = rxdata[6];
|
||
txdata[7] = rxdata[7];
|
||
|
||
if((rxdata[0] != 0x7E) || (rxdata[len + 7] != 0x0D))
|
||
{
|
||
return 0;
|
||
}
|
||
if(!sys_ready)
|
||
{
|
||
return 0;
|
||
}
|
||
sum = get_check_sum(rxdata,len+6);
|
||
if(sum!=rxdata[len + 6])
|
||
{
|
||
txdata[3] = 0x03;
|
||
txdata[8] = get_check_sum(txdata,8);
|
||
return 10;
|
||
}
|
||
//校验和通过,报文正常
|
||
pframe = (S_FPGA_UP_FRAME*)&rxdata[0];
|
||
switch(pframe->addres)
|
||
{
|
||
case FPGA1_UPGRADE_ADDRESS: default:
|
||
fpga_reset_save_segment();
|
||
switch(pframe->cmd)
|
||
{
|
||
case 0x0:
|
||
txdata[3] = 0x01;
|
||
//写成字节或的形式,直接转指针,开优化选项后,会引起异常
|
||
//filelen = *((uint32*)(rxdata+8));
|
||
filelen = (rxdata[11]<<24)|(rxdata[10]<<16)|(rxdata[9]<<8)|(rxdata[8]<<0);
|
||
//offset = *((uint32*)(rxdata+12));
|
||
offset = (rxdata[15]<<24)|(rxdata[14]<<16)|(rxdata[13]<<8)|(rxdata[12]<<0);
|
||
if(filelen<=offset+len-10)
|
||
{
|
||
MSG *pmsg = alloc_msg();
|
||
|
||
if(pmsg)
|
||
{
|
||
pmsg->type = MSG_FPGA_UPGRADE_OVER;
|
||
pmsg->need_free = MSG_NEED_FREE;
|
||
send_msg(LCD_TASK_ID,pmsg);
|
||
}
|
||
}
|
||
spi_fpga_send_buf((uint8*)(rxdata+16) , len-10);
|
||
break;
|
||
case 0x10: //进入升级模式
|
||
data = fpga_byte_read(0x01,FPGA_UPGRADE_I2C_REG_ADDRES);
|
||
if((data == 0x21) || (data == 0x22))
|
||
{
|
||
fpga_reset_save_segment(); //切换到升级模式后,实际相当于换了个APP,段地址需要强制重发
|
||
fpga_byte_write(0x01,FPGA_UPGRADE_I2C_REG_ADDRES,pframe->cmd);
|
||
}
|
||
break;
|
||
case 0x11: case 0x12: //GOTO app1 //GOTO app2
|
||
data = fpga_byte_read(0x01,FPGA_UPGRADE_I2C_REG_ADDRES);
|
||
fpga_byte_write(0x01,FPGA_UPGRADE_I2C_REG_ADDRES,pframe->cmd);
|
||
break;
|
||
case 0x13:
|
||
data = fpga_byte_read(0x01,FPGA_UPGRADE_I2C_REG_ADDRES);
|
||
fpga_byte_write(0x01,FPGA_UPGRADE_I2C_REG_ADDRES,pframe->cmd);
|
||
break;
|
||
case 0x14:
|
||
data = fpga_byte_read(0x01,FPGA_UPGRADE_I2C_REG_ADDRES);
|
||
fpga_byte_write(0x01,FPGA_UPGRADE_I2C_REG_ADDRES,pframe->cmd);
|
||
break;
|
||
case 0x15: case 0x16: case 0x17:
|
||
data = fpga_byte_read(0x01,FPGA_UPGRADE_I2C_REG_ADDRES);
|
||
fpga_byte_write(0x01,FPGA_UPGRADE_I2C_REG_ADDRES,pframe->cmd);
|
||
break;
|
||
case 0x18:
|
||
data = fpga_byte_read(0x01,FPGA_UPGRADE_I2C_REG_ADDRES);
|
||
break;
|
||
}
|
||
fpga_reset_save_segment();
|
||
break;
|
||
}
|
||
if(pframe->cmd>=0x10)
|
||
{
|
||
txdata[3] = pframe->cmd;
|
||
txdata[4] = 0x01;
|
||
txdata[5] = 0x00;
|
||
txdata[6] = data;
|
||
txdata[7] = get_check_sum(txdata,7);
|
||
txdata[8] = 0x0d;
|
||
txdata[9] = 0x00;
|
||
}
|
||
else
|
||
{
|
||
txdata[3] = 1;
|
||
txdata[4] = 0x02;
|
||
txdata[5] = 0x00;
|
||
txdata[6] = 0;
|
||
txdata[7] = 0;
|
||
txdata[8] = get_check_sum(txdata,8);
|
||
txdata[9] = 0x0d;
|
||
}
|
||
return 10;
|
||
}
|
||
/*
|
||
void fpga_upgrade_task(void * pvParameters)
|
||
{
|
||
struct sockaddr_in server_addr;
|
||
struct sockaddr_in conn_addr;
|
||
int sock_fd;
|
||
int sock_conn;
|
||
socklen_t addr_len;
|
||
int err;
|
||
int length;
|
||
|
||
(void)pvParameters;
|
||
task_set_ignore_chk(FPGA_UPGRADE_TASK_ID);
|
||
vTaskDelay(10);
|
||
printf("%s init start...\n",__FUNCTION__);
|
||
|
||
|
||
sock_fd = lwip_socket(AF_INET, SOCK_STREAM, 0);
|
||
if (sock_fd == -1)
|
||
{
|
||
printf("failed to create fpga sock_fd!\n");
|
||
}
|
||
|
||
memset(&server_addr, 0, sizeof(server_addr));
|
||
server_addr.sin_family = AF_INET;
|
||
server_addr.sin_addr.s_addr =htonl(INADDR_ANY);
|
||
server_addr.sin_port = htons(UPGRADE_LISTEN_PORT);
|
||
|
||
err = lwip_bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
|
||
if (err < 0)
|
||
{
|
||
printf("failed to bind sock_fd!\n");
|
||
}
|
||
|
||
err = lwip_listen(sock_fd,1); //只允许一个客户端连接
|
||
if (err < 0)
|
||
{
|
||
printf("failed to listen sock_fd!\n");
|
||
}
|
||
|
||
addr_len = sizeof(struct sockaddr_in);
|
||
|
||
printf("%s init over.\n",__FUNCTION__);
|
||
|
||
while(1)
|
||
{ //accept和recv均为阻塞性
|
||
sock_conn = lwip_accept(sock_fd, (struct sockaddr *)&conn_addr, &addr_len);
|
||
while(sock_conn!=-1)
|
||
{
|
||
memset(rxdata, 0, sizeof(rxdata));
|
||
|
||
length = lwip_recv(sock_conn, (unsigned int *)rxdata, MAX_DATA_LEN, 0);
|
||
if(length)
|
||
{
|
||
length = fpga_upgrade_process();
|
||
lwip_send(sock_conn, txdata,length, 0);
|
||
}
|
||
else
|
||
{
|
||
lwip_close(sock_conn);
|
||
sock_conn = -1;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}*/
|
||
#endif
|
||
#if USE_SPECT_DATA_TASK
|
||
extern void spi0_read(uint32 len,void *pdata,uint32 restart);
|
||
static uint32 tcp_spect_init_send_frame(uint32 param,struct tcp_data_frame * pframe);
|
||
|
||
|
||
static uint8 spect_data_buf[TCP_FRAME_DATA_LEN+32]; //FPGA读取的数据 1次读取1K字节,共256个复数
|
||
static uint8 tcp_rec_buf[TCP_SPECT_REC_BUF_LEN]; //接收报文缓冲区
|
||
static uint8 tcp_send_buf[TCP_SPECT_SEND_BUF_LEN]; //发送报文缓冲区
|
||
|
||
|
||
static uint32 licence_valid = FALSE; //系统授权法是否有效合法,默认为FALSE
|
||
static uint64 sn = 0;
|
||
static uint32 input_licence = 0;
|
||
|
||
#if SPECT_DEBUG_MODE
|
||
extern uint32 check_delay_over(uint32 *ptick,uint32 cycle);
|
||
extern void Delayus(uint32 m);
|
||
extern int sprintf(char *,const char *,...);
|
||
#endif
|
||
|
||
/*****************************************************************************
|
||
函 数 名 : spect_update_imd_snr
|
||
功能描述 : 更新FPGA的SNR和IMD信息
|
||
输入参数 : void
|
||
输出参数 : 无
|
||
返 回 值 : static
|
||
调用函数 :
|
||
被调函数 :
|
||
|
||
修改历史 :
|
||
1.日 期 : 2013年2月27日
|
||
作 者 : 郭金涛
|
||
修改内容 : 新生成函数
|
||
|
||
*****************************************************************************/
|
||
static void spect_update_imd_snr(struct snr_imd *psnr)
|
||
{
|
||
if(!psnr)
|
||
return;
|
||
|
||
psnr->rsnr = fpga_byte_read(0x1,0x44);
|
||
psnr->tsnr = fpga_byte_read(0x1,0x46);
|
||
psnr->limd = fpga_byte_read(0x1,0x45);
|
||
psnr->uimd = fpga_byte_read(0x1,0x47);
|
||
}
|
||
/*****************************************************************************
|
||
函 数 名 : spect_update_data
|
||
功能描述 : 更新发送的频谱数据信息
|
||
输入参数 : void
|
||
输出参数 : 无
|
||
返 回 值 : void
|
||
调用函数 :
|
||
被调函数 :
|
||
|
||
修改历史 :
|
||
1.日 期 : 2013年1月30日
|
||
作 者 : 郭金涛
|
||
修改内容 : 新生成函数
|
||
一共需更新16KB的数据,当前FPGA只支持单字节读取(不支持连续模式),经测试,16kB数据全部读完至少10s以上
|
||
由于本任务优先级较高,其它任务将被挂起,因此此时液晶按键,串口等都不再响应;
|
||
*****************************************************************************/
|
||
static void spect_update_data(uint32 index)
|
||
{
|
||
uint32 restart_flag = 0;
|
||
struct snr_imd* psnr;
|
||
struct frame_struct* pdata;
|
||
|
||
if(index==1) //第一帧,需要发送数据重发标志 32k为一个整体,读32k后,重新读取
|
||
restart_flag = 1;
|
||
else
|
||
restart_flag = 0;
|
||
#if 1
|
||
spect_spi_read(TCP_FRAME_DATA_LEN,spect_data_buf,restart_flag);
|
||
#endif
|
||
pdata = (struct frame_struct*)spect_data_buf;
|
||
psnr = &pdata->snr_imd_data;
|
||
spect_update_imd_snr(psnr); //每帧都发snr和imd信息
|
||
}
|
||
|
||
|
||
/*****************************************************************************
|
||
函 数 名 : spect_frame_check_valid
|
||
功能描述 : 检查协议格式是否正确,至于处理则有外围函数处理
|
||
格式检查比较简单,未采用遍历模式
|
||
输入参数 : uint8 *pframe
|
||
输出参数 : 无
|
||
返 回 值 : SPECT_FRAME_ERR
|
||
调用函数 :
|
||
被调函数 :
|
||
|
||
修改历史 :
|
||
1.日 期 : 2013年2月4日
|
||
作 者 : 郭金涛
|
||
修改内容 : 新生成函数
|
||
|
||
*****************************************************************************/
|
||
static uint32 spect_frame_check_valid(uint8 *pframe)
|
||
{
|
||
struct tcp_data_frame *pspect_frame = NULL;
|
||
uint8 calc_sum = 0;
|
||
|
||
pspect_frame = (struct tcp_data_frame *)pframe;
|
||
if(pspect_frame->id!=std_r[0])
|
||
{
|
||
spect_printf("%s:id err!(%02x)\n",__FUNCTION__,pspect_frame->id);
|
||
return FRAME_ERR_ID;
|
||
}
|
||
if(pspect_frame->header!=FRAME_HEADER)
|
||
{
|
||
spect_printf("%s:header err!(%02x)\n",__FUNCTION__,pspect_frame->header);
|
||
return FRAME_ERR_HEADER;
|
||
}
|
||
if(pspect_frame->len<FRAME_WITHOUT_DATA_LEN)
|
||
{
|
||
spect_printf("%s:len err!(%02x)\n",__FUNCTION__,pspect_frame->len);
|
||
return FRAME_ERR_LEN;
|
||
}
|
||
calc_sum = get_check_sum(pframe,pspect_frame->len-2);
|
||
if(pframe[pspect_frame->len-2]!=calc_sum)
|
||
{
|
||
spect_printf("%s:sum err!(frame:%02x,calc:%02x)\n",__FUNCTION__,pframe[pspect_frame->len-2],calc_sum);
|
||
return FRAME_ERR_SUM;
|
||
}
|
||
if(pframe[pspect_frame->len-1]!=FRAME_TAIL)
|
||
{
|
||
spect_printf("%s:tail err!(%02x)\n",__FUNCTION__,pframe[pspect_frame->len-1]);
|
||
return FRAME_ERR_TAIL;
|
||
}
|
||
return FRAME_ERR_NONE;
|
||
}
|
||
|
||
|
||
static uint32 spect_frame_read1(struct tcp_data_frame * precframe)
|
||
{
|
||
uint8 index1,index2;
|
||
uint16 ans_index = 0;
|
||
#if SPECT_TASK_UART_DEBUG
|
||
static uint32 tick_bak = 0;
|
||
#endif
|
||
|
||
//若为应答命令,仅存在于多帧模式下(读命令),主机方才会发送ack命令
|
||
if(precframe->cmd&(SPECT_CMD_ACK))
|
||
{
|
||
index1 = (uint8)((precframe->index&0xff00)>>8);
|
||
index2 = (uint8)(precframe->index&0x00ff);
|
||
spect_printf("%s:ack frame.index1:%02x,index2:%02x.\n",__FUNCTION__,index1,index2);
|
||
if(index2!=0)
|
||
{
|
||
if(index1==index2) //数据发送完毕 最后一帧
|
||
{ //当前32帧发送完成大约需要1.5s左右
|
||
spect_printf("use tick:%d\n",get_sys_tick()-tick_bak);
|
||
return 0;
|
||
}
|
||
index1++;
|
||
}
|
||
else //非多帧,直接返回
|
||
return 0;
|
||
}
|
||
else
|
||
{
|
||
index1 = 1;
|
||
index2 = (TCP_DATA_BUF_LEN/TCP_FRAME_DATA_LEN); //16
|
||
#if SPECT_TASK_UART_DEBUG
|
||
tick_bak = get_sys_tick();
|
||
spect_printf("%s:read frame.index1:%02x,index2:%02x.\n",__FUNCTION__,index1,index2);
|
||
#endif
|
||
}
|
||
//接收到读取命令,更新本地数据 时间较长,更新全部还是更新1k
|
||
spect_printf("%s:Rec Send Data Frame\n",__FUNCTION__);
|
||
spect_update_data(index1);
|
||
ans_index = (index1<<8) | index2; //生成应答的index域
|
||
return tcp_spect_init_send_frame(ans_index,precframe);
|
||
}
|
||
|
||
|
||
|
||
static uint32 spect_frame_read2(struct tcp_data_frame * pframe)
|
||
{
|
||
if(pframe->cmd&SPECT_CMD_ACK)
|
||
{
|
||
return 0; //非多帧,不存在应答命令
|
||
}
|
||
spect_printf("%s:Rec Send IMD SNR Frame\n",__FUNCTION__);
|
||
spect_update_imd_snr((struct snr_imd*)spect_data_buf);
|
||
return tcp_spect_init_send_frame(0,pframe); //单帧命令,index区域直接置0
|
||
}
|
||
|
||
static uint32 spect_frame_ret_err_licence(struct tcp_data_frame * pframe)
|
||
{
|
||
spect_printf("%s:Rec Send IMD SNR Frame\n",__FUNCTION__);
|
||
|
||
pframe->cmd = FRAME_CMD_RETURN_ERR_LICENCE; //不太好吧?!
|
||
return tcp_spect_init_send_frame(0,pframe); //单帧命令,index区域直接置0
|
||
}
|
||
|
||
#define USE_DBG_SPEC 0
|
||
//暂时无内容,函数为空
|
||
static uint32 spect_frame_write1(struct tcp_data_frame * pspect)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
static uint32 spect_proc(void)
|
||
{
|
||
struct tcp_data_frame *pspect_frame = NULL;
|
||
uint32 send_len = 0;
|
||
|
||
if(spect_frame_check_valid((uint8*)tcp_rec_buf)!=FRAME_ERR_NONE)
|
||
return send_len;
|
||
|
||
pspect_frame = (struct tcp_data_frame *)tcp_rec_buf;
|
||
#if USE_DBG_SPEC
|
||
#else
|
||
if(licence_valid==FALSE)
|
||
{
|
||
spect_frame_ret_err_licence(pspect_frame);
|
||
return send_len;
|
||
}
|
||
#endif
|
||
switch(pspect_frame->cmd&(~SPECT_CMD_ACK))
|
||
{
|
||
case FRAME_CMD_READ_1:
|
||
send_len = spect_frame_read1(pspect_frame);
|
||
break;
|
||
case FRAME_CMD_READ_2: //snr和imd信息,在read1命令中每帧均返回,时间太长
|
||
send_len = spect_frame_read2(pspect_frame);
|
||
break;
|
||
case FRAME_CMD_WRITE_1:
|
||
send_len = spect_frame_write1(pspect_frame);
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
return send_len;
|
||
}
|
||
|
||
static uint32 tcp_spect_init_send_frame(uint32 param,struct tcp_data_frame * precframe)
|
||
{
|
||
struct tcp_data_frame *pout_frame =(struct tcp_data_frame *)tcp_send_buf;
|
||
|
||
//memset(pout_frame,0xff,128); //测试,正式代码不用memset
|
||
//memcpy((void*)pout_frame,(void*)precframe,FRAME_WITHOUT_DATA_LEN-2); //拷贝数据区前的内容 此处执行会出现异常,原因待查(是4字节对齐的啊!)
|
||
|
||
pout_frame->id = precframe->id;
|
||
pout_frame->header= precframe->header;
|
||
pout_frame->cmd = precframe->cmd;
|
||
pout_frame->index = (uint16)param;
|
||
pout_frame->cmd = precframe->cmd&(~SPECT_CMD_ACK);
|
||
|
||
|
||
switch(precframe->cmd&(~SPECT_CMD_ACK))
|
||
{ //注意:向pdata拷贝数据区时,必须对其取址
|
||
case FRAME_CMD_READ_1: //复数数据
|
||
pout_frame->len = TCP_FRAME_DATA_LEN+FRAME_WITHOUT_DATA_LEN+TCP_FRAM_SNR_IMD_LEN; //每帧都额外传送snr和imd信息
|
||
memcpy((void*)&pout_frame->pdata,spect_data_buf,TCP_FRAME_DATA_LEN+TCP_FRAM_SNR_IMD_LEN);
|
||
break;
|
||
case FRAME_CMD_READ_2: //snr和imd 信息
|
||
pout_frame->len = sizeof(struct snr_imd)+FRAME_WITHOUT_DATA_LEN;
|
||
memcpy((void*)&pout_frame->pdata,spect_data_buf,sizeof(struct snr_imd));
|
||
break;
|
||
case FRAME_CMD_RETURN_ERR_LICENCE:
|
||
pout_frame->len = sizeof(sn)+sizeof(input_licence)+FRAME_WITHOUT_DATA_LEN;
|
||
memcpy((void*)&pout_frame->pdata,&sn,sizeof(sn));
|
||
memcpy((void*)(sizeof(sn)+(uint32)&pout_frame->pdata),&input_licence,sizeof(input_licence));
|
||
break;
|
||
default:
|
||
pout_frame->len = 0+FRAME_WITHOUT_DATA_LEN;
|
||
break;
|
||
}
|
||
//对pdata后的成员需用len 的偏移量来访问
|
||
tcp_send_buf[pout_frame->len-2] = get_check_sum(tcp_send_buf,pout_frame->len-2);
|
||
tcp_send_buf[pout_frame->len-1] = FRAME_TAIL;
|
||
spect_printf("%s\n",__FUNCTION__);
|
||
|
||
return pout_frame->len;
|
||
}
|
||
|
||
//校验输入的授权码是否合法 在上电与更改SN或者GUI_KEY时调用(必须)
|
||
//授权码采用PRBS算法(多项式为X15+X14+1)
|
||
extern uint32 prbs_key_get(uint64 sn_in);
|
||
//校验输入的授权码是否合法 在上电与更改SN或者GUI_KEY时调用(必须)
|
||
//授权码采用PRBS算法(多项式为X15+X14+1)
|
||
void tcp_spect_calc_sn_licence(uint32 key,uint64 *psn)
|
||
{
|
||
if(!psn)
|
||
return;
|
||
|
||
sn = *psn;
|
||
input_licence = key;
|
||
|
||
if(sn==0)
|
||
{
|
||
licence_valid = FALSE;
|
||
return;
|
||
}
|
||
|
||
if(prbs_key_get(sn)==key)
|
||
{
|
||
licence_valid = TRUE;
|
||
}
|
||
else
|
||
{
|
||
licence_valid = FALSE;
|
||
}
|
||
}
|
||
|
||
/*
|
||
|
||
void spect_data_task(void * pvParameters)
|
||
{
|
||
struct sockaddr_in server_addr;
|
||
struct sockaddr_in conn_addr;
|
||
int sock_fd;
|
||
int sock_conn;
|
||
socklen_t addr_len;
|
||
int err;
|
||
int length;
|
||
|
||
(void)pvParameters;
|
||
vTaskDelay(15);
|
||
task_set_ignore_chk(SPECT_TASK_ID);
|
||
|
||
printf("%s init start...\n",__FUNCTION__);
|
||
|
||
|
||
sock_fd = lwip_socket(AF_INET, SOCK_STREAM, 0);
|
||
if (sock_fd == -1)
|
||
{
|
||
printf("failed to create sock_fd!\n");
|
||
}
|
||
|
||
memset(&server_addr, 0, sizeof(server_addr));
|
||
server_addr.sin_family = AF_INET;
|
||
server_addr.sin_addr.s_addr =htonl(INADDR_ANY);
|
||
server_addr.sin_port = htons(TCP_SPECT_COMM_PORT);
|
||
|
||
err = lwip_bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
|
||
if (err < 0)
|
||
{
|
||
printf("failed to bind sock_fd!\n");
|
||
}
|
||
|
||
err = lwip_listen(sock_fd,5);
|
||
if (err < 0)
|
||
{
|
||
printf("failed to listen sock_fd!\n");
|
||
}
|
||
|
||
addr_len = sizeof(struct sockaddr_in);
|
||
|
||
printf("%s init over.\n",__FUNCTION__);
|
||
|
||
while(1)
|
||
{ //accept和recv均为阻塞性
|
||
sock_conn = lwip_accept(sock_fd, (struct sockaddr *)&conn_addr, &addr_len);
|
||
while(sock_conn!=-1)
|
||
{
|
||
memset(tcp_rec_buf, 0, sizeof(tcp_rec_buf));
|
||
|
||
length = lwip_recv(sock_conn, (unsigned int *)tcp_rec_buf, TCP_SPECT_REC_BUF_LEN, 0);
|
||
if(length)
|
||
{
|
||
length = spect_proc();
|
||
if(length)
|
||
{
|
||
lwip_send(sock_conn, tcp_send_buf,length, 0);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
lwip_close(sock_conn);
|
||
sock_conn = -1;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
*/
|
||
|
||
#endif
|
||
#if 0
|
||
uint8 ts_buf[188*7];
|
||
|
||
void ts2ip_task(void *pvParameters)
|
||
{
|
||
struct sockaddr_in client_addr;
|
||
int sock_fd;
|
||
int send_len;
|
||
uint32 count = 0;
|
||
uint8 value = 0;
|
||
uint32 tick_bak = 0;
|
||
uint32 rate = 0;
|
||
|
||
(void)pvParameters;
|
||
vTaskDelay(10);
|
||
printf("%s init start...\n",__FUNCTION__);
|
||
|
||
|
||
sock_fd = lwip_socket(AF_INET, SOCK_DGRAM, 0);
|
||
if (sock_fd == -1)
|
||
{
|
||
printf("failed to create sock_fd!\n");
|
||
}
|
||
|
||
memset(&client_addr, 0, sizeof(client_addr));
|
||
client_addr.sin_family = AF_INET;
|
||
client_addr.sin_addr.s_addr =inet_addr("192.168.1.55");
|
||
client_addr.sin_port = htons(4321);
|
||
|
||
tick_bak = get_sys_tick();
|
||
rate = 0;
|
||
while(1)
|
||
{
|
||
value++;
|
||
memset(ts_buf,value,sizeof(ts_buf));
|
||
send_len = lwip_sendto(sock_fd, ts_buf, sizeof(ts_buf), 0,(struct sockaddr *)&client_addr, sizeof(client_addr));
|
||
if(send_len==sizeof(ts_buf))
|
||
{
|
||
count++;
|
||
rate++;
|
||
}
|
||
if(check_delay_over(&tick_bak,OS_TICKS_PER_SEC*2))
|
||
{
|
||
printf("TS2IP task send rate:%dMB/s,tatal packet:%d\n",rate*sizeof(ts_buf)/1024/1024,count);
|
||
rate = 0;
|
||
}
|
||
}
|
||
}
|
||
#endif
|
||
#if USE_TS_CHECK || USE_GPS_CHECK
|
||
//根据系统配置发送告警信息
|
||
void send_alarm(E_ALARM alarm,void *pinfo)
|
||
{
|
||
#if 1
|
||
uint8 temp_out_buf[36]={0};
|
||
uint32 len = 0;
|
||
uint32 check_sum;
|
||
if(atsc_para.wb_para.alarm==0)
|
||
return;
|
||
|
||
temp_out_buf[len++]=0x76;
|
||
len++; //略过长度区域
|
||
temp_out_buf[len++]=c256_byteread(EEPROM_ID_ADDR);
|
||
temp_out_buf[len++]=0xf0+(uint8)alarm; //命令代码
|
||
|
||
switch(alarm)
|
||
{
|
||
case ALARM_GPS:
|
||
{
|
||
GPGSA_T *gps_gsa = NULL;
|
||
S_SYS_TIME time;
|
||
S_ALARM_GPS_LOCK *pgps =(S_ALARM_GPS_LOCK *)pinfo;
|
||
|
||
get_sys_time(&time);
|
||
#if USE_GPS
|
||
gps_gsa = gps_get_sa();
|
||
#endif
|
||
temp_out_buf[len++]=pgps->lock_status;
|
||
temp_out_buf[len++]=0xFF;//gps_gsa->fix_status;
|
||
temp_out_buf[len++]=gps_gsa->sv;
|
||
temp_out_buf[len++]=pgps->status;
|
||
|
||
temp_out_buf[len++]= time.year%100;
|
||
temp_out_buf[len++]= time.month&0xff;
|
||
temp_out_buf[len++]= time.date&0xff;
|
||
temp_out_buf[len++]= time.hour&0xff;
|
||
temp_out_buf[len++]= time.min&0xff;
|
||
temp_out_buf[len++]= time.sec&0xff;
|
||
temp_out_buf[1] = len+2; //还有校验和和尾没算
|
||
}
|
||
break;
|
||
case ALARM_TS:
|
||
{
|
||
E_TS_ERR_TYPE *pts = (E_TS_ERR_TYPE*)pinfo;
|
||
temp_out_buf[len++]=*pts; //固定传一个字节
|
||
temp_out_buf[len++]=0;
|
||
temp_out_buf[1] = len+2; //还有校验和和尾没算
|
||
|
||
}
|
||
break;
|
||
default:
|
||
return;
|
||
}
|
||
check_sum = get_check_sum(temp_out_buf,len);
|
||
temp_out_buf[len++]= check_sum;
|
||
temp_out_buf[len++] = 0X96;
|
||
|
||
//暂时串口直接发送,UDP以消息模式
|
||
switch(atsc_para.wb_para.alarm) // 0无,1串口,2网口,3全部
|
||
{
|
||
case 1: // uart
|
||
rs485_send_string(temp_out_buf,len);
|
||
break;
|
||
case 2: // eth
|
||
sendto(alarm_sockfd, temp_out_buf, len, 0, (struct sockaddr *)&alarm_clientaddr, sizeof(alarm_clientaddr));
|
||
break;
|
||
case 3: // both
|
||
rs485_send_string(temp_out_buf,len);
|
||
sendto(alarm_sockfd, temp_out_buf, len, 0, (struct sockaddr *)&alarm_clientaddr, sizeof(alarm_clientaddr));
|
||
break;
|
||
default: break;
|
||
}
|
||
#endif
|
||
}
|
||
|
||
void check_ts_err_status(void)
|
||
{
|
||
S_ASI_INPUT current_asi_status;
|
||
static S_ASI_INPUT save_asi_status = {ASI_NONE_ERR,ASI_ERR};
|
||
E_TS_ERR_TYPE ts_err_info = TS_ERR_NO_CHANGE;
|
||
|
||
if(update_flag)
|
||
return;
|
||
|
||
if(atsc_para.wb_para.alarm==0)
|
||
return;
|
||
|
||
current_asi_status.input = (ASI_GRP_STATE)atsc_para.log_para.asi_input;
|
||
current_asi_status.status = (ASI_INPUT_STATE)(atsc_para.log_para.input_ok_flag?0:1);
|
||
if(current_asi_status.input!=save_asi_status.input)
|
||
{
|
||
if(current_asi_status.status!=save_asi_status.status)
|
||
{
|
||
if(current_asi_status.status==ASI_OK)
|
||
ts_err_info = TS_ERR_CHANGE_OK;
|
||
else
|
||
ts_err_info = TS_ERR_CHANGE_ERR;
|
||
|
||
save_asi_status = current_asi_status;
|
||
send_alarm(ALARM_TS,&ts_err_info);
|
||
}
|
||
}
|
||
}
|
||
void check_ts_err_log(void)
|
||
{
|
||
S_ASI_INPUT current_asi_status[4];
|
||
static S_ASI_INPUT save_asi_status[4] = {
|
||
ASI_NONE_ERR,ASI_ERR,
|
||
ASI_NONE_ERR,ASI_ERR,
|
||
ASI_NONE_ERR,ASI_ERR,
|
||
ASI_NONE_ERR,ASI_ERR};
|
||
E_TS_ERR_TYPE ts_err_info = TS_ERR_NO_CHANGE;
|
||
uint8 input_type = 0;
|
||
uint8 index = 0;
|
||
|
||
|
||
if(update_flag)
|
||
return;
|
||
|
||
index = (ASI_GRP_STATE)atsc_para.log_para.asi_input;
|
||
current_asi_status[index].status = (ASI_INPUT_STATE)(atsc_para.log_para.input_ok_flag?0:1);
|
||
|
||
if(current_asi_status[index].status != save_asi_status[index].status)
|
||
{
|
||
input_type = index;
|
||
if(current_asi_status[index].status == ASI_OK)
|
||
log_system_event_generate(NULL,LOG_TYPE_TS_OK,&input_type,1); // send msg to log_task
|
||
else
|
||
log_system_event_generate(NULL,LOG_TYPE_TS_ERR,&input_type,1); // send msg to log_task
|
||
|
||
save_asi_status[index].status = current_asi_status[index].status;
|
||
}
|
||
}
|
||
|
||
|
||
void check_fpga_gps_lock_status(void)
|
||
{
|
||
static BOOL save_lock_flag = FALSE;
|
||
BOOL current_lock_flag;
|
||
uint8 tmp = 0;
|
||
S_ALARM_GPS_LOCK gps_lock_status;
|
||
|
||
if(update_flag)
|
||
return;
|
||
|
||
if(atsc_para.log_para.use_gps==0) //INT 才判断
|
||
return;
|
||
if(atsc_para.wb_para.alarm==0)
|
||
return;
|
||
|
||
tmp = fpga_byte_read(0x1,0x8a);
|
||
if(tmp&0x10)
|
||
current_lock_flag = TRUE; //locked;
|
||
else
|
||
current_lock_flag = FALSE;
|
||
|
||
if(current_lock_flag==save_lock_flag)
|
||
return;
|
||
|
||
save_lock_flag = current_lock_flag;
|
||
|
||
gps_lock_status.lock_status = (uint8)save_lock_flag;
|
||
gps_lock_status.status = tmp&0x0f;
|
||
if(current_lock_flag==TRUE)
|
||
log_system_event_generate(NULL,LOG_TYPE_GPS_LOCK,NULL,0); // send msg to log_task
|
||
else
|
||
log_system_event_generate(NULL,LOG_TYPE_GPS_UNLOCK,NULL,0); // send msg to log_task
|
||
|
||
send_alarm(ALARM_GPS,&gps_lock_status);
|
||
}
|
||
|
||
void check_temperature_status(void)
|
||
{
|
||
S_LOG_PARA * pLogPara = NULL;
|
||
static uint8 old_overtemp_flg = 0;
|
||
uint8 current_overtemp_flg;
|
||
|
||
if(update_flag)
|
||
return;
|
||
|
||
pLogPara = &atsc_para.log_para;
|
||
current_overtemp_flg = pLogPara->temperature[0]&0x01;
|
||
if(current_overtemp_flg == old_overtemp_flg)
|
||
return;
|
||
|
||
old_overtemp_flg = current_overtemp_flg;
|
||
if(current_overtemp_flg) // HIGH
|
||
log_system_event_generate(NULL,LOG_TYPE_OVER_TEMPERATURE,NULL,0);
|
||
else
|
||
log_system_event_generate(NULL,LOG_TYPE_NORMAL_TEMPERATURE,NULL,0);
|
||
}
|
||
|
||
void check_overflow_status(void)
|
||
{
|
||
S_LOG_PARA * pLogPara = NULL;
|
||
static uint8 old_overflow_flg = 0;
|
||
static uint8 old_underflow_flg = 0;
|
||
uint8 current_overflow_flg;
|
||
uint8 current_underflow_flg;
|
||
|
||
if(update_flag)
|
||
return;
|
||
|
||
pLogPara = &atsc_para.log_para;
|
||
current_overflow_flg = pLogPara->ts_rate&0x01;
|
||
current_underflow_flg = atsc_para.log_para.ts_under;
|
||
|
||
//Overflow
|
||
if(current_overflow_flg == old_overflow_flg)
|
||
return;
|
||
else
|
||
{
|
||
old_overflow_flg = current_overflow_flg;
|
||
if(current_overflow_flg) // HIGH
|
||
log_system_event_generate(NULL,LOG_TYPE_OVER_FLOW,NULL,0);
|
||
}
|
||
|
||
//Underflow
|
||
if(current_underflow_flg == old_underflow_flg)
|
||
return;
|
||
else if(current_underflow_flg)
|
||
{
|
||
old_underflow_flg = current_underflow_flg;
|
||
log_system_event_generate(NULL,LOG_TYPE_UNDER_FLOW,NULL,0);
|
||
}
|
||
|
||
}
|
||
|
||
void check_send_alarm_state(void)
|
||
{
|
||
#if USE_TS_CHECK
|
||
#if 1//_USE_RVL_
|
||
check_ts_err_status();
|
||
check_ts_err_log();
|
||
#endif
|
||
#endif
|
||
|
||
#if USE_GPS_CHECK
|
||
#if 1//_USE_RVL_
|
||
check_fpga_gps_lock_status();
|
||
#endif
|
||
#endif
|
||
|
||
#if USE_TEMPERATURE_CHECK
|
||
#if 1//_USE_RVL_
|
||
check_temperature_status();
|
||
#endif
|
||
#endif
|
||
|
||
#if USE_OVERFLOW_CHECK
|
||
#if 1//_USE_RVL_
|
||
check_overflow_status();
|
||
#endif
|
||
#endif
|
||
}
|
||
|
||
|
||
#if 0
|
||
/*****************************************************************************
|
||
* Function : check_alarm_sendto_log
|
||
* Description :
|
||
* Input : void
|
||
* Output : None
|
||
* Return :
|
||
* Others :
|
||
* Record
|
||
* 1.Date : 20191106
|
||
* Author : WangShu
|
||
* Modification: Created function
|
||
bit
|
||
[0] :overtemp
|
||
[1] :GPS UNLOCK/LOCK
|
||
[2] :overflow/underflow
|
||
[3-4]:INPUT
|
||
[5] :INPUT STATUS
|
||
|
||
|
||
*****************************************************************************/
|
||
void check_alarm_sendto_log(void)
|
||
{
|
||
S_LOG_PARA *pLogData;
|
||
|
||
pLogData = &atsc_para.log_para;
|
||
|
||
}
|
||
#endif
|
||
#endif
|
||
|
||
|
||
#define SPECT_PRBS_CALC_TIME (120) //实际只取计算的后32位,计算太少,看起来比较有规律行
|
||
|
||
//利用prbs算法,由输入的sn,计算出一个特殊的32位数值
|
||
uint32 prbs_key_get(uint64 sn_in)
|
||
{
|
||
uint32 i = 0;
|
||
uint32 bit15 = 0;
|
||
uint32 bit14 = 0;
|
||
uint32 bit0 = 0;
|
||
uint32 prbs = 0;
|
||
|
||
for(i=0;i<SPECT_PRBS_CALC_TIME;i++)
|
||
{
|
||
prbs|=(sn_in&1);
|
||
prbs<<=1;
|
||
bit15 = (sn_in>>15)&1;
|
||
bit14 = (sn_in>>14)&1;
|
||
bit0 = bit15^bit14;
|
||
bit0 &=1;
|
||
sn_in=(sn_in<<1)|bit0;
|
||
}
|
||
return prbs;
|
||
}
|
||
|
||
#define __usr_net_thr__ 1
|
||
#if __usr_net_thr__//THR
|
||
|
||
#if USE_SPECT_DATA_TASK
|
||
/*void spect_data_task(void * pvParameters)
|
||
{
|
||
|
||
struct sockaddr_in server_addr;
|
||
struct sockaddr_in conn_addr;
|
||
int sock_fd;
|
||
int sock_conn;
|
||
socklen_t addr_len;
|
||
int err;
|
||
int length;
|
||
|
||
(void)pvParameters;
|
||
vTaskDelay(15);
|
||
task_set_ignore_chk(SPECT_TASK_ID);
|
||
|
||
printf("%s init start...\n",__FUNCTION__);
|
||
|
||
|
||
sock_fd = lwip_socket(AF_INET, SOCK_STREAM, 0);
|
||
if (sock_fd == -1)
|
||
{
|
||
printf("failed to create sock_fd!\n");
|
||
}
|
||
|
||
memset(&server_addr, 0, sizeof(server_addr));
|
||
server_addr.sin_family = AF_INET;
|
||
server_addr.sin_addr.s_addr =htonl(INADDR_ANY);
|
||
server_addr.sin_port = htons(TCP_SPECT_COMM_PORT);
|
||
|
||
err = lwip_bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
|
||
if (err < 0)
|
||
{
|
||
printf("failed to bind sock_fd!\n");
|
||
}
|
||
|
||
err = lwip_listen(sock_fd,5);
|
||
if (err < 0)
|
||
{
|
||
printf("failed to listen sock_fd!\n");
|
||
}
|
||
|
||
addr_len = sizeof(struct sockaddr_in);
|
||
|
||
printf("%s init over.\n",__FUNCTION__);
|
||
|
||
while(1)
|
||
{ //accept和recv均为阻塞性
|
||
sock_conn = lwip_accept(sock_fd, (struct sockaddr *)&conn_addr, &addr_len);
|
||
while(sock_conn!=-1)
|
||
{
|
||
memset(tcp_rec_buf, 0, sizeof(tcp_rec_buf));
|
||
|
||
length = lwip_recv(sock_conn, (unsigned int *)tcp_rec_buf, TCP_SPECT_REC_BUF_LEN, 0);
|
||
if(length)
|
||
{
|
||
length = spect_proc();
|
||
if(length)
|
||
{
|
||
lwip_send(sock_conn, tcp_send_buf,length, 0);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
lwip_close(sock_conn);
|
||
sock_conn = -1;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
*/
|
||
int speck_data_thr(void * pvParameters)
|
||
{
|
||
int tcp_sock_fd = 0;
|
||
int sock_conn = 0;
|
||
int recv_buf_len = TCP_SPECT_REC_BUF_LEN+4;
|
||
int ret = 0;
|
||
struct sockaddr_in serverAddr;
|
||
struct sockaddr_in conn_addr;
|
||
socklen_t addr_len;
|
||
|
||
int length = 0;
|
||
|
||
/* creat tcp socket */
|
||
tcp_sock_fd = socket(PF_INET, SOCK_STREAM, 0);
|
||
if(tcp_sock_fd == -1){
|
||
log_printf(LOG_ERR,I_NOUSED," tcp_sock_fd socket fail.\n");
|
||
return -1;
|
||
}
|
||
|
||
ret = setsockopt(tcp_sock_fd, SOL_SOCKET, SO_REUSEADDR, &recv_buf_len, sizeof(recv_buf_len));
|
||
if(ret < 0) {
|
||
log_printf(LOG_ERR,I_NOUSED,"setsockopt err.\n");
|
||
}
|
||
|
||
memset(&serverAddr, 0, sizeof(serverAddr));
|
||
serverAddr.sin_family = PF_INET;
|
||
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
|
||
serverAddr.sin_port = htons(TCP_SPECT_COMM_PORT);
|
||
|
||
if(bind(tcp_sock_fd,(struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0)
|
||
{
|
||
log_printf(LOG_ERR,I_NOUSED," bind 0.0.0.0:%d failed\n",TCP_SPECT_COMM_PORT);
|
||
close(tcp_sock_fd);
|
||
return -1;
|
||
}
|
||
else
|
||
{
|
||
log_printf(LOG_DEBUG,I_NOUSED,"bind 0.0.0.0:%d ok\n",TCP_SPECT_COMM_PORT);
|
||
}
|
||
|
||
if(listen(tcp_sock_fd, 5)==-1){
|
||
log_printf(LOG_ERR,I_NOUSED,"socket server listen fail.\n");
|
||
close(tcp_sock_fd);
|
||
return -1;
|
||
}
|
||
|
||
addr_len = sizeof(struct sockaddr_in);
|
||
while(1) {
|
||
// block
|
||
sock_conn = accept(tcp_sock_fd, (struct sockaddr *)&conn_addr, &addr_len);
|
||
while(sock_conn != -1) {
|
||
//printf(" port :%d accepted \n", port);
|
||
memset(tcp_rec_buf, 0, sizeof(tcp_rec_buf));
|
||
length = recv(sock_conn, tcp_rec_buf, TCP_SPECT_REC_BUF_LEN, 0);
|
||
if(length) {
|
||
//printf(" rx_buff %02X %02X %02X \n", rx_buff[0], rx_buff[1], rx_buff[2]);
|
||
length = spect_proc();
|
||
if(length) {
|
||
send(sock_conn, tcp_send_buf, length, 0);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
close(sock_conn);
|
||
sock_conn = -1;
|
||
break;
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
#endif//USE_SPECT_DATA_TASK
|
||
|
||
void check_fpga_up_finished_reboot_sys(void)
|
||
{
|
||
static uint8 sec_cnt=0;
|
||
|
||
if(fpga_up_sys_reboot){
|
||
sec_cnt++;
|
||
if(sec_cnt>=3){
|
||
fpga_up_sys_reboot=0;
|
||
log_printf(LOG_DEBUG,I_NOUSED,"fpga up succeed,imx ready to reboot now.\n");
|
||
reset_imx_system();
|
||
}
|
||
}
|
||
}
|
||
|
||
// 上位机升级FPGA
|
||
int fpga_up_thr(void * pvParameters)
|
||
{
|
||
struct sockaddr_in sin;
|
||
struct sockaddr_in pin;
|
||
int on=1;
|
||
|
||
int sock_fp = -1;
|
||
int sock_conn = -1;
|
||
|
||
int size_of_addr;
|
||
int length;
|
||
int i = 0;
|
||
struct timeval timeout = {1,1000};// s,us
|
||
|
||
log_printf(LOG_DEBUG,I_NOUSED,"[.thr.] fpga_up_thr Start.\n");
|
||
|
||
/* creat socket */
|
||
sock_fp = socket(AF_INET,SOCK_STREAM,0);
|
||
if(sock_fp==-1)
|
||
{
|
||
log_printf(LOG_ERR,I_NOUSED,"socket fpgaUp fail.\n");
|
||
return -1;
|
||
}
|
||
|
||
int ret = setsockopt(sock_fp,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
|
||
if(ret<0)
|
||
{
|
||
log_printf(LOG_ERR,I_NOUSED,"Sta.setsockopt fpgaUp server err.\n");
|
||
}
|
||
|
||
bzero(&sin,sizeof(sin));
|
||
sin.sin_family = AF_INET;
|
||
sin.sin_addr.s_addr = INADDR_ANY;
|
||
sin.sin_port = htons(UPGRADE_LISTEN_PORT);
|
||
|
||
if(bind(sock_fp,(struct sockaddr *)&sin,sizeof(sin))==-1)
|
||
{
|
||
log_printf(LOG_ERR,I_NOUSED,"socket fpgaUp server bind fail.\n");
|
||
close(sock_fp);
|
||
return -1;
|
||
}
|
||
|
||
if(listen(sock_fp,1)==-1) // only one can be connect
|
||
{
|
||
log_printf(LOG_ERR,I_NOUSED,"socket fpgaUp server listen fail.\n");
|
||
close(sock_fp);
|
||
return -1;
|
||
}
|
||
|
||
while(1)
|
||
{
|
||
/* block untill client connected */
|
||
size_of_addr = sizeof(pin);
|
||
sock_conn = accept(sock_fp,(struct sockaddr *)&pin, &size_of_addr);
|
||
if(sock_conn == -1)
|
||
{
|
||
log_printf(LOG_DEBUG,I_NOUSED,"fpgaUp tcp accept!\n");
|
||
continue;
|
||
}
|
||
log_printf(LOG_DEBUG,I_NOUSED,"2.fpgaUp tcp accept!\n");
|
||
|
||
|
||
|
||
while(sock_conn!=-1)
|
||
{
|
||
memset(rxdata, 0, sizeof(rxdata));
|
||
|
||
length = recv(sock_conn, (unsigned int *)rxdata, MAX_DATA_LEN, 0);// 阻塞
|
||
if(length)
|
||
{
|
||
|
||
length = fpga_upgrade_process();
|
||
if(length==0xff){//出错后主动断开连接
|
||
close(sock_conn);
|
||
sock_conn = -1;
|
||
break;
|
||
|
||
}
|
||
send(sock_conn, txdata, length, 0);
|
||
}
|
||
else
|
||
{
|
||
close(sock_conn);
|
||
sock_conn = -1;
|
||
break;
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
|
||
void * tcp_remote_thr(void *args)
|
||
{
|
||
int tcp_sock_fd = 0;
|
||
int sock_conn = 0;
|
||
int recv_buf_len = TCP_REMOTE_MAX_REC_LEN+4;
|
||
int ret = 0;
|
||
struct sockaddr_in serverAddr;
|
||
struct sockaddr_in conn_addr;
|
||
int port;
|
||
socklen_t addr_len;
|
||
static uint8 rx_buff[TCP_REMOTE_MAX_REC_LEN+4] = {0};
|
||
static uint8 tx_buff[TCP_REMOTE_MAX_SEND_LEN+4] = {0};
|
||
int recvlen = 0;
|
||
|
||
log_printf(LOG_DEBUG,I_NOUSED,"[.thr.] tcp_remote_thr Start.\n");
|
||
|
||
/* creat tcp socket */
|
||
tcp_sock_fd = socket(PF_INET, SOCK_STREAM, 0);
|
||
if(tcp_sock_fd == -1){
|
||
log_printf(LOG_ERR,I_NOUSED," tco_sock_fd socket fail.\n");
|
||
return ((void*)NULL);
|
||
}
|
||
|
||
ret = setsockopt(tcp_sock_fd, SOL_SOCKET, SO_REUSEADDR, &recv_buf_len, sizeof(recv_buf_len));
|
||
if(ret < 0) {
|
||
log_printf(LOG_ERR,I_NOUSED,"setsockopt err.\n");
|
||
}
|
||
|
||
/*if(standard==STANDARD_CTTB)
|
||
port = TCP_COM_CTTB_PROTOCOL_PORT;
|
||
else
|
||
port = TCP_COM_CMMB_PROTOCOL_PORT;*/
|
||
port = TCP_COMM_PORT;
|
||
|
||
memset(&serverAddr, 0, sizeof(serverAddr));
|
||
serverAddr.sin_family = PF_INET;
|
||
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
|
||
serverAddr.sin_port = htons(port);
|
||
|
||
if(bind(tcp_sock_fd,(struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0)
|
||
{
|
||
log_printf(LOG_ERR,I_NOUSED,"bind 0.0.0.0:%d failed\n",port);
|
||
close(tcp_sock_fd);
|
||
return ((void*)NULL);
|
||
}
|
||
else
|
||
{
|
||
log_printf(LOG_DEBUG,I_NOUSED," bind 0.0.0.0:%d ok\n",port);
|
||
}
|
||
|
||
if(listen(tcp_sock_fd, 5)==-1){
|
||
log_printf(LOG_DEBUG,I_NOUSED,"socket server listen fail.\n");
|
||
close(tcp_sock_fd);
|
||
return ((void*)NULL);
|
||
}
|
||
|
||
addr_len = sizeof(struct sockaddr_in);
|
||
while(1) {
|
||
|
||
if(get_upgrade_flg()){
|
||
usleep(1000000);
|
||
continue;
|
||
}
|
||
// block
|
||
sock_conn = accept(tcp_sock_fd, (struct sockaddr *)&conn_addr, &addr_len);
|
||
while(sock_conn != -1) {
|
||
//printf(" port :%d accepted \n", port);
|
||
memset(rx_buff, 0, sizeof(rx_buff));
|
||
recvlen = recv(sock_conn, rx_buff, TCP_REMOTE_MAX_REC_LEN, 0);
|
||
if(recvlen) {
|
||
//printf(" rx_buff %02X %02X %02X \n", rx_buff[0], rx_buff[1], rx_buff[2]);
|
||
recvlen = tcp_remote(rx_buff, tx_buff);
|
||
if(recvlen) {
|
||
send(sock_conn, tx_buff, recvlen, 0);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
close(sock_conn);
|
||
sock_conn = -1;
|
||
break;
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
void * udp_remote_thr(void * args)
|
||
{
|
||
int udo_sock_fd = 0;
|
||
int ret = 0;
|
||
struct sockaddr_in serverAddr;
|
||
struct sockaddr from;
|
||
socklen_t fromlen;
|
||
int port;
|
||
static uint8 rx_buff[TCP_REMOTE_MAX_REC_LEN+4] = {0};
|
||
static uint8 tx_buff[TCP_REMOTE_MAX_SEND_LEN+4] = {0};
|
||
int recvlen = 0;
|
||
|
||
log_printf(LOG_DEBUG,I_NOUSED,"[.thr.] udp_remote_thr Start.\n");
|
||
|
||
/* creat udp socket */
|
||
udo_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
|
||
if(udo_sock_fd == -1){
|
||
log_printf(LOG_ERR,I_NOUSED," tco_sock_fd socket fail.\n");
|
||
return ((void*)NULL);
|
||
}
|
||
|
||
// ret = setsockopt(tcp_sock_fd, SOL_SOCKET, SO_REUSEADDR, &recv_buf_len, sizeof(recv_buf_len));
|
||
// if(ret < 0) {
|
||
// printf("setsockopt err.\n");
|
||
// }
|
||
|
||
/*if(standard==STANDARD_CTTB)
|
||
port = TCP_COM_CTTB_PROTOCOL_PORT;
|
||
else
|
||
port = TCP_COM_CMMB_PROTOCOL_PORT;*/
|
||
port = TCP_COMM_PORT;
|
||
|
||
memset(&serverAddr, 0, sizeof(serverAddr));
|
||
serverAddr.sin_family = PF_INET;
|
||
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
|
||
serverAddr.sin_port = htons(port);
|
||
|
||
if(bind(udo_sock_fd,(struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0)
|
||
{
|
||
log_printf(LOG_ERR,I_NOUSED," bind 0.0.0.0:%d failed\n",port);
|
||
close(udo_sock_fd);
|
||
return ((void*)NULL);
|
||
}
|
||
else
|
||
{
|
||
log_printf(LOG_DEBUG,I_NOUSED,"bind 0.0.0.0:%d ok\n",port);
|
||
}
|
||
|
||
while(1) {
|
||
|
||
|
||
if(get_upgrade_flg()){
|
||
usleep(1000000);
|
||
continue;
|
||
}
|
||
memset(rx_buff, 0, sizeof(rx_buff));
|
||
// block
|
||
recvlen = recvfrom(udo_sock_fd, rx_buff, TCP_REMOTE_MAX_REC_LEN, 0, &from, &fromlen);
|
||
if(recvlen) {
|
||
//printf(" rx_buff %02X %02X %02X \n", rx_buff[0], rx_buff[1], rx_buff[2]);
|
||
recvlen = tcp_remote(rx_buff, tx_buff);
|
||
if(recvlen) {
|
||
sendto(udo_sock_fd, tx_buff, recvlen, 0, &from, fromlen);
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
#endif
|