#include "global.h" #include "error_no.h" #include "usboperate.h" #include "define.h" #include #include #include #include #include #include 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; }