| #include <fcntl.h> // open | |
| #include <string.h> // bzero | |
| #include <stdlib.h> // exit | |
| #include <sys/types.h> // pid_t | |
| //#include "ufi_def.h" | |
| #include "os_type_def.h" | |
| #include "cc_at.h" | |
| #include "cc_proc.h" | |
| #include "cc_main.h" | |
| #include <termios.h> //termios, tcgetattr(), tcsetattr() | |
| #ifndef TEST_CCAPP | |
| #include <unistd.h> | |
| #include <sys/ioctl.h> // ioctl | |
| #include <sys/times.h> // times | |
| #endif | |
| //ÈçºÎ¶¨Òå | |
| #define ZCC_APP_AT_COMM_CC "/dev/armps_rpmsgch12" | |
| #define ZCC_APP_AT_COMM_SS "/dev/armps_rpmsgch13" | |
| #define ZCC_APP_AT_COMM_DEV "/dev/armps_rpmsgch14" | |
| #define ZCC_APP_AT_COMM_IND "/dev/armps_rpmsgch15" | |
| static int g_zCcApp_ComFd[4] = {0}; | |
| /******************************************* | |
| * ²¨ÌØÂÊת»¯×ª»»º¯Êý | |
| ********************************************/ | |
| static int convbaud(unsigned long int baudrate) | |
| { | |
| switch (baudrate) | |
| { | |
| case 2400: | |
| return B2400; | |
| case 4800: | |
| return B4800; | |
| case 9600: | |
| return B9600; | |
| case 19200: | |
| return B19200; | |
| case 38400: | |
| return B38400; | |
| case 57600: | |
| return B57600; | |
| case 115200: | |
| return B115200; | |
| default: | |
| return B9600; | |
| } | |
| } | |
| #ifndef TEST_CCAPP | |
| int zCc_CleanCCMSG() | |
| { | |
| int ret = -1; | |
| //get CC fd | |
| int fd = zCcApp_GetAtCCFd(); | |
| fd_set readfdForCC; | |
| struct timeval tv={0}; | |
| while(1) | |
| { | |
| //0s timeout | |
| tv.tv_sec = 0; | |
| FD_ZERO(&readfdForCC); | |
| FD_SET(fd, &readfdForCC); | |
| ret = select(fd + 1, &readfdForCC, NULL, NULL, &tv); | |
| if(ret<0) | |
| { | |
| continue; | |
| } | |
| //"Select timeout" | |
| if(ret == 0) | |
| { | |
| break; | |
| } | |
| if(FD_ISSET(fd, &readfdForCC)) | |
| { | |
| char AtBuf[ZCC_APP_AT_BUF_MAX_LEN] = {0}; | |
| int readlen = 0; | |
| readlen = read(fd, AtBuf, ZCC_APP_AT_BUF_MAX_LEN); | |
| } | |
| else | |
| { | |
| continue; | |
| } | |
| } | |
| return 0; | |
| } | |
| int zCcApp_GetAtCmdFd(void) | |
| { | |
| int fd = 0; | |
| E_CC_APP_AtReqCmdId AtChnlCmdId = g_Cc_CallDetail.curAtCmdId; | |
| switch (AtChnlCmdId) | |
| { | |
| case CC_APP_AT_CMD_REQ_A: | |
| case CC_APP_AT_CMD_REQ_D: | |
| case CC_APP_AT_CMD_REQ_CHUP: | |
| case CC_APP_AT_CMD_REQ_SET_CHLD: | |
| case CC_APP_AT_CMD_REQ_VTS: | |
| case CC_APP_AT_CMD_REQ_IMSPLUS: | |
| fd = g_zCcApp_ComFd[1]; | |
| break; | |
| case CC_APP_AT_CMD_REQ_GET_CLCC: | |
| case CC_APP_AT_CMD_REQ_CMUT: | |
| case CC_APP_AT_CMD_REQ_CLVL: | |
| fd = g_zCcApp_ComFd[3]; | |
| break; | |
| case CC_APP_AT_CMD_REQ_SET_CCFC: | |
| case CC_APP_AT_CMD_REQ_SET_CCWA: | |
| case CC_APP_AT_CMD_REQ_SET_CLCK: | |
| case CC_APP_AT_CMD_REQ_GET_CCFC: | |
| case CC_APP_AT_CMD_REQ_GET_CCWA: | |
| case CC_APP_AT_CMD_REQ_SET_CPWD: | |
| fd = g_zCcApp_ComFd[2]; | |
| break; | |
| default: | |
| break; | |
| } | |
| return fd; | |
| } | |
| /******************************************** | |
| * send data | |
| * fdcom: ´®¿ÚÃèÊö·û, data: ´ý·¢ËÍÊý¾Ý, datalen: Êý¾Ý³¤¶È | |
| * ·µ»ØÊµ¼Ê·¢Ëͳ¤¶È | |
| *********************************************/ | |
| int zCcApp_PortSend(int fdcom, CHAR *data, int datalen) | |
| { | |
| int len = 0; | |
| zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s zCcApp_PortSend:AtcmdMsg = %s\n",__FUNCTION__,data); | |
| len = write(fdcom, data, datalen); //ʵ¼ÊдÈëµÄ³¤¶È | |
| if (len == datalen) | |
| { | |
| zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s zCcApp_PortSend succ fdcom=%d,data=%s,len=%d\n <---\n",__FUNCTION__,fdcom,data,datalen); | |
| return len; | |
| } | |
| else | |
| { | |
| zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s zCcApp_PortSend fail fdcom=%d,data=%s,len=%d\n <---\n",__FUNCTION__,fdcom,data,datalen); | |
| tcflush(fdcom, TCOFLUSH); | |
| return -1; | |
| } | |
| } | |
| /******************************************* | |
| * receive data | |
| * ·µ»ØÊµ¼Ê¶ÁÈëµÄ×Ö½ÚÊý | |
| * | |
| ********************************************/ | |
| int zCcApp_PortRecv(int fdcom, CHAR *data, int datalen) | |
| { | |
| char AtBuf[ZCC_APP_AT_BUF_MAX_LEN] = {0}; | |
| int readlen = 0; | |
| readlen = read(fdcom, AtBuf, ZCC_APP_AT_BUF_MAX_LEN); | |
| if (readlen >= 0) { //cov m | |
| strncpy(data,AtBuf,readlen); | |
| } | |
| return readlen; | |
| } | |
| /******************************************* | |
| * Setup comm attr | |
| * fdcom: ´®¿ÚÎļþÃèÊö·û, pportinfo: ´ýÉèÖõĶ˿ÚÐÅÏ¢s | |
| * | |
| ********************************************/ | |
| int zCcApp_PortSet(int fdcom, T_CC_APP_Portinfo *pPortinfo) | |
| { | |
| struct termios termios_old, termios_new; | |
| int baudrate, tmp; | |
| char databit, stopbit, parity, fctl; | |
| bzero(&termios_old, sizeof(termios_old)); | |
| bzero(&termios_new, sizeof(termios_new)); | |
| cfmakeraw(&termios_new); | |
| tcgetattr(fdcom, &termios_old); //get the serial port attributions | |
| /*------------ÉèÖö˿ÚÊôÐÔ----------------*/ | |
| //baudrates | |
| baudrate = convbaud(pPortinfo->baudrate); | |
| cfsetispeed(&termios_new, baudrate); //ÌîÈë´®¿ÚÊäÈë¶Ë²¨ÌØÂÊ | |
| cfsetospeed(&termios_new, baudrate); //ÌîÈë´®¿ÚÊä³ö¶Ë²¨ÌØÂÊ | |
| termios_new.c_cflag |= CLOCAL; //¿ØÖÆÄ£Ê½, ±£Ö¤³ÌÐò²»»á³ÉΪ¶Ë¿ÚµÄÕ¼ÓÐÕß | |
| termios_new.c_cflag |= CREAD; //¿ØÖÆÄ£Ê½, ʹÄܶ˿ڶÁÈ¡ÊäÈëµÄÊý¾Ý | |
| // ¿ØÖÆÄ£Ê½, flow control | |
| fctl = pPortinfo->fctl; | |
| switch (fctl) | |
| { | |
| case '0': | |
| { | |
| termios_new.c_cflag &= ~CRTSCTS; //no flow control | |
| break; | |
| } | |
| case '1': | |
| { | |
| termios_new.c_cflag |= CRTSCTS; //hardware flow control | |
| break; | |
| } | |
| case '2': | |
| { | |
| termios_new.c_iflag |= IXON | IXOFF | IXANY; //software flow control | |
| break; | |
| } | |
| default: | |
| { | |
| //ZTE_LOG(LOG_ERR, "Unknown fctl %c\n", fctl); | |
| break; | |
| } | |
| } | |
| //¿ØÖÆÄ£Ê½, data bits | |
| termios_new.c_cflag &= ~CSIZE; //¿ØÖÆÄ£Ê½, ÆÁ±Î×Ö·û´óСλ | |
| databit = pPortinfo->databit; | |
| switch (databit) | |
| { | |
| case '5': | |
| termios_new.c_cflag |= CS5; | |
| //lint -fallthrough | |
| case '6': | |
| termios_new.c_cflag |= CS6; | |
| //lint -fallthrough | |
| case '7': | |
| termios_new.c_cflag |= CS7; | |
| //lint -fallthrough | |
| default: | |
| termios_new.c_cflag |= CS8; | |
| } | |
| //¿ØÖÆÄ£Ê½ parity check | |
| parity = pPortinfo->parity; | |
| switch (parity) | |
| { | |
| case '0': | |
| { | |
| termios_new.c_cflag &= ~PARENB; //no parity check | |
| break; | |
| } | |
| case '1': | |
| { | |
| termios_new.c_cflag |= PARENB; //odd check | |
| termios_new.c_cflag &= ~PARODD; | |
| break; | |
| } | |
| case '2': | |
| { | |
| termios_new.c_cflag |= PARENB; //even check | |
| termios_new.c_cflag |= PARODD; | |
| break; | |
| } | |
| default: | |
| { | |
| //ZTE_LOG(LOG_ERR, "Unknown parity %c\n", parity); | |
| break; | |
| } | |
| } | |
| //¿ØÖÆÄ£Ê½, stop bits | |
| stopbit = pPortinfo->stopbit; | |
| if (stopbit == '2') | |
| { | |
| termios_new.c_cflag |= CSTOPB; //2 stop bits | |
| } | |
| else | |
| { | |
| termios_new.c_cflag &= ~CSTOPB; //1 stop bits | |
| } | |
| //other attributions default | |
| termios_new.c_oflag &= ~OPOST; //Êä³öģʽ, ÔʼÊý¾ÝÊä³ö | |
| termios_new.c_cc[VMIN] = 1; //¿ØÖÆ×Ö·û, ËùÒª¶ÁÈ¡×Ö·ûµÄ×îСÊýÁ¿ | |
| termios_new.c_cc[VTIME] = 1; //¿ØÖÆ×Ö·û, ¶ÁÈ¡µÚÒ»¸ö×Ö·ûµÄµÈ´ýʱ¼ä, unit: (1/10)second | |
| tcflush(fdcom, TCIFLUSH); //Òç³öµÄÊý¾Ý¿ÉÒÔ½ÓÊÕ,µ«²»¶Á | |
| tmp = tcsetattr(fdcom, TCSANOW, &termios_new); //ÉèÖÃÐÂÊôÐÔ, TCSANOW: ËùÓɸıäÁ¢¼´ÉúЧ | |
| tcgetattr(fdcom, &termios_old); | |
| //printf("%s \n",__FUNCTION__); | |
| //printf("%s %d: tty %d,baudrate %d,stopbit %d, parity%d, databit %d\n",__FUNCTION__,termios_old.tty,termios_old.baudrate,termios_old.stopbit,termios_old.parity,termios_old.databit); | |
| return(tmp); | |
| } | |
| /******************************************* | |
| * Open serial port | |
| * DevName: "/dev/armps_rpmsgch9" | |
| * ·µ»ØÖµÎª´®¿ÚÎļþÃèÊö·û | |
| ********************************************/ | |
| int zCcApp_PortOpen(char* DevName) | |
| { | |
| // serial port information | |
| T_CC_APP_Portinfo PortInfo = {'0',115200,'8', '0','0','0','0','0','1', 0 }; | |
| int ComFd =0 ;//serial port handle | |
| int nTryOpen = 0; | |
| ComFd = open(DevName, O_RDWR); | |
| while (ComFd < 0) | |
| { | |
| //assert(nTryOpen < ZCC_APP_MAX_OPEN_PORT_TIMES); | |
| nTryOpen++; | |
| zCc_sleep(500);//500 ms later to try again | |
| ComFd = open(DevName, O_RDWR); | |
| } | |
| if (ioctl(ComFd, (('R'<<8)|1|(0x4004<<16)), 0x400) < 0) {//cov m | |
| zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s ioctl1 fail\n <---\n",__FUNCTION__); | |
| } | |
| if (ioctl(ComFd, (('R'<<8)|4|(0x4004<<16)), 0) < 0) {//cov m | |
| zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s ioctl2 fail\n <---\n",__FUNCTION__); | |
| } | |
| zCcApp_PortSet(ComFd, &PortInfo); | |
| return ComFd; | |
| } | |
| int zCcApp_StartComm(void) | |
| { | |
| /*´ò¿ª´®¿Ú*/ | |
| g_zCcApp_ComFd[1] = zCcApp_PortOpen(ZCC_APP_AT_COMM_CC); | |
| g_zCcApp_ComFd[2] = zCcApp_PortOpen(ZCC_APP_AT_COMM_SS); | |
| g_zCcApp_ComFd[3] = zCcApp_PortOpen(ZCC_APP_AT_COMM_DEV); | |
| g_zCcApp_ComFd[0] = zCcApp_PortOpen(ZCC_APP_AT_COMM_IND); | |
| return 0; | |
| } | |
| int zCcApp_GetAtIndFd(void) | |
| { | |
| int fd = 0; | |
| fd = g_zCcApp_ComFd[0]; | |
| return fd; | |
| } | |
| int zCcApp_GetAtCCFd(void) | |
| { | |
| int fd = 0; | |
| fd = g_zCcApp_ComFd[1]; | |
| return fd; | |
| } | |
| #endif | |