📄 serial.c
字号:
.iclrintradr = R_DMA_CH5_CLR_INTR, .ifirstadr = R_DMA_CH5_FIRST, .icmdadr = R_DMA_CH5_CMD, .idescradr = R_DMA_CH5_DESCR, .flags = STD_FLAGS, .rx_ctrl = DEF_RX, .tx_ctrl = DEF_TX, .iseteop = 1,#ifdef CONFIG_ETRAX_SERIAL_PORT3 .enabled = 1,#ifdef CONFIG_ETRAX_SERIAL_PORT3_DMA4_OUT .dma_out_enabled = 1,#else .dma_out_enabled = 0,#endif#ifdef CONFIG_ETRAX_SERIAL_PORT3_DMA5_IN .dma_in_enabled = 1,#else .dma_in_enabled = 0#endif#else .enabled = 0, .dma_out_enabled = 0, .dma_in_enabled = 0 #endif } /* ttyS3 */#endif};#define NR_PORTS (sizeof(rs_table)/sizeof(struct e100_serial)) static struct tty_struct *serial_table[NR_PORTS]; static struct termios *serial_termios[NR_PORTS];static struct termios *serial_termios_locked[NR_PORTS];#ifdef CONFIG_ETRAX_SERIAL_FAST_TIMERstatic struct fast_timer fast_timers[NR_PORTS];#endif#ifdef CONFIG_ETRAX_SERIAL_PROC_ENTRY#define PROCSTAT(x) xstruct ser_statistics_type { int overrun_cnt; int early_errors_cnt; int ser_ints_ok_cnt; int errors_cnt; unsigned long int processing_flip; unsigned long processing_flip_still_room; unsigned long int timeout_flush_cnt; int rx_dma_ints; int tx_dma_ints; int rx_tot; int tx_tot;};static struct ser_statistics_type ser_stat[NR_PORTS];#else#define PROCSTAT(x)#endif /* CONFIG_ETRAX_SERIAL_PROC_ENTRY *//* RS-485 */#if defined(CONFIG_ETRAX_RS485)#ifdef CONFIG_ETRAX_FAST_TIMERstatic struct fast_timer fast_timers_rs485[NR_PORTS];#endif#if defined(CONFIG_ETRAX_RS485_ON_PA)static int rs485_pa_bit = CONFIG_ETRAX_RS485_ON_PA_BIT;#endif#endif/* Info and macros needed for each ports extra control/status signals. */#define E100_STRUCT_PORT(line, pinname) \ ((CONFIG_ETRAX_SER##line##_##pinname##_ON_PA_BIT >= 0)? \ (R_PORT_PA_DATA): ( \ (CONFIG_ETRAX_SER##line##_##pinname##_ON_PB_BIT >= 0)? \ (R_PORT_PB_DATA):&dummy_ser[line]))#define E100_STRUCT_SHADOW(line, pinname) \ ((CONFIG_ETRAX_SER##line##_##pinname##_ON_PA_BIT >= 0)? \ (&port_pa_data_shadow): ( \ (CONFIG_ETRAX_SER##line##_##pinname##_ON_PB_BIT >= 0)? \ (&port_pb_data_shadow):&dummy_ser[line]))#define E100_STRUCT_MASK(line, pinname) \ ((CONFIG_ETRAX_SER##line##_##pinname##_ON_PA_BIT >= 0)? \ (1<<CONFIG_ETRAX_SER##line##_##pinname##_ON_PA_BIT): ( \ (CONFIG_ETRAX_SER##line##_##pinname##_ON_PB_BIT >= 0)? \ (1<<CONFIG_ETRAX_SER##line##_##pinname##_ON_PB_BIT):DUMMY_##pinname##_MASK))#define DUMMY_DTR_MASK 1#define DUMMY_RI_MASK 2#define DUMMY_DSR_MASK 4#define DUMMY_CD_MASK 8static unsigned char dummy_ser[NR_PORTS] = {0xFF, 0xFF, 0xFF,0xFF};/* If not all status pins are used or disabled, use mixed mode */#ifdef CONFIG_ETRAX_SERIAL_PORT0#define SER0_PA_BITSUM (CONFIG_ETRAX_SER0_DTR_ON_PA_BIT+CONFIG_ETRAX_SER0_RI_ON_PA_BIT+CONFIG_ETRAX_SER0_DSR_ON_PA_BIT+CONFIG_ETRAX_SER0_CD_ON_PA_BIT)#if SER0_PA_BITSUM != -4# if CONFIG_ETRAX_SER0_DTR_ON_PA_BIT == -1# ifndef CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED 1# endif# endif# if CONFIG_ETRAX_SER0_RI_ON_PA_BIT == -1# ifndef CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED 1# endif# endif# if CONFIG_ETRAX_SER0_DSR_ON_PA_BIT == -1# ifndef CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED 1# endif# endif# if CONFIG_ETRAX_SER0_CD_ON_PA_BIT == -1# ifndef CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED 1# endif# endif#endif#define SER0_PB_BITSUM (CONFIG_ETRAX_SER0_DTR_ON_PB_BIT+CONFIG_ETRAX_SER0_RI_ON_PB_BIT+CONFIG_ETRAX_SER0_DSR_ON_PB_BIT+CONFIG_ETRAX_SER0_CD_ON_PB_BIT)#if SER0_PB_BITSUM != -4# if CONFIG_ETRAX_SER0_DTR_ON_PB_BIT == -1# ifndef CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED 1# endif# endif# if CONFIG_ETRAX_SER0_RI_ON_PB_BIT == -1# ifndef CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED 1# endif# endif# if CONFIG_ETRAX_SER0_DSR_ON_PB_BIT == -1# ifndef CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED 1# endif# endif# if CONFIG_ETRAX_SER0_CD_ON_PB_BIT == -1# ifndef CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED 1# endif# endif#endif#endif /* PORT0 */#ifdef CONFIG_ETRAX_SERIAL_PORT1#define SER1_PA_BITSUM (CONFIG_ETRAX_SER1_DTR_ON_PA_BIT+CONFIG_ETRAX_SER1_RI_ON_PA_BIT+CONFIG_ETRAX_SER1_DSR_ON_PA_BIT+CONFIG_ETRAX_SER1_CD_ON_PA_BIT)#if SER1_PA_BITSUM != -4# if CONFIG_ETRAX_SER1_DTR_ON_PA_BIT == -1# ifndef CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED 1# endif# endif# if CONFIG_ETRAX_SER1_RI_ON_PA_BIT == -1# ifndef CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED 1# endif# endif# if CONFIG_ETRAX_SER1_DSR_ON_PA_BIT == -1# ifndef CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED 1# endif# endif# if CONFIG_ETRAX_SER1_CD_ON_PA_BIT == -1# ifndef CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED 1# endif# endif#endif#define SER1_PB_BITSUM (CONFIG_ETRAX_SER1_DTR_ON_PB_BIT+CONFIG_ETRAX_SER1_RI_ON_PB_BIT+CONFIG_ETRAX_SER1_DSR_ON_PB_BIT+CONFIG_ETRAX_SER1_CD_ON_PB_BIT)#if SER1_PB_BITSUM != -4# if CONFIG_ETRAX_SER1_DTR_ON_PB_BIT == -1# ifndef CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED 1# endif# endif# if CONFIG_ETRAX_SER1_RI_ON_PB_BIT == -1# ifndef CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED 1# endif# endif# if CONFIG_ETRAX_SER1_DSR_ON_PB_BIT == -1# ifndef CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED 1# endif# endif# if CONFIG_ETRAX_SER1_CD_ON_PB_BIT == -1# ifndef CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED 1# endif# endif#endif#endif /* PORT1 */#ifdef CONFIG_ETRAX_SERIAL_PORT2#define SER2_PA_BITSUM (CONFIG_ETRAX_SER2_DTR_ON_PA_BIT+CONFIG_ETRAX_SER2_RI_ON_PA_BIT+CONFIG_ETRAX_SER2_DSR_ON_PA_BIT+CONFIG_ETRAX_SER2_CD_ON_PA_BIT)#if SER2_PA_BITSUM != -4# if CONFIG_ETRAX_SER2_DTR_ON_PA_BIT == -1# ifndef CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED 1# endif# endif# if CONFIG_ETRAX_SER2_RI_ON_PA_BIT == -1# ifndef CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED 1# endif# endif# if CONFIG_ETRAX_SER2_DSR_ON_PA_BIT == -1# ifndef CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED 1# endif# endif# if CONFIG_ETRAX_SER2_CD_ON_PA_BIT == -1# ifndef CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED 1# endif# endif#endif#define SER2_PB_BITSUM (CONFIG_ETRAX_SER2_DTR_ON_PB_BIT+CONFIG_ETRAX_SER2_RI_ON_PB_BIT+CONFIG_ETRAX_SER2_DSR_ON_PB_BIT+CONFIG_ETRAX_SER2_CD_ON_PB_BIT)#if SER2_PB_BITSUM != -4# if CONFIG_ETRAX_SER2_DTR_ON_PB_BIT == -1# ifndef CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED 1# endif# endif# if CONFIG_ETRAX_SER2_RI_ON_PB_BIT == -1# ifndef CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED 1# endif# endif# if CONFIG_ETRAX_SER2_DSR_ON_PB_BIT == -1# ifndef CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED 1# endif# endif# if CONFIG_ETRAX_SER2_CD_ON_PB_BIT == -1# ifndef CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED 1# endif# endif#endif#endif /* PORT2 */#ifdef CONFIG_ETRAX_SERIAL_PORT3#define SER3_PA_BITSUM (CONFIG_ETRAX_SER3_DTR_ON_PA_BIT+CONFIG_ETRAX_SER3_RI_ON_PA_BIT+CONFIG_ETRAX_SER3_DSR_ON_PA_BIT+CONFIG_ETRAX_SER3_CD_ON_PA_BIT)#if SER3_PA_BITSUM != -4# if CONFIG_ETRAX_SER3_DTR_ON_PA_BIT == -1# ifndef CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED 1# endif# endif# if CONFIG_ETRAX_SER3_RI_ON_PA_BIT == -1# ifndef CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED 1# endif# endif# if CONFIG_ETRAX_SER3_DSR_ON_PA_BIT == -1# ifndef CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED 1# endif# endif# if CONFIG_ETRAX_SER3_CD_ON_PA_BIT == -1# ifndef CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED 1# endif# endif#endif#define SER3_PB_BITSUM (CONFIG_ETRAX_SER3_DTR_ON_PB_BIT+CONFIG_ETRAX_SER3_RI_ON_PB_BIT+CONFIG_ETRAX_SER3_DSR_ON_PB_BIT+CONFIG_ETRAX_SER3_CD_ON_PB_BIT)#if SER3_PB_BITSUM != -4# if CONFIG_ETRAX_SER3_DTR_ON_PB_BIT == -1# ifndef CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED 1# endif# endif# if CONFIG_ETRAX_SER3_RI_ON_PB_BIT == -1# ifndef CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED 1# endif# endif# if CONFIG_ETRAX_SER3_DSR_ON_PB_BIT == -1# ifndef CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED 1# endif# endif# if CONFIG_ETRAX_SER3_CD_ON_PB_BIT == -1# ifndef CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED# define CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED 1# endif# endif#endif#endif /* PORT3 */#if defined(CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED) || \ defined(CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED) || \ defined(CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED) || \ defined(CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED)#define CONFIG_ETRAX_SERX_DTR_RI_DSR_CD_MIXED#endif#ifdef CONFIG_ETRAX_SERX_DTR_RI_DSR_CD_MIXED/* The pins can be mixed on PA and PB */#define CONTROL_PINS_PORT_NOT_USED(line) \ &dummy_ser[line], &dummy_ser[line], \ &dummy_ser[line], &dummy_ser[line], \ &dummy_ser[line], &dummy_ser[line], \ &dummy_ser[line], &dummy_ser[line], \ DUMMY_DTR_MASK, DUMMY_RI_MASK, DUMMY_DSR_MASK, DUMMY_CD_MASK struct control_pins{ volatile unsigned char *dtr_port; unsigned char *dtr_shadow; volatile unsigned char *ri_port; unsigned char *ri_shadow; volatile unsigned char *dsr_port; unsigned char *dsr_shadow; volatile unsigned char *cd_port; unsigned char *cd_shadow; unsigned char dtr_mask; unsigned char ri_mask; unsigned char dsr_mask; unsigned char cd_mask;};static const struct control_pins e100_modem_pins[NR_PORTS] = { /* Ser 0 */ {#ifdef CONFIG_ETRAX_SERIAL_PORT0 E100_STRUCT_PORT(0,DTR), E100_STRUCT_SHADOW(0,DTR), E100_STRUCT_PORT(0,RI), E100_STRUCT_SHADOW(0,RI), E100_STRUCT_PORT(0,DSR), E100_STRUCT_SHADOW(0,DSR), E100_STRUCT_PORT(0,CD), E100_STRUCT_SHADOW(0,CD), E100_STRUCT_MASK(0,DTR), E100_STRUCT_MASK(0,RI), E100_STRUCT_MASK(0,DSR), E100_STRUCT_MASK(0,CD)#else CONTROL_PINS_PORT_NOT_USED(0)#endif }, /* Ser 1 */ {#ifdef CONFIG_ETRAX_SERIAL_PORT1 E100_STRUCT_PORT(1,DTR), E100_STRUCT_SHADOW(1,DTR), E100_STRUCT_PORT(1,RI), E100_STRUCT_SHADOW(1,RI), E100_STRUCT_PORT(1,DSR), E100_STRUCT_SHADOW(1,DSR), E100_STRUCT_PORT(1,CD), E100_STRUCT_SHADOW(1,CD), E100_STRUCT_MASK(1,DTR), E100_STRUCT_MASK(1,RI), E100_STRUCT_MASK(1,DSR), E100_STRUCT_MASK(1,CD)#else CONTROL_PINS_PORT_NOT_USED(1)#endif }, /* Ser 2 */ {#ifdef CONFIG_ETRAX_SERIAL_PORT2 E100_STRUCT_PORT(2,DTR), E100_STRUCT_SHADOW(2,DTR), E100_STRUCT_PORT(2,RI), E100_STRUCT_SHADOW(2,RI), E100_STRUCT_PORT(2,DSR), E100_STRUCT_SHADOW(2,DSR), E100_STRUCT_PORT(2,CD), E100_STRUCT_SHADOW(2,CD), E100_STRUCT_MASK(2,DTR), E100_STRUCT_MASK(2,RI), E100_STRUCT_MASK(2,DSR), E100_STRUCT_MASK(2,CD)#else CONTROL_PINS_PORT_NOT_USED(2)#endif }, /* Ser 3 */ {#ifdef CONFIG_ETRAX_SERIAL_PORT3 E100_STRUCT_PORT(3,DTR), E100_STRUCT_SHADOW(3,DTR), E100_STRUCT_PORT(3,RI), E100_STRUCT_SHADOW(3,RI), E100_STRUCT_PORT(3,DSR), E100_STRUCT_SHADOW(3,DSR), E100_STRUCT_PORT(3,CD), E100_STRUCT_SHADOW(3,CD), E100_STRUCT_MASK(3,DTR), E100_STRUCT_MASK(3,RI), E100_STRUCT_MASK(3,DSR), E100_STRUCT_MASK(3,CD)#else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -