模组uart调试总结

news2024/11/27 22:24:06

配置驱动选项

1.1 首先通过原理图确定其串口号,比如UART1、UART3_HS,同时查看该串口引脚是否有复用功能,比如用作SIM卡引脚。如果有复用,需要在设备树配置中取消复用功能的选项,然后选中串口功能,高通平台设备树路径为:kernel\msm-xxx\arch\arm\boot\dts\qcom或者kernel\msm-xxx\arch\arm64\boot\dts\qcom,这个路径视arm的位数而定。

1.2 编译运行内核,如果UART1驱动加载成功会在/dev目录下产生相应UART设备节点。以高通sdx20为例,系统启动之后在/dev下有两个ttyHSL设备节点:ttyHS0、ttyHSL0。输入命令(cat /proc/tty/driver/msm_serial_hs)可以显示设备节点详细信息,其中通过地址和datasheet对比即可知道UART对应的设备节点。同时通过who命令可查看当前终端tty信息。如果UART设备节点未产生,可在其相应驱动程序xx_probe函数中添加打印,查看xx_probe函数是否被调用,进一步查找原因。

 

软件回环测试

2.1 如果成功产生了UART设备节点,可通过软件回环测试确认UART驱动程序功能是否正常。比如ttyHS0,我们先将loopback.0值设置为1,打开该UART回环测试:

$ echo 1 > /sys/kernel/debug/msm_serial_hs/loopback.0
   
   

回环测试程序代码:


   
   
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<sys/types.h>
  5. #include<sys/stat.h>
  6. #include<fcntl.h>
  7. #include<unistd.h>
  8. #include<termios.h>
  9. #include<string.h>
  10. int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
  11. {
  12. struct termios newtio,oldtio;
  13. if( tcgetattr( fd,&oldtio) != 0) {
  14. perror( "tcgetattr error");
  15. return -1;
  16. }
  17. bzero( &newtio, sizeof( newtio ) );
  18. newtio.c_cflag |= CLOCAL | CREAD;
  19. newtio.c_cflag &= ~CSIZE;
  20. switch( nBits )
  21. {
  22. case 7:
  23. newtio.c_cflag |= CS7;
  24. break;
  25. case 8:
  26. newtio.c_cflag |= CS8;
  27. break;
  28. }
  29. switch( nEvent )
  30. {
  31. case 'O':
  32. newtio.c_cflag |= PARENB;
  33. newtio.c_cflag |= PARODD;
  34. newtio.c_iflag |= (INPCK | ISTRIP);
  35. break;
  36. case 'E':
  37. newtio.c_iflag |= (INPCK | ISTRIP);
  38. newtio.c_cflag |= PARENB;
  39. newtio.c_cflag &= ~PARODD;
  40. break;
  41. case 'N':
  42. newtio.c_cflag &= ~PARENB;
  43. break;
  44. }
  45. switch( nSpeed )
  46. {
  47. case 2400:
  48. cfsetispeed(&newtio, B2400);
  49. cfsetospeed(&newtio, B2400);
  50. break;
  51. case 4800:
  52. cfsetispeed(&newtio, B4800);
  53. cfsetospeed(&newtio, B4800);
  54. break;
  55. case 9600:
  56. cfsetispeed(&newtio, B9600);
  57. cfsetospeed(&newtio, B9600);
  58. break;
  59. case 115200:
  60. cfsetispeed(&newtio, B115200);
  61. cfsetospeed(&newtio, B115200);
  62. break;
  63. case 460800:
  64. cfsetispeed(&newtio, B460800);
  65. cfsetospeed(&newtio, B460800);
  66. break;
  67. default:
  68. cfsetispeed(&newtio, B9600);
  69. cfsetospeed(&newtio, B9600);
  70. break;
  71. }
  72. if( nStop == 1){
  73. newtio.c_cflag &= ~CSTOPB;
  74. } else if ( nStop == 2 ){
  75. newtio.c_cflag |= CSTOPB;
  76. }
  77. newtio.c_cc[VTIME] = 0;
  78. newtio.c_cc[VMIN] = 0;
  79. tcflush(fd,TCIFLUSH);
  80. if(( tcsetattr(fd,TCSANOW,&newtio))!= 0)
  81. {
  82. perror( "set error");
  83. return -1;
  84. }
  85. return 0;
  86. }
  87. int main(int argc,char *argv[])
  88. {
  89. int fd,ret_set,ret_read,ret;
  90. char buf_read[ 100];
  91. char tty[ 20]= "/dev/";
  92. if( 4 == argc)
  93. {
  94. strcat(tty,argv[ 1]);
  95. fd = open(tty, O_RDWR);
  96. if(fd == -1)
  97. {
  98. printf( "Open %s failed! Exit!\n",tty);
  99. exit( 1);
  100. }
  101. printf( "open %s successfully!\n",tty);
  102. ret_set = set_opt(fd, atoi(argv[ 2]), 8, 'N', 1);
  103. if (ret_set == -1)
  104. {
  105. printf( "Set %s failed! Exit!\n",tty);
  106. exit( 1);
  107. }
  108. printf( "Set %s successfully!\n",tty);
  109. printf( "Baud rate: %s\n",argv[ 2]);
  110. printf( "Data: %s\n",argv[ 3]);
  111. while ( 1)
  112. {
  113. memset(buf_read, 0, sizeof(buf_read));
  114. ret = write(fd, argv[ 3], 100);
  115. if( ret > 0){
  116. printf( "Write data: %s\n",argv[ 3]);
  117. } else{
  118. printf( "Write data failed! Exit!\n");
  119. exit( 1);
  120. }
  121. ret_read = read(fd, buf_read, 100);
  122. if(ret_read > 0){
  123. printf( "Read data: %s\n\n", buf_read);
  124. }
  125. sleep( 3);
  126. }
  127. close(fd);
  128. } else{
  129. printf( "Usage: uart [tty node] [baud rate] [data]\n");
  130. printf( " Sample: uart ttyHSL1 115200 test\n");
  131. }
  132. return 0;
  133. }

