问题起因:平台:全志A40I 系统:Android6.0 IC:TJ1050 客户:XX项目主板 发送指令给 XX设备, 会收到设备回复 ,同时会收到回显的信息。主板测试 把串口和TJA1050这个芯片断开,就不会回显了。cpu ttl出来没回显,那说明cpu uart配置ok。
发送是直接到canl和canh,canl和canh经过运算器到ttl的rx,rx有数据就显示。怎么才能让普通串口使用can的物理层,不出现回显。
uart不回显,接上这个can芯片回显,需要通过软件修改不回显。
diff --git a/lichee/linux-3.10/drivers/tty/serial/sunxi-uart.c b/lichee/linux-3.10/drivers/tty/serial/sunxi-uart.c
index 7ea5a16..0db1231 100755
--- a/lichee/linux-3.10/drivers/tty/serial/sunxi-uart.c
+++ b/lichee/linux-3.10/drivers/tty/serial/sunxi-uart.c
@@ -39,7 +39,7 @@#include #include #include
-
+#include #include "sunxi-uart.h"//#define CONFIG_SW_UART_DUMP_DATA
@@ -140,6 +140,7 @@ static unsigned int sw_uart_handle_rx(struct sw_uart_port *sw_uport, unsigned inchar flag;do {
+ if (likely(lsr & SUNXI_UART_LSR_DR)) {ch = serial_in(&sw_uport->port, SUNXI_UART_RBR);#ifdef CONFIG_SW_UART_DUMP_DATA
@@ -191,11 +192,18 @@ static unsigned int sw_uart_handle_rx(struct sw_uart_port *sw_uport, unsigned in}if (uart_handle_sysrq_char(&sw_uport->port, ch))goto ignore_char;
+ #ifdef CONFIG_SW_UART_TX_DATA
+ //printk("kevin rx=%c\n",ch);
+ if (atomic_read(&sw_uport->atomic_tx) == 1) {
+ goto ignore_char;
+ }
+ #endif
+ uart_insert_char(&sw_uport->port, lsr, SUNXI_UART_LSR_OE, ch, flag);ignore_char:lsr = serial_in(&sw_uport->port, SUNXI_UART_LSR);} while ((lsr & (SUNXI_UART_LSR_DR | SUNXI_UART_LSR_BI)) && (max_count-- > 0));
-
+ SERIAL_DUMP(sw_uport, "Rx");spin_unlock(&sw_uport->port.lock);tty_flip_buffer_push(&sw_uport->port.state->port);
@@ -246,10 +254,15 @@ static void sw_uart_handle_tx(struct sw_uart_port *sw_uport)return;}count = sw_uport->port.fifosize / 2;
+ #ifdef CONFIG_SW_UART_TX_DATA
+ if (sw_uport->port.line == UART_TX_DATA_INDEX) {
+ atomic_set(&sw_uport->atomic_tx,1);
+ }
+ #endifdo {
-#ifdef CONFIG_SW_UART_DUMP_DATA
- sw_uport->dump_buff[sw_uport->dump_len++] = xmit->buf[xmit->tail];
-#endif
+ #ifdef CONFIG_SW_UART_DUMP_DATA
+ sw_uport->dump_buff[sw_uport->dump_len++] = xmit->buf[xmit->tail];
+ #endifserial_out(&sw_uport->port, xmit->buf[xmit->tail], SUNXI_UART_THR);xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);sw_uport->port.icount.tx++;
@@ -288,7 +301,9 @@ static unsigned int sw_uart_modem_status(struct sw_uart_port *sw_uport)wake_up_interruptible(&sw_uport->port.state->port.delta_msr_wait);}
-
+ #ifdef CONFIG_SW_UART_TX_DATA
+ atomic_set(&sw_uport->atomic_tx,0);
+ #endifSERIAL_DBG("modem status: %x\n", status);return status;}
@@ -1385,6 +1400,9 @@ static int sw_uart_request_resource(struct sw_uart_port* sw_uport, struct sw_uar}#endif+ #ifdef CONFIG_SW_UART_TX_DATA
+ atomic_set(&sw_uport->atomic_tx,0);
+ #endifreturn 0;}@@ -1398,6 +1416,9 @@ static int sw_uart_release_resource(struct sw_uart_port* sw_uport, struct sw_uarsw_uport->dump_len = 0;#endif+ #ifdef CONFIG_SW_UART_TX_DATA
+ atomic_set(&sw_uport->atomic_tx,0);
+ #endifclk_disable_unprepare(sw_uport->mclk);clk_put(sw_uport->mclk);@@ -1496,6 +1517,9 @@ static int sw_uart_probe(struct platform_device *pdev)if (of_property_read_bool(np, "linux,rs485-enabled-at-boot-time"))sw_uport->rs485conf.flags |= SER_RS485_ENABLED;+ #ifdef CONFIG_SW_UART_TX_DATA
+ atomic_set(&sw_uport->atomic_tx,0);
+ #endifpdata->used = 1;port->iotype = UPIO_MEM;port->type = PORT_SUNXI;
diff --git a/lichee/linux-3.10/drivers/tty/serial/sunxi-uart.h b/lichee/linux-3.10/drivers/tty/serial/sunxi-uart.h
index 19d6595..57ccc17 100755
--- a/lichee/linux-3.10/drivers/tty/serial/sunxi-uart.h
+++ b/lichee/linux-3.10/drivers/tty/serial/sunxi-uart.h
@@ -20,6 +20,9 @@#include +#define CONFIG_SW_UART_TX_DATA
+#define UART_TX_DATA_INDEX 4
+struct sw_uart_pdata {unsigned int used;unsigned int io_num;
@@ -48,6 +51,10 @@ struct sw_uart_port {#define MAX_DUMP_SIZE 1024unsigned int dump_len;char* dump_buff;
+
+ #ifdef CONFIG_SW_UART_TX_DATA
+ atomic_t atomic_tx;
+ #endifstruct proc_dir_entry *proc_root;struct proc_dir_entry *proc_info;
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!