/* * Comm_Test.c * * Created on: 2020¦~4¤ë20¤é * Author: Wendell */ #include #include #include "Comm_Test.h" #include "IO_Test.h" #include #include #include #include #include #include //write, close, usleep, read #include #include //uart #include //uart int Can0Fd, Can1Fd, LcmPort, RfidPort, InternalCommPort; char *LcmPortName = "/dev/ttyS3"; char *RfidPortName = "/dev/ttyS2"; char *InternalCommPortName = "/dev/ttyS5"; //================================================ // initial can-bus 0 //================================================ int InitCan0Bus() { int s0,nbytes; struct timeval tv; struct ifreq ifr0; struct sockaddr_can addr0; system("/sbin/ip link set can0 down"); system("/sbin/ip link set can0 type can bitrate 500000 restart-ms 100"); system("/sbin/ip link set can0 up"); s0 = socket(PF_CAN, SOCK_RAW, CAN_RAW); tv.tv_sec = 0; tv.tv_usec = 10000; if (setsockopt(s0, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0) { #ifdef SystemLogMessage DEBUG_ERROR("Set SO_RCVTIMEO NG"); #endif } nbytes = 40960; if (setsockopt(s0, SOL_SOCKET, SO_RCVBUF, &nbytes, sizeof(int)) < 0) { #ifdef SystemLogMessage DEBUG_ERROR("Set SO_RCVBUF NG"); #endif } nbytes = 40960; if (setsockopt(s0, SOL_SOCKET, SO_SNDBUF, &nbytes, sizeof(int)) < 0) { #ifdef SystemLogMessage DEBUG_ERROR("Set SO_SNDBUF NG"); #endif } strcpy(ifr0.ifr_name, "can0" ); ioctl(s0, SIOCGIFINDEX, &ifr0); /* ifr.ifr_ifindex gets filled with that device's index */ addr0.can_family = AF_CAN; addr0.can_ifindex = ifr0.ifr_ifindex; bind(s0, (struct sockaddr *)&addr0, sizeof(addr0)); return s0; } //================================================ // initial can-bus 1 //================================================ int InitCan1Bus() { int s0,nbytes; struct timeval tv; struct ifreq ifr0; struct sockaddr_can addr0; system("/sbin/ip link set can1 down"); system("/sbin/ip link set can1 type can bitrate 500000 restart-ms 100"); system("/sbin/ip link set can1 up"); s0 = socket(PF_CAN, SOCK_RAW, CAN_RAW); tv.tv_sec = 0; tv.tv_usec = 10000; if (setsockopt(s0, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0) { #ifdef SystemLogMessage PRINTF_LIB_FUNC("Set SO_RCVTIMEO NG"); #endif } nbytes = 40960; if (setsockopt(s0, SOL_SOCKET, SO_RCVBUF, &nbytes, sizeof(int)) < 0) { #ifdef SystemLogMessage PRINTF_LIB_FUNC("Set SO_RCVBUF NG"); #endif } nbytes = 40960; if (setsockopt(s0, SOL_SOCKET, SO_SNDBUF, &nbytes, sizeof(int)) < 0) { #ifdef SystemLogMessage PRINTF_LIB_FUNC("Set SO_SNDBUF NG"); #endif } strcpy(ifr0.ifr_name, "can1" ); ioctl(s0, SIOCGIFINDEX, &ifr0); /* ifr.ifr_ifindex gets filled with that device's index */ addr0.can_family = AF_CAN; addr0.can_ifindex = ifr0.ifr_ifindex; bind(s0, (struct sockaddr *)&addr0, sizeof(addr0)); return s0; } void SendCan0Frame(int cmd, unsigned char *data, unsigned char dataLen) { struct can_frame frame; frame.can_id = cmd; frame.can_dlc = dataLen; memcpy(frame.data, data, sizeof(frame.data)); write(Can0Fd, &frame, sizeof(struct can_frame)); } void SendCan1Frame(int cmd, unsigned char *data, unsigned char dataLen) { struct can_frame frame; frame.can_id = cmd; frame.can_dlc = dataLen; memcpy(frame.data, data, sizeof(frame.data)); write(Can1Fd, &frame, sizeof(struct can_frame)); } void Can0TxMessageTest(void) { int id = 0x80123456; unsigned char data[8]; data[0] = 0x55; data[1] = 0xAA; SendCan0Frame(id, data, 2); } void Can1TxMessageTest(void) { int id = 0x80654321; unsigned char data[8]; data[0] = 0xAA; data[1] = 0x55; SendCan1Frame(id, data, 2); } //========================================== // Open LCM Port //========================================== int OpenLcmPort() { int fd; struct termios tios; fd = open(LcmPortName, O_RDWR); if (fd <= 0) { #ifdef SystemLogMessage DEBUG_ERROR("open /dev/ttyS3 NG \n"); #endif return -1; } ioctl(fd, TCGETS, &tios); tios.c_cflag = B115200 | CS8 | CLOCAL | CREAD; tios.c_lflag = 0; tios.c_iflag = 0; tios.c_oflag = 0; tios.c_cc[VMIN] = 0; tios.c_cc[VTIME] = (unsigned char) 5; tios.c_lflag = 0; tcflush(fd, TCIFLUSH); ioctl(fd, TCSETS, &tios); return fd; } void CloseLcmPort() { close(LcmPort); } //========================================== // Open RFID Port //========================================== int OpenRfidPort() { int fd; struct termios tios; fd = open(RfidPortName, O_RDWR); if (fd <= 0) { #ifdef SystemLogMessage DEBUG_ERROR("open /dev/ttyS2 NG \n"); #endif return -1; } ioctl(fd, TCGETS, &tios); tios.c_cflag = B115200 | CS8 | CLOCAL | CREAD; tios.c_lflag = 0; tios.c_iflag = 0; tios.c_oflag = 0; tios.c_cc[VMIN] = 0; tios.c_cc[VTIME] = (unsigned char) 5; tios.c_lflag = 0; tcflush(fd, TCIFLUSH); ioctl(fd, TCSETS, &tios); return fd; } void CloseRfidPort() { close(RfidPort); } void InitRS485DirectionIO(void) { //LCD_AC_BIAS_EN => GPIO2_25*//*RS-485 for module DE control gpio_set_direction(PIN_AM_DE_1, GPIO_DIR_OUTPUT); gpio_write(PIN_AM_DE_1, 1); //system("echo 89 > /sys/class/gpio/export"); //system("echo \"out\" > /sys/class/gpio/gpio89/direction"); //system("echo 1 > /sys/class/gpio/gpio89/value"); //LCD_HSYNC => GPIO2_23*//*RS-485 for module RE control gpio_set_direction(PIN_AM_RE_1, GPIO_DIR_OUTPUT); gpio_write(PIN_AM_RE_1, 0); //system("echo 87 > /sys/class/gpio/export"); //system("echo \"out\" > /sys/class/gpio/gpio87/direction"); //system("echo 0 > /sys/class/gpio/gpio87/value"); } //========================================== // Open Internal Comm Port //========================================== int OpenInternalCommPort() { int fd; struct termios tios; fd = open(InternalCommPortName, O_RDWR); if (fd <= 0) { #ifdef SystemLogMessage DEBUG_ERROR("open /dev/ttyS5 NG \n"); #endif return -1; } ioctl(fd, TCGETS, &tios); tios.c_cflag = B115200 | CS8 | CLOCAL | CREAD; tios.c_lflag = 0; tios.c_iflag = 0; tios.c_oflag = 0; tios.c_cc[VMIN] = 0; tios.c_cc[VTIME] = (unsigned char) 5; tios.c_lflag = 0; tcflush(fd, TCIFLUSH); ioctl(fd, TCSETS, &tios); return fd; } void CloseInternalCommPort() { close(InternalCommPort); } void DoDCMCommTest(void) { struct can_frame frame; int rxByte = 0; unsigned char uartTx[2], uartRx[2]; Can0Fd = InitCan0Bus(); Can1Fd = InitCan1Bus(); LcmPort = OpenLcmPort(); RfidPort = OpenRfidPort(); InitRS485DirectionIO(); InternalCommPort = OpenInternalCommPort(); if(Can0Fd < 0) { printf("\r\nInit Can Bus 0 fail"); return; } if(Can1Fd < 0) { printf("\r\nInit Can Bus 1 fail"); return; } if(LcmPort < 0) { printf("\r\nInit LCM Port fail"); return; } if(RfidPort < 0) { printf("\r\nInit RFID Port fail"); return; } if(InternalCommPort < 0) { printf("\r\nInit Internal Comm Port fail"); return; } //*************************CAN Bus Test************************* Can0TxMessageTest(); Can1TxMessageTest(); //usleep(10000); rxByte = read(Can1Fd, &frame, sizeof(struct can_frame)); if(rxByte > 0 && frame.can_id == 0x80123456 && frame.data[0] == 0x55 && frame.data[1] == 0xAA) { printf("\r\nCan Bus 0 Tx OK"); } else { printf("\r\nCan Bus 0 Tx Fail"); return; } rxByte = read(Can0Fd, &frame, sizeof(struct can_frame)); if(rxByte > 0 && frame.can_id == 0x80654321 && frame.data[0] == 0xAA && frame.data[1] == 0x55) { printf("\r\nCan Bus 1 Tx OK"); } else { printf("\r\nCan Bus 1 Tx Fail"); return; } //*************************LCM UART Test************************* uartTx[0] = 0x55; uartTx[1] = 0xAA; write(LcmPort, uartTx, 2); rxByte = read(LcmPort, uartRx, 2); CloseLcmPort(); if(rxByte == 2 && uartRx[0] == 0x55 && uartRx[1] == 0xAA) { printf("\r\nLCM Port Test OK"); } else { printf("\r\nLCM Port Test Fail"); return; } //*************************RFID UART Test************************* uartTx[0] = 0xAA; uartTx[1] = 0x55; write(RfidPort, uartTx, 2); rxByte = read(RfidPort, uartRx, 2); CloseRfidPort(); if(rxByte == 2 && uartRx[0] == 0xAA && uartRx[1] == 0x55) { printf("\r\nRFID Port Test OK"); } else { printf("\r\nRFID Port Test Fail"); return; } //*************************Internal Comm RS485 Test************************* uartTx[0] = 0x5A; uartTx[1] = 0x5A; write(InternalCommPort, uartTx, 2); rxByte = read(InternalCommPort, uartRx, 2); CloseInternalCommPort(); if(rxByte == 2 && uartRx[0] == 0x5A && uartRx[1] == 0x5A) { printf("\r\nInternal Comm Port Test OK"); } else { printf("\r\nInternal Comm Port Test Fail"); return; } printf("\r\nComm Test Done!"); printf("\r\nSuccess!\r\n"); }