Android 内核关闭CAN 串口设备回显功能

简介: Android 内核关闭CAN 串口设备回显功能

这个补丁是我在全志A40 6.0增加的 , 当时是客户在搞can设备 , 但是收发的时候 can串口数据回显 我记得当时还研究了半天.....希望对有需要之人有帮助吧。

Rockchip系列之深度分析CAN接口系列(1)_一歲抬頭的博客-CSDN博客

Rockchip系列之CAN 新增framework系统jni接口访问(2)-CSDN博客

Rockchip系列之CAN 新增framework封装service+manager访问(3)-CSDN博客

Rockchip系列之CAN APP测试应用实现(4)_一歲抬頭的博客-CSDN博客

Rockchip CAN 部分波特率收发不正常解决思路_一歲抬頭的博客-CSDN博客

Android JNI与CAN通信遇到的问题总结_android can通信-CSDN博客

Android 内核关闭CAN 串口设备回显功能_一歲抬頭的博客-CSDN博客

这个补丁主要修改了 Linux 内核的串行 UART 驱动代码,以支持特定的硬件设备。

修改的文件

  • lichee/linux-3.10/drivers/input/touchscreen/gt9xx_new.zip
  • lichee/linux-3.10/drivers/tty/serial/sunxi-uart.c
  • lichee/linux-3.10/drivers/tty/serial/sunxi-uart.h

对每个文件的修改说明

  • sunxi-uart.c:在处理接收和发送数据的函数中添加了对新配置的支持,并在相关函数中初始化了新添加的配置。
  • sunxi-uart.h:在结构体 sw_uart_port 中添加了新的成员 atomic_tx,并定义了新的宏 CONFIG_SW_UART_TX_DATAUART_TX_DATA_INDEX

如何应用这个补丁

  1. 将这个补丁应用到的 Linux 内核源码树中。
  2. 根据的硬件配置,可能需要修改 sunxi-uart.csunxi-uart.h 中的相关设置。
  3. 编译并安装的 Linux 内核。
  4. 当的设备启动时,系统应该能够正确地检测和使用特定的硬件设备。

注意:这个补丁可能需要根据的具体硬件和 Linux 内核版本进行一些调整。

 .../drivers/tty/serial/sunxi-uart.c           |  36 +++++++++++++++---
 .../drivers/tty/serial/sunxi-uart.h           |   7 ++++
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 7ea5a16463..0db1231f30 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 <linux/of.h>
 #include <linux/of_irq.h>
 #include <linux/of_address.h>
-
+#include <linux/atomic.h>
 #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 in
  char 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("can_test 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);
+ }
+ #endif
  do {
-#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];
+   #endif
    serial_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);
+ #endif
  SERIAL_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);
+ #endif
  return 0;
 }
 
@@ -1398,6 +1416,9 @@ static int sw_uart_release_resource(struct sw_uart_port* sw_uport, struct sw_uar
  sw_uport->dump_len = 0;
  #endif
 
+ #ifdef CONFIG_SW_UART_TX_DATA
+ atomic_set(&sw_uport->atomic_tx,0);
+ #endif
  clk_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);
+ #endif
  pdata->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 19d65950c5..57ccc176e1 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 <linux/regulator/consumer.h>
 
+#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  1024
  unsigned int dump_len;
  char* dump_buff;
+ 
+ #ifdef CONFIG_SW_UART_TX_DATA
+ atomic_t  atomic_tx;
+ #endif
  struct proc_dir_entry *proc_root;
  struct proc_dir_entry *proc_info;
 
-- 
2.25.1


