2 * PCAN-LIN, RS-232 to CAN/LIN converter control application
13 #define LIN_HDR_SIZE 2
14 #define LIN_PKT_MAX_SIZE 16 /* FIXME */
15 struct termios term_attr;
16 /* ------------------------------------------------------------------------ */
18 int read_header(int tty)
20 int p0, p1; /* Parity bits */
21 int par_rec; /* Parity received as a part of a packet */
22 int par_calc; /* Calculated parity */
24 uint8_t buff[LIN_HDR_SIZE];
25 memset(buff, '\0', sizeof(buff));
28 received = read(tty, &buff[0], 1);
32 if (buff[0] != 0x55) /* Sync byte field */
35 received = read(tty, &buff[1], 1);
42 p0 = (buff[1] ^ (buff[1] >> 1) ^ (buff[1] >> 2) ^ (buff[1] >> 4)) & 0x1;
43 p1 = ~(((buff[1] >> 1) ^ (buff[1] >> 3) ^ (buff[1] >> 4) ^ (buff[1] >> 5))) & 0x1;
45 printf("%02X ", buff[0]);
46 printf("%02X ", buff[1]);
48 par_rec = (buff[1] & 0xc0) >> 6;
49 par_calc = p0 | (p1 << 1);
50 printf("| LIN id: %02X ", buff[1] & 0x3f);
51 //printf("| par_rec: %X; par_calc: %X ", par_rec, par_calc);
52 if (par_rec == par_calc)
53 printf("| parity OK");
60 static void reset_input_mode(int tty)
62 tcsetattr(tty, TCSANOW, &term_attr);
65 static void set_input_mode(int tty)
70 /* Flush input and output queues. */
71 if (tcflush(tty, TCIOFLUSH) != 0) {
76 /* Fetch the current terminal parameters. */
78 fprintf(stderr, "Not a terminal.\n");
82 /* Save settings for later restoring */
83 tcgetattr(tty, &term_attr);
86 tcgetattr(tty, &tattr);
87 tattr.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP
88 | INLCR | IGNCR | ICRNL | IXON);
89 tattr.c_oflag &= ~OPOST;
90 tattr.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
91 tattr.c_cflag &= ~(CSIZE | PARENB);
95 tattr.c_cc[VTIME] = 0;
97 /* Set TX, RX speed */
98 cfsetispeed(&tattr, B9600);
99 cfsetospeed(&tattr, B9600);
101 status = tcsetattr(tty, TCSANOW, &tattr);
103 perror("tcsetattr()");
107 int main(int argc, char* argv[])
113 fprintf(stderr, "Device is missing\n");
114 fprintf(stderr, "Usage: %s DEVICE\n", argv[0]);
118 strncpy((char*)&dev, argv[1], 32);
119 tty = open(dev, O_RDWR);
132 reset_input_mode(tty);