/*
 *      sio_2841.h
 *
 *      v 0.00 2021.6.3 by Golden
 *
 *      header for LP-2841
 *
 *      History
 *
 *              0.00    create
 */

#ifndef _SIO_H
#define _SIO_H

#include <stdio.h>				/* Standard input/output definitions */
#include <stdlib.h>
#include <unistd.h>				/* UNIX standard function definitions */
#include <fcntl.h>				/* File control definitions */
#include <errno.h>				/* Error number definitions */
#include <termios.h>			/* POSIX terminal control definitions */

#include "codes.h"
#include "common.h"
#include "debug.h"

/* Error Codes */
#define OK_PORT_CLOSE   0
#define ERR_PORT_CLOSE  -1
#define ERR_PORT_OPEN   0		/* DO NOT CHANGE THIS!! */

/*for LP-52xx with I-7K series modules */
#define SIO_DEV0     "/dev/ttyO0"       //COM1

/* sio devices : modify SIO_DEV0 ~ SIO_DEV4 for LP-2841*/
//for LP-2841(i.MX8)
#define SIO_DEV0_LP2841     "/dev/ttymxc2"     //COM1 = /dev/ttymsc2(LP-2841 for XV Board)
#define SIO_DEV1_LP2841     "/dev/ttyUSB2"     //COM2 = /dev/ttyUSB2(RS485) = /dev/ttyS0(soft link for DCON Protocol) = /dev/ttyO2
#define SIO_DEV2_LP2841     "/dev/ttymxc3"     //COM3 = /dev/ttymxc3(RS232, only for LP-2841 Console Port)
#define SIO_DEV3_LP2841     "/dev/ttyUSB0"     //COM4 = /dev/ttyUSB0(RS232) = /dev/ttyS2(soft link for DCON Protocol) = /dev/ttyO4
#define SIO_DEV4_LP2841     "/dev/ttymxc1"     //COM5 = /dev/ttymxc1(RS485) = /dev/ttyS3(soft link for DCON Protocol) = /dev/ttyO5

//for LP-9X81/ALP-9X81(i.MX8)
#define SIO_DEV0_LP9X81     "/dev/ttymxc1"     //COM1 = /dev/ttymsc1(LP-9X81 for i-97K)
#define SIO_DEV1     "/dev/ttyS0"       //COM2
#define SIO_DEV2     "/dev/ttyS1"       //COM3
#define SIO_DEV3     "/dev/ttyS2"       //COM4
#define SIO_DEV4     "/dev/ttyS3"       //COM5

#define SIO_DEV5     "/dev/ttyS4"   //COM6   
#define SIO_DEV6     "/dev/ttyS5"   //COM7
#define SIO_DEV7     "/dev/ttyS6"   //COM8
#define SIO_DEV8     "/dev/ttyS7"   //COM9
#define SIO_DEV9     "/dev/ttyS8"   //COM10
#define SIO_DEV10    "/dev/ttyS9"   //COM11
#define SIO_DEV11    "/dev/ttyS10"  //COM12
#define SIO_DEV12    "/dev/ttyS11"  //COM13
#define SIO_DEV13    "/dev/ttyS12"  //COM14
#define SIO_DEV14    "/dev/ttyS13"  //COM15
#define SIO_DEV15    "/dev/ttyS14"  //COM16 
#define SIO_DEV16    "/dev/ttyS15"  //COM17
#define SIO_DEV17    "/dev/ttyS16"  //COM18
#define SIO_DEV18    "/dev/ttyS17"  //COM19
#define SIO_DEV19    "/dev/ttyS18"  //COM20
#define SIO_DEV20    "/dev/ttyS19"  //COM21
#define SIO_DEV21    "/dev/ttyS20"  //COM22
#define SIO_DEV22    "/dev/ttyS21"  //COM23
#define SIO_DEV23    "/dev/ttyS22"  //COM24
#define SIO_DEV24    "/dev/ttyS23"  //COM25
#define SIO_DEV25    "/dev/ttyS24"  //COM26
#define SIO_DEV26    "/dev/ttyS25"  //COM27
#define SIO_DEV27    "/dev/ttyS26"  //COM28
#define SIO_DEV28    "/dev/ttyS27"  //COM29
#define SIO_DEV29    "/dev/ttyS28"  //COM30
#define SIO_DEV30    "/dev/ttyS29"  //COM31
#define SIO_DEV31    "/dev/ttyS30"  //COM32
#define SIO_DEV32    "/dev/ttyS31"  //COM33
#define SIO_DEV33    "/dev/ttyS32"  //COM34
#define SIO_DEV34    "/dev/ttyS33"  //COM35
#define SIO_DEV35    "/dev/ttyS34"  //COM36
#define SIO_DEV36    "/dev/ttyS35"  //COM37
#define SIO_DEV37    "/dev/ttyS36"  //COM38
#define SIO_DEV38    "/dev/ttyS37"  //COM39
#define SIO_DEV39    "/dev/ttyS38"  //COM40
#define SIO_DEV40    "/dev/ttyS39"  //COM41
#define SIO_DEV41    "/dev/ttyS40"  //COM42
#define SIO_DEV42    "/dev/ttyS41"  //COM43
#define SIO_DEV43    "/dev/ttyS42"  //COM44
#define SIO_DEV44    "/dev/ttyS43"  //COM45
#define SIO_DEV45    "/dev/ttyS44"  //COM46
#define SIO_DEV46    "/dev/ttyS45"  //COM47
#define SIO_DEV47    "/dev/ttyS46"  //COM48
#define SIO_DEV48    "/dev/ttyS47"  //COM49
#define SIO_DEV49    "/dev/ttyS48"  //COM50

#define USB_DEV0     "/dev/ttyUSB0" 
#define USB_DEV1     "/dev/ttyUSB1" 
#define USB_DEV2     "/dev/ttyUSB2" 
#define USB_DEV3     "/dev/ttyUSB3" //USB_COM3
#define USB_DEV4     "/dev/ttyUSB4" //USB_COM4 = EC25 GPS
#define USB_DEV5     "/dev/ttyUSB5" //USB_COM5 = EC25 AT
#define USB_DEV6     "/dev/ttyUSB6" //USB_COM6 = EC25 3G/4G


/* data bits */
#define DATA_BITS_5  CS5
#define DATA_BITS_6  CS6
#define DATA_BITS_7  CS7
#define DATA_BITS_8  CS8

/* parity check */
#define NO_PARITY    0
#define ODD_PARITY   1
#define EVEN_PARITY  2

/* stop bit(s) */
#define ONE_STOP_BIT    0
#define ONE_5_STOP_BIT  1		/* but there is no 1.5 stop bit to be */
				/* defined in Linux POSIX control mode flags */
#define ONE_P5_STOP_BIT 1		/* but there is no 1.5 stop bit defined */
				/* in Linux POSIX control mode flags */
#define TWO_STOP_BIT    2
#define TWO_STOP_BITS   2

struct sio {
	struct sio *next;			/* next opened sio device */
	int fd;						/* file descriptor of this port */
	const char *name;			/* device name */
	struct termios *options;	/* current options of this port */
	struct termios *old_options;	/* original options */
};

extern void sio_set_noncan(int fd);
extern void sio_set_canon(int fd);
extern void sio_set_timer(int fd, cc_t vmin, cc_t vtime);
extern void sio_poptions(int fd);
extern int sio_set_baud(int fd, speed_t baud);
extern int sio_open(const char *port, speed_t baud, tcflag_t data,
					tcflag_t parity, tcflag_t stop);
extern int sio_close(int fd);

#endif							/* _SIO_H */
