lcd/USER/serial.c
2026-05-22 17:19:03 +08:00

499 lines
13 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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: lenbuf的长度
** 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;
}