测试程序github地址:https://github.com/IOT-er/uart

交叉编译得到执行文件uart:

$ arm-linux-gcc -g uart.c -o uart
   
   

运行uart进行回环测试:

可以看到UART1成功收到了发送的 hello字符。

还有一种简单的软件测试方式:


   
   
  1. adb shell
  2. echo 1 > /sys /kernel /debug /msm_serial_hs /loopback. 0 / /打开回环开关
  3. cat /sys /kernel /debug /msm_serial_hs /loopback. 0 / /确保已经打开回环开关了
  4. adb shell
  5. cat /dev /ttyHS 0
  6. adb shell
  7. echo "This Is A Test" > /dev /ttyHS 0 - >Transfer data

 

 

管脚信号测试

软件回环测试通过之后,查看uart gpio是否ok:tx高电平(uart空闲时tx传输二进制1)、rfr为低电平,rx,cts为输入。如果tx为低电平,那么gpio肯定没有配置好,再次检查gpio配置问题,还有确认硬件线路无误后最可能的原因是TX管脚被其他功能占用。如果以上2步都ok,那么UART应该ok了。再次检查将UART1的RX、TX管脚短接,关闭软件回环,使用uart程序进行自收发测试。关闭软件回环:

$ echo 0 > /sys/kernel/debug/msm_serial_hs/loopback.0
   
   

将rx和tx短接后,检查步骤如下,如果管脚信号测试通过,则串口功能基本调试成功。此方法的优点是无需上位机串口助手的配合,在串口模块到位之前提前完成接口调试工作。


   
   
  1. adb shell
  2. echo 1 > /sys /kernel /debug /msm_serial_hs /loopback. 0 / /打开回环开关
  3. cat /sys /kernel /debug /msm_serial_hs /loopback. 0 / /确保已经打开回环开关了
  4. adb shell
  5. cat /dev /ttyHS 0
  6. adb shell
  7. echo "This Is A Test" > /dev /ttyHS 0 - >Transfer data

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/533343.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【嵌入式环境下linux内核及驱动学习笔记-(12-设备树操作函数)】

