499 lines
13 KiB
C
499 lines
13 KiB
C
#include "global.h"
|
||
|
||
#include "error_no.h"
|
||
|
||
#include "usboperate.h"
|
||
#include "define.h"
|
||
#include <pthread.h>
|
||
#include <unistd.h>
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <string.h>
|
||
#include <fcntl.h>
|
||
int icdev = -1;
|
||
|
||
static unsigned char serial_buf[4096];
|
||
//static unsigned char serial_buf[1030];
|
||
|
||
unsigned char Display_Stx[4]= {0x55,0xAA,0x88,0x66};
|
||
unsigned char CleanScr_Stx[4]= {0x55,0xAA,0x66,0x88};
|
||
|
||
int serial_buff_init()
|
||
{
|
||
memset(serial_buf,0,1030);
|
||
return 0;
|
||
}
|
||
|
||
int serial_buff_black()
|
||
{
|
||
memset(serial_buf,0xff,1030);
|
||
return 0;
|
||
}
|
||
|
||
//int serial_write_buff(unsigned char page,unsigned char col,unsigned char dat)
|
||
int serial_write_buff(unsigned int page,unsigned int col,unsigned int dat)
|
||
{
|
||
if(page<0||page>7)
|
||
return -1;
|
||
if(col<0||col>127)
|
||
return -1;
|
||
unsigned int pos=0;
|
||
/* modify for the header by mukesong from 3 to 4 */
|
||
pos=page*128+col+4;
|
||
serial_buf[pos]=dat;
|
||
return 0;
|
||
}
|
||
/************************************************************************************
|
||
* serial_open [history:15:06:12,23-06-2009]
|
||
* Discription : -无阻塞模式打开串口: 数据位8;停止位1;效应位无;流控制无 ;DTR无; RTS无;
|
||
* Parameter : - baud_rate:波特率
|
||
* Return : - 文件名描述符
|
||
************************************************************************************/
|
||
void icdev_get(char *dev)
|
||
{
|
||
FILE * FP = NULL;
|
||
char cmd[512];
|
||
sprintf(cmd,"sg_map -i | grep SUNYARD | awk '{ print $2}'");
|
||
FP = popen(cmd,"r");
|
||
int num = fread(dev,8,1,FP);
|
||
if(num == -1)
|
||
printf("fread error\n");
|
||
pclose(FP);
|
||
}
|
||
#if 0
|
||
int serial_open(int baud_rate)
|
||
{
|
||
char dev_path[12];
|
||
char outbuf[128];
|
||
int k;
|
||
sprintf(dev_path, "/dev/sdg");
|
||
if((icdev = open(dev_path, O_RDONLY)) < 0)
|
||
{
|
||
printf(dev_path);
|
||
printf(" open fail ret:%d\n",icdev);
|
||
return 0;
|
||
}
|
||
|
||
/* It is prudent to check we have a sg device by trying an ioctl */
|
||
if ((ioctl(icdev, SG_GET_VERSION_NUM, &k) < 0) || (k < 30000))
|
||
{
|
||
printf("%s is not an sg device, or old sg driver\n", dev_path);
|
||
close(icdev);
|
||
return 0;
|
||
}
|
||
|
||
if(scsi_inquiry(icdev, (unsigned char *)outbuf) == 0)
|
||
{
|
||
if(memcmp(outbuf + 8, "SUNYARD", 6) == 0) //find ukey
|
||
{
|
||
// *fd = icdev;
|
||
return 1;
|
||
}
|
||
else
|
||
{
|
||
close(icdev);
|
||
return 0;
|
||
}
|
||
}
|
||
close(icdev);
|
||
return 0;
|
||
}
|
||
|
||
#else
|
||
int serial_open(int baud_rate)
|
||
{
|
||
char dev[20];
|
||
icdev_get(dev);
|
||
dev[8]='\0';
|
||
if((icdev=open(dev,O_RDONLY))<0)
|
||
{
|
||
printf("device open err\n");
|
||
return -1;
|
||
}
|
||
return 0;
|
||
}
|
||
#endif
|
||
|
||
/************************************************************************************
|
||
* serial_write [history:16:12:12,22-06-2009]
|
||
* Discription : - 写接口
|
||
* Parameter : -
|
||
* Return : -
|
||
************************************************************************************/
|
||
int serial_write(unsigned char * data,int len)
|
||
{
|
||
/*
|
||
int rv;
|
||
unsigned char buff[2048];
|
||
read(FD,buff,sizeof(buff));//clear the data cache
|
||
//PrintHex("write",data,len);
|
||
rv=write(FD,data,len);
|
||
return rv;
|
||
*/
|
||
printf("serial write ");
|
||
close(icdev);
|
||
return 0;
|
||
}
|
||
/************************************************************************************
|
||
* serial_read [history:16:12:48,22-06-2009]
|
||
* Discription : - 读接口
|
||
* Parameter : -
|
||
* Return : -
|
||
************************************************************************************/
|
||
int serial_read(unsigned char * data,int len)
|
||
{
|
||
//int rv = 0,remain;
|
||
//int state;
|
||
int ret,pos=0;
|
||
//int i,j;
|
||
unsigned char tmpstr[2048];
|
||
unsigned char tmprstr[2048];
|
||
unsigned char bufw[4096];
|
||
unsigned char bufr[4096];
|
||
unsigned char head[4]= {0x55,0xaa,0x88,0x66};
|
||
//unsigned char tmp[6] = {0x00};
|
||
memset(data,0,len);
|
||
//add by louyunchuan 20130107
|
||
// printf("begin to usbicwrite\n");
|
||
// printf("end open shebei \n");
|
||
do
|
||
{
|
||
pos = 0;
|
||
memset(data,0,len);
|
||
memset(bufw,0,sizeof(bufw));
|
||
memset(bufr,0,sizeof(bufr));
|
||
memset(tmpstr,0,sizeof(tmpstr));
|
||
memset(tmprstr,0,sizeof(tmprstr));
|
||
|
||
tmpstr[pos++]=0x00; //SEQ
|
||
tmpstr[pos++]=0x47;//0x47; //TAG
|
||
tmpstr[pos++]=0; //LEN
|
||
tmpstr[pos++]=0;//0x00; //LEN
|
||
Check_LRC(tmpstr,pos);
|
||
pos+=2;
|
||
memcpy(bufw,head,4);
|
||
// hextoasc(bufw+4,tmpstr,pos);
|
||
memcpy(bufw+4,tmpstr,pos);
|
||
bufw[pos+4]=3;
|
||
// PrintHex("wdata",bufw,64);
|
||
// PrintHex("write data1",bufw,64);
|
||
ret = USBWrite(icdev,bufw,pos+5,SCSI_TIMEOUT);
|
||
if(ret != 0)
|
||
{
|
||
printf("write hid failed!\n");
|
||
return IC_READ_ERR;
|
||
}
|
||
memset(bufr,0,sizeof(bufr));
|
||
// printf("retb2 = %d \n",ret);
|
||
|
||
ret = USBRead(icdev,bufr,len+12,SCSI_TIMEOUT);//sizeof(bufr));
|
||
// PrintHex("rdata",bufr,64);
|
||
if(ret != 0)
|
||
{
|
||
printf("read hid failed!\n");
|
||
// close(icdev);
|
||
return IC_READ_ERR;
|
||
}
|
||
|
||
|
||
// printf("retb3 = %d \n",ret);
|
||
// asctohex(tmprstr,bufr+4,64-5);
|
||
|
||
// printf("data of write:\t%s\n",bufw+4);
|
||
// printf("A!\n");
|
||
if(bufr[8] == 0x00 && bufr[5] == 0x47)
|
||
{
|
||
// close(icdev);
|
||
data[0]=0x55;
|
||
data[1]=0xAA;
|
||
data[2]=0x88;
|
||
data[3] = 0x66;
|
||
data[4] = 0x02;
|
||
memcpy(data+5,bufr+9,1);
|
||
return ret;
|
||
}
|
||
// printf("waitkeyin\n");
|
||
}
|
||
while(1);
|
||
|
||
return 0;
|
||
}
|
||
|
||
int serial_read_once(unsigned char * data,int len)
|
||
{
|
||
//int rv,timeout;
|
||
//int state;
|
||
int ret,pos=0;
|
||
//int i,j;
|
||
unsigned char tmpstr[2048];
|
||
unsigned char tmprstr[2048];
|
||
unsigned char bufw[4096];
|
||
unsigned char bufr[4096];
|
||
unsigned char head[4]= {0x55,0xaa,0x88,0x66};
|
||
// sleep(1);
|
||
// do{
|
||
pos = 0;
|
||
memset(data,0,len);
|
||
memset(bufw,0,sizeof(bufw));
|
||
memset(bufr,0,sizeof(bufr));
|
||
memset(tmpstr,0,sizeof(tmpstr));
|
||
memset(tmprstr,0,sizeof(tmprstr));
|
||
|
||
tmpstr[pos++]=0x00; //SEQ
|
||
tmpstr[pos++]=0x47;//0x47; //TAG
|
||
tmpstr[pos++]=0; //LEN
|
||
tmpstr[pos++]=0;//0x00; //LEN
|
||
Check_LRC(tmpstr,pos);
|
||
pos+=2;
|
||
memcpy(bufw,head,4);
|
||
// hextoasc(bufw+4,tmpstr,pos);
|
||
memcpy(bufw+4,tmpstr,pos);
|
||
|
||
bufw[pos+4]=3;
|
||
// PrintHex("wdata",bufw,64);
|
||
// PrintHex("write data1",bufw,64);
|
||
ret = USBWrite(icdev,bufw,pos+5,SCSI_TIMEOUT);
|
||
if(ret != 0)
|
||
{
|
||
printf("write hid failed!\n");
|
||
// close(icdev);
|
||
return IC_WRITE_ERR;
|
||
}
|
||
memset(bufr,0,sizeof(bufr));
|
||
// printf("retb2 = %d \n",ret);
|
||
|
||
ret = USBRead(icdev,bufr,4096,SCSI_TIMEOUT);//sizeof(bufr));
|
||
// PrintHex("rdata",bufr,64);
|
||
if(ret!=0)
|
||
{
|
||
printf("read hid failed!\n");
|
||
// close(icdev);
|
||
return IC_READ_ERR;
|
||
}
|
||
|
||
|
||
|
||
// printf("retb3 = %d \n",ret);
|
||
// asctohex(tmprstr,bufr+4,64-5);
|
||
|
||
// printf("data of write:\t%s\n",bufw+4);
|
||
// printf("A!\n");
|
||
if(bufr[8] == 0x00 && bufr[5] == 0x47)
|
||
{
|
||
// close(icdev);
|
||
data[0]=0x55;
|
||
data[1]=0xAA;
|
||
data[2]=0x88;
|
||
data[3] = 0x66;
|
||
data[4] = 0x02;
|
||
memcpy(data+5,bufr+9,1);
|
||
return ret;
|
||
}
|
||
else if(bufr[8] == 0x00&& bufr[5] == 0x47)
|
||
{
|
||
//timeout--;
|
||
memset(data,0,len);
|
||
//continue;
|
||
}
|
||
else
|
||
{
|
||
// PrintHex("rdata",bufr,64);
|
||
// close(icdev);
|
||
memset(data,0,len);
|
||
return ret;
|
||
}
|
||
|
||
// timeout--;
|
||
//PrintHex("rec data is :", data, 6);
|
||
// }while(((data[0]!=0x55)||(data[1]!=0xAA)
|
||
// || (data[2] != 0x88) || (data[3] != 0x66) ||(data[4] != 0x02)));
|
||
//tcflush(FD, TCIFLUSH);
|
||
// close(icdev);
|
||
return 0;
|
||
}
|
||
|
||
/************************************************************************************
|
||
* serial_flush [history:16:12:12,22-06-2009]
|
||
* Discription : - 清空缓存接口
|
||
* Parameter : -
|
||
* Return : -
|
||
************************************************************************************/
|
||
int serial_flush(unsigned char LineBit)
|
||
{
|
||
int pos = 0, loop = 0;
|
||
//int rv = 0, remain = 0, inLoop = 0;
|
||
// int timeout, timeout1;
|
||
//UINT lrc = 0;
|
||
unsigned char rush[20] = {0x00}, line = 0;
|
||
unsigned char Send_buf[136] = {0X00};
|
||
//int fd;
|
||
unsigned char tmpstr[2048];
|
||
unsigned char tmprstr[2048];
|
||
unsigned char bufw[4096];
|
||
unsigned char bufr[4096];
|
||
unsigned char head[4]= {0x55,0xaa,0x88,0x66};
|
||
int ret;
|
||
//int i;
|
||
// int j;
|
||
|
||
memset(rush,0,10);
|
||
// timeout=9000000;
|
||
// timeout1=9000000;
|
||
memcpy(Send_buf, Display_Stx, 4);
|
||
for(loop=0; loop < 8; loop++)
|
||
{
|
||
pos =0;
|
||
if(0x01 == (LineBit>>loop &0x01) )
|
||
{
|
||
line = (unsigned char)loop;
|
||
memset(bufw,0,sizeof(bufw));
|
||
memset(tmpstr,0,sizeof(tmpstr));
|
||
memset(tmprstr,0,sizeof(tmprstr));
|
||
|
||
tmpstr[pos++]=0x00; //SEQ
|
||
tmpstr[pos++]=0x46;//0x46; //TAG
|
||
tmpstr[pos++]=133/256; //LEN
|
||
tmpstr[pos++]=133%256;//0x00; //LEN
|
||
|
||
if(0x04 == (LEDSTATE&0x04))
|
||
{
|
||
tmpstr[pos++]=0xF0;
|
||
}
|
||
else
|
||
{
|
||
tmpstr[pos++]=0x0F; //ADDR
|
||
}
|
||
tmpstr[pos++]=line; //ADDR
|
||
tmpstr[pos++]=0x00; //ADDR
|
||
tmpstr[pos++]=128/256;
|
||
tmpstr[pos++]=128%256;
|
||
memcpy(tmpstr + pos,serial_buf+loop*128 + 3,128);
|
||
pos = pos + 128;
|
||
Check_LRC(tmpstr,pos);
|
||
pos+=2;
|
||
memcpy(bufw,head,4);
|
||
memcpy(bufw+4,tmpstr,pos);
|
||
|
||
bufw[pos+4]=3;
|
||
|
||
ret = USBWrite(icdev,bufw,pos+5,SCSI_TIMEOUT);
|
||
if(ret != 0)
|
||
{
|
||
printf("write hid failed!\n");
|
||
return IC_NOT_EXIST;
|
||
}
|
||
memset(bufr,0,sizeof(bufr));
|
||
// j=0;
|
||
|
||
ret = USBRead(icdev,bufr,4096,SCSI_TIMEOUT);
|
||
if(ret!=0){
|
||
printf("read hid failed!\n");
|
||
return IC_READ_ERR;
|
||
}
|
||
|
||
if(bufr[8] == 0x00 && bufr[5] == 0x46){
|
||
;
|
||
}else{
|
||
printf("|%s|%s|%d| : the data return from USBRead is wrong !\n", __FILE__, __func__, __LINE__);
|
||
return ERR_SYSTEM;
|
||
}
|
||
}
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
/******************************************************************************************
|
||
** Function name: make_Protocol_Package
|
||
** Descriptions: 数据组包
|
||
** input parameters: ucCmd:操作命令
|
||
pData:发送的数据
|
||
DataLen:发送的数据长度
|
||
** output parameters: pPackData:组包后的数据
|
||
packLen:组包后的数据长度
|
||
** Returned value:
|
||
** Created by: zheh.zhang
|
||
** Created date: 2022/8/5
|
||
**-----------------------------------------------------------------------------------------
|
||
** Modified by:
|
||
** Modified date:
|
||
******************************************************************************************/
|
||
void make_Protocol_Package(unsigned char ucCmd, unsigned char *pData, unsigned short usDataLen, unsigned char *pPackData, unsigned short *packLen)
|
||
{
|
||
unsigned char packageBuf[2048];
|
||
unsigned char Packagelen = 0;
|
||
unsigned char packageHead[4]= {0X55, 0XAA, 0X88, 0X66};
|
||
|
||
memcpy(packageBuf, packageHead, 4); /* 协议头 */
|
||
|
||
packageBuf[4] = 0x00; /* SEQ */
|
||
packageBuf[5] = ucCmd; /* CMD */
|
||
|
||
/* 数据长度 */
|
||
packageBuf[6] = usDataLen>>8;
|
||
packageBuf[7] = usDataLen&0xff;
|
||
|
||
/* 包数据 */
|
||
memcpy(packageBuf + 8, pData, usDataLen);
|
||
|
||
/* LRC校验码 */
|
||
Packagelen = usDataLen + 8;
|
||
Check_LRC(packageBuf+4, Packagelen - 4);
|
||
Packagelen += 2;
|
||
|
||
packageBuf[Packagelen++] = 0x03; /* 协议尾 */
|
||
|
||
*packLen = Packagelen;
|
||
memcpy(pPackData, packageBuf, Packagelen);
|
||
}
|
||
|
||
|
||
/******************************************************************************************
|
||
** Function name: get_hmi_version
|
||
** Descriptions: 获取液晶控制面板版本
|
||
** input parameters: len:buf的长度
|
||
** output parameters: data:返回的数据
|
||
** Returned value: none
|
||
** Created by: zheh.zhang
|
||
** Created date: 2022/9/28
|
||
**-----------------------------------------------------------------------------------------
|
||
** Modified by:
|
||
** Modified date:
|
||
******************************************************************************************/
|
||
int get_hmi_version(unsigned char *data, int len)
|
||
{
|
||
int ret;
|
||
unsigned int sendLen = 0;
|
||
unsigned int recvLen = 16;
|
||
unsigned char usbSendBuf[32] = {0};
|
||
unsigned char usbRecvBuf[32] = {0};
|
||
|
||
make_Protocol_Package(0x45, 0, 0, usbSendBuf, (unsigned short *)&sendLen);
|
||
|
||
// showhexbuf("CMD_KEY send", usbSendBuf, sendLen);
|
||
|
||
ret = USBWrite(icdev, usbSendBuf, sendLen, SCSI_TIMEOUT);
|
||
if(ret<0){
|
||
printf(" get_hmi_version write failed!\n");
|
||
return ret;
|
||
}
|
||
|
||
ret = USBRead(icdev, usbRecvBuf, recvLen, SCSI_TIMEOUT);
|
||
if(ret<0){
|
||
printf("get_hmi_version read failed! ret = %d \n",ret);
|
||
return ret;
|
||
}
|
||
|
||
// showhexbuf("CMD_KEY recv", usbRecvBuf, recvLen);
|
||
if(usbRecvBuf[8] == 0x00 && usbRecvBuf[5] == 0x45) {
|
||
data[0] = usbRecvBuf[9];
|
||
data[1] = usbRecvBuf[10];
|
||
return ret;
|
||
} else {
|
||
memset(data, 0, len);
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|