相关文章
|
1月前
|
存储 Linux API
深入探索Android系统架构:从内核到应用层的全面解析
本文旨在为读者提供一份详尽的Android系统架构分析,从底层的Linux内核到顶层的应用程序框架。我们将探讨Android系统的模块化设计、各层之间的交互机制以及它们如何共同协作以支持丰富多样的应用生态。通过本篇文章,开发者和爱好者可以更深入理解Android平台的工作原理,从而优化开发流程和提升应用性能。
|
5月前
|
Shell Linux 开发工具
"开发者的救星:揭秘如何用adb神器征服Android设备,开启高效调试之旅!"
【8月更文挑战第20天】Android Debug Bridge (adb) 是 Android 开发者必备工具,用于实现计算机与 Android 设备间通讯,执行调试及命令操作。adb 提供了丰富的命令行接口,覆盖从基础设备管理到复杂系统操作的需求。本文详细介绍 adb 的安装配置流程,并列举实用命令示例,包括设备连接管理、应用安装调试、文件系统访问等基础功能,以及端口转发、日志查看等高级技巧。此外,还提供了常见问题的故障排除指南,帮助开发者快速解决问题。掌握 adb 将极大提升 Android 开发效率,助力项目顺利推进。
146 0
|
2月前
|
Java Linux Android开发
深入探索Android系统架构:从Linux内核到应用层
本文将带领读者深入了解Android操作系统的复杂架构,从其基于Linux的内核到丰富多彩的应用层。我们将探讨Android的各个关键组件,包括硬件抽象层(HAL)、运行时环境、以及核心库等,揭示它们如何协同工作以支持广泛的设备和应用。通过本文,您将对Android系统的工作原理有一个全面的认识,理解其如何平衡开放性与安全性,以及如何在多样化的设备上提供一致的用户体验。
|
3月前
|
Android开发
Android开发表情emoji功能开发
本文介绍了一种在Android应用中实现emoji表情功能的方法,通过将图片与表情字符对应,实现在`TextView`中的正常显示。示例代码展示了如何使用自定义适配器加载emoji表情,并在编辑框中输入或删除表情。项目包含完整的源码结构,可作为开发参考。视频演示和源码详情见文章内链接。
94 4
Android开发表情emoji功能开发
|
3月前
|
安全 Android开发 iOS开发
Android vs iOS:探索移动操作系统的设计与功能差异###
【10月更文挑战第20天】 本文深入分析了Android和iOS两个主流移动操作系统在设计哲学、用户体验、技术架构等方面的显著差异。通过对比,揭示了这两种系统各自的独特优势与局限性,并探讨了它们如何塑造了我们的数字生活方式。无论你是开发者还是普通用户,理解这些差异都有助于更好地选择和使用你的移动设备。 ###
75 3
|
5月前
|
编解码 测试技术 Android开发
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
本文详细介绍了如何利用CameraX库实现高质量的照片及视频拍摄功能,包括添加依赖、初始化、权限请求、配置预览与捕获等关键步骤。此外,还特别针对不同分辨率和帧率的视频拍摄提供了性能优化策略,确保应用既高效又稳定。
573 1
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
|
4月前
|
Android开发 开发者
Android平台无纸化同屏如何实现实时录像功能
Android平台无纸化同屏,如果需要本地录像的话,实现难度不大,只要复用之前开发的录像模块的就可以,对我们来说,同屏采集这块,只是数据源不同而已,如果是自采集的其他数据,我们一样可以编码录像。
|
5月前
|
Android开发
基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离
本文介绍了如何在基于Amlogic T972的Android 9.0系统上使用Platform平台驱动框架和设备树(DTS),实现设备与驱动的分离,并通过静态枚举在设备树中描述设备,自动触发驱动程序的加载和设备创建。
118 0
基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离
|
5月前
|
Android开发 C语言
基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备
这篇文章是关于如何在基于Amlogic T972的Android 9.0系统上,通过自动分配设备号和自动创建设备节点文件的方式,开发字符设备驱动程序的教程。
102 0
基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备
|
5月前
|
自然语言处理 Shell Linux
基于Amlogic 安卓9.0, 驱动简说(一):字符设备驱动,手动创建设备
本文是关于在Amlogic安卓9.0平台上创建字符设备驱动的教程,详细介绍了驱动程序的编写、编译、部署和测试过程,并提供了完整的源码和应用层调用示例。
143 0
基于Amlogic 安卓9.0, 驱动简说(一):字符设备驱动,手动创建设备

热门文章

最新文章