目录 1、设备树对应的数据结构1.1 struct device_node1.2 struct property 2、设备树操作函数2.1 查找字点的函数2.1.1 of_find_node_by_path2.1.2 of_find_node_by_name2.1.3 of_find_node_by_type2.1.4 of_find_compatible_node2.1.5 of_find_node_by_phandle2.1.6 of_get_ch…

Automa爬取网页数据直接入库(四)

介绍 在使用automa浏览器插件爬取数据时,可以直接通过发送请求将爬取到的网页数据持久化到数据库中 本次以360趋势图爬取后插入数据库当做测试 建立流程 首先建立打开360趋势图的流程,这个不再演示,直接从获取分析元素开始 打开要爬取的网页 点击定位元素 建立表格存储爬取…

【shell脚本】免交互操作

免交互操作 一、Here Document免交互1.1免交互概述1.2语法格式1.3实验 二、Expect2.1脚本格式2.2实验 一、Here Document免交互 1.1免交互概述 使用I/O重定向的方式将命令列表提供给交互式程序或命令&#xff0c;比如 ftp、cat 或 read 命令。是标准输入的一种替代品可以帮助…

森海塞尔及诺音曼携重磅新品亮相2023广州国际专业灯光、音响展览会

森海塞尔及诺音曼携重磅新品亮相2023广州国际专业灯光、音响展览会 以卓越产品和创新技术引领专业音频行业发展 广州&#xff0c;2023年5月16日——森海塞尔和诺音曼将于2023年5月22日至25日&#xff0c;携重磅新品及全新音频技术亮相第21届广州国际专业灯光、音响展览会。森海…

十七、Bus消息总线

目录 1、Bus消息总线介绍&#xff1a; 2、使用消息总线实现配置自动更新 2.1、方案一架构图&#xff1a; 2.2、方案二架构图&#xff08;常用&#xff09; 3、对springcloud-config-server项目进行改造 3.1、修改springcloud-config-server项目的pom文件&#xff0c;添加…

如何防范鱼叉式网络钓鱼及其他钓鱼攻击

在当今日益互联的世界中&#xff0c;远程访问已成为许多组织允许员工随时随地办公的必要条件。远程访问是一把双刃剑&#xff0c;有自身的优势&#xff0c;但也带来了重大的安全风险。网络犯罪分子一直想方设法利用远程访问系统的漏洞&#xff0c;试图通过这些漏洞发起鱼叉式网…

软件测试行业对新人友好吗?

软件测试真的算是对新人小白非常友好的学科了&#xff0c;但是你也千万不要抱有幻想&#xff0c;觉得轻轻松松就能掌握真正的技能&#xff0c;然后如愿找到高薪工作。从0到1还是需要一个过程的&#xff0c;也是需要你付出相当大的努力去学习的 随着人工智能时代的到来&#xf…

第01讲:RocketMQ入门

一、什么是消息队列 ​ 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合&#xff0c;异步消息&#xff0c;流量削锋等问题。实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。目前在生产环境&#x…

【C++进阶3-二叉搜索树】强,但没貌似还不够?

今天&#xff0c;带来二叉搜索树的讲解。 文中不足错漏之处望请斧正&#xff01; 是什么 二叉搜索树&#xff08;Binary Search Tree&#xff09;又称二叉排序树。 它可以是一棵空树&#xff0c;也可以是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所…

《花雕学AI》不用花钱,也能和ChatGPT聊天!快来看看这五个免费客户端吧

引言 你有没有想过和一个智能的聊天机器人对话&#xff1f;一个可以陪你聊天、讲故事、写代码、模仿名人、生成歌词等等的聊天机器人&#xff1f;如果你有这样的想法&#xff0c;那么你一定要了解ChatGPT。ChatGPT是一个由OpenAI开发的人工智能聊天机器人程序&#xff0c;它使用…

基于Ajax+JSon的表格数据浏览【简单版--没连接数据库】+【连接数据库版】

目录 基于AjaxJSon的表格数据浏览【简单版--没连接数据库】 代码&#xff1a; ajax.js ch10_4.jsp student.java Query.java 运行结果&#xff1a; 点击获取表格后&#xff1a; 基于AjaxJSon的表格数据浏览【简单版--没连接数据库】 代码&#xff1a; ajax.js //声明XM…

【案例实战】SpringBoot3.x自定义封装starter实战

1.starter背景简介及作用 &#xff08;1&#xff09;什么是starter starter是SpringBoot中的一个新发明&#xff0c;它有效的下降了项目开发过程的复杂程度&#xff0c;对于简化开发操做有着很是好的效果。 starter的理念&#xff1a;starter会把全部用到的依赖都给包含进来&a…

三极管的几点应用

三极管有三个工作状态&#xff1a;截止、放大、饱和&#xff0c;放大状态很有学问也很复杂&#xff0c;多用于集成芯片&#xff0c;比如运放&#xff0c;现在不讨论。其实&#xff0c;对信号的放大&#xff0c;我们通常用运放处理&#xff0c;三极管更多的是当做一个开关管来使…

微信小程序入门05-用户登录注册接口开发

用户登录注册&#xff0c;我们先需要开发后端的接口&#xff0c;接口一般需要有入参&#xff0c;然后和数据库进行交互。 1 创建表 我们现在先实现用户的登录及注册&#xff0c;建表语句 create database diancan; use diancan; CREATE TABLE users (id INT AUTO_INCREMENT …

软件设计模式介绍与入门

目录 1、软件设计模式的起源 2、什么是设计模式&#xff1f; 2.1、设计模式的设计意图 2.2、设计模式的分类准则 3、为什么要学习设计模式 4、如何学习设计模式 5、最后 VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&#x…

毕业论文写作技巧

毕业论文的组成部分目录自定义目录 摘要&#xff08;Abstract&#xff09;绪论相关工作&#xff08;Related work&#xff09;研究方法和结果&#xff08;Method and Results&#xff09;研究方法研究结果 结论&#xff08;Conclusion&#xff09; 写好一篇论文其实就是讲好一个…

批量查询域名历史软件-域名历史快照查询工具

批量查询域名历史和域名历史快照 批量查询域名历史和域名历史快照是一种可以为您提供有关域名历史信息的工具&#xff0c;以下是该主题的详细介绍。 什么是域名历史&#xff1f; 域名历史记录是指域名在被注册前或过去的使用期间所经历的所有事件的记录。这些事件可能包括域…

SpringBoot拦截器获取Request的body数据

1. 场景 自定义Token后&#xff0c;需要在拦截器中进行token验证。在验证的过程中需要读取HttpServletRequest的body部分数据进行验证。 2. 存在问题 如果直接配置拦截器进行urlPatterns拦截&#xff0c;并进行参数验证&#xff0c;在拦截器中获取request的输入流&#xff0c…

智能防盗防偷门锁语音方案设计

智能锁主要功能 防撬报警功能&#xff08;非必须&#xff0c;但很实用&#xff09;&#xff1a;防撬报警功能可以说是指纹密码锁功能中对提升家居安全有效的功能之一。当指纹锁受到外暴力破坏时&#xff0c;就会自动发出警报声&#xff0c;提醒小区安保。好一点的甚至可以自动…

【AUTOSAR】【以太网】UdpNM

目录 一、概述 二、限制与约束 三、功能说明 3.1 协调算法 3.2 操作模式 3.2.1 Network Mode 3.2.2 准备总线睡眠模式 3.2.3 准备总线睡眠模式 3.3 网络状态 3.4 初始化 3.5 通信调度 3.5.1 NM消息发送 3.5.2 NM消息接收 3.6 其他功能 3.7 帧结构 四、API接口 …