高通8953平台串口配置入门

article/2025/9/30 10:30:04

目录

  • 一、 串口概述
  • 二、 平台串口介绍
  • 三、 Device tree如何配置串口
  • 四、 bootloader如何配置串口
  • 五、bootloader中串口相关代码
  • 六、 kernel中串口驱动文件:
  • 七、 调试中遇到的问题
  • 八、 串口回环测试
  • 九、参考文档

一、 串口概述

RS232、RS422、RS485都是串行数据接口标准,最初由电子工业协会(EIA)制定并发行。
RS232标准接口有25条线(4条数据,11条控制,3条定时,7条备用和未定义),常用只有9条线,RTS/CTS(请求发送/清除发送流控制)、RXD/TXD(数据收发)、DSR/DTR(数据设置就绪/数据终端就绪流控制)、DCD(数据载波检测,也称RLSD)、Ringing-RI(振铃指示)、SG(信号地)。最简单的R232串口只需要RXD/TXD/SG三个信号。点对点通信,只能连接一个设备。通信距离最大15米,全双工。
RS422标准全称是“平衡电压数字接口电路的电气特性”。允许在相同传输线上连接多个接受节点,最多可接256个节点。采用四线接口,外加一根地线,共五根线。S-422四线接口由于采用单独的发送和接收通道,因此不必控制数据方向,各装置之间任何必须的信号交换均可以按软件方式(XON/XOFF握手)或硬件方式(一对单独的双绞线)。RS-422的最大传输距离为4000英尺(约1219米),最大传输速率为10Mb/s。其平衡双绞线的长度与传输速率成反比,在 100kb/s速率以下,才可能达到最大传输距离。只有在很短的距离下才能获得最高速率传输。一般100米长的双绞线上所能获得的最大传输速率仅为 1Mb/s。全双工,点对多通信。
RS485标准采用平衡发送和差分接收方式实现通信:发送端将串行口的ttl电平信号转换成差分信号a,b两路输出,经过线缆传输之后在接收端将差分信号还原成ttl电平信号。由于传输线通常使用双绞线,又是差分传输,所以有强大的抗共模干扰的能力,总线收发器灵敏度很高,可以检测到低至200mv电压。故传输信号在千米之外都是可以恢复。rs-485最大的通信距离约为1219m,最大传输速率为10mb/s,传输速率与传输距离成反比,在10kb/s的传输速率下,才可以达到最大的通信距离,如果需传输更长的距离,需要加485中继器。rs-485采用半双工工作方式,支持多点数据通信。rs-485总线网络拓扑一般采用终端匹配的总线型结构。即采用一条总线将各个节点串接起来,不支持环形或星型网络。如果需要使用星型结构,就必须使用485中继器或者485集线器才可以。rs-485总线一般最大支持32个节点,如果使用特制的485芯片,可以达到128个或者256个节点,最大的可以支持到400个节点。两线制,半双工,点对多通信(四线制通信只支持点对点已经淘汰)

二、 平台串口介绍

以8953平台为例。
在这里插入图片描述
上图列出了平台所支持的所有spi,uart,i2c资源,共包括八组spi, 四组uart,八组i2c。这里四组串口对应BLSP2,BLSP4,BLSP5,BLSP6。
每组BLSP包括四组QUP和两组UARTcores。共支持两组低速串口和两组高速串口,高速串口最高速率4Mbps。
串口base addresses如下图:可根据此图配置devicetree文件。
在这里插入图片描述
串口所用中断号如下图:可根据此图配置devicetree文件。
在这里插入图片描述

三、 Device tree如何配置串口

需要修改文件:
 Device tree source – /arch/arm/boot/dts/qcom/msm8953.dtsi
 Clock table – /drivers/clk/msm/clock-gcc-8953.c (or clock-gcc-titanium.c)
in this file, update the msm_clocks_lookup[] table.(一般不需要修改)
 GPIO table – /kernel/arch/arm/boot/dts/qcom/msm8953-pinctrl.dtsi
低速串口:
 /arch/arm/boot/dts/qcom/msm8953.dtsi:

blsp1_uart0: serial@78af000 {
compatible = "qcom,msm-lsuart-v14";
reg = <0x78af000 0x200>;
interrupts = <0 107 0>;
status = "disabled"; //change “ok” to enable
clocks = <&clock_gcc clk_gcc_blsp1_uart1_apps_clk>,
<&clock_gcc clk_gcc_blsp1_ahb_clk>;
clock-names = "core_clk", "iface_clk";
};

这里注意clk选择与对应串口匹配的,中断号选择与对应串口匹配的,基地址选择与对应串口匹配的。
 /kernel/arch/arm/boot/dts/qcom/msm8953-pinctrl.dtsi

pmx-uartconsole {
uart_console_active: uart_console_active {
mux {
pins = "gpio4", "gpio5";
function = "blsp_uart2";
};
config {
pins = "gpio4", "gpio5";
drive-strength = <2>;
bias-disable;
};
};
uart_console_sleep: uart_console_sleep {
mux {
pins = "gpio4", "gpio5";
function = "blsp_uart2";
};
config {
pins = "gpio4", "gpio5";
drive-strength = <2>;
bias-pull-down;
};
};
};//注意在合适的地方通过default来调用pinctrl。

高速串口:
高速串口相较低速串口增加了一组中断如下图;
在这里插入图片描述
所需要修改的文件参考低速串口

blsp1_uart1: uart@78b0000 { 
compatible = "qcom,msm-hsuart-v14"; 
reg = <0x78b0000 0x200>, 和低速串口一致
<0x7884000 0x1f000>; 高速串口新增
reg-names = "core_mem", "bam_mem"; 
interrupt-names = "core_irq", "bam_irq", "wakeup_irq"; 
#address-cells = <0>; 
interrupt-parent = <&blsp1_uart1>; 需要改动
interrupts = <0 1 2>; 
#interrupt-cells = <1>;
interrupt-map-mask = <0xffffffff>;
interrupt-map = <0 &intc 0 108 0需要改动
1 &intc 0 238 0需要改动
2 &tlmm 13 0>;需要改动
qcom,inject-rx-on-wakeup;
qcom,rx-char-to-inject = <0xFD>;
qcom,master-id = <86>;
clock-names = "core_clk", "iface_clk";
clocks = <&clock_gcc clk_gcc_blsp1_uart2_apps_clk>,需要改动
<&clock_gcc clk_gcc_blsp1_ahb_clk>;需要改动
pinctrl-names = "sleep", "default";
pinctrl-0 = <& blsp1_uart1_sleep >;需要改动
pinctrl-1 = <& blsp1_uart1_active >;需要改动
qcom,bam-tx-ep-pipe-index = <2>;
qcom,bam-rx-ep-pipe-index = <3>;
qcom,msm-bus,name = "blsp1_uart1";需要改动
qcom,msm-bus,num-cases = <2>;
qcom,msm-bus,num-paths = <1>;
qcom,msm-bus,vectors-KBps =
<86 512 0 0>,
<86 512 500 800>;
};
Blsp1_uart1_active: blsp1_uart1_active {
mux {
pins = "gpio12", "gpio13", "gpio14", "gpio15";
function = "blsp_uart4";
};
config {
pins = "gpio12", "gpio13", "gpio14", "gpio15";
drive-strength = <2>;
bias-disable;
};
};
Blsp1_uart1_sleep: blsp1_uart1_sleep {
mux {
pins = "gpio12", "gpio13", "gpio14", "gpio15";
function = "gpio";
};
config {
pins = "gpio12", "gpio13", "gpio14", "gpio15";
drive-strength = <2>;
bias-disable;
};
};

四、 bootloader如何配置串口

所需要的配置文件:
/lk/project/msm8953.mk
打开 DEFINES += WITH_DEBUG_UART=1
/lk/target/msm8953/init.c(对应到具体的每个项目文件夹中)

void target_early_init(void)
{
#if WITH_DEBUG_UART
/*
First argument represents the ID (can be any since it's not used)
Second argument, if it is a GSBI base, must be 0
Third Argument is the physical address for UART CORE defined in
/bootable/bootloader/lk/platform/msm8953/include/platform/iomap.h
*/
uart_dm_init(1, 0, BLSP1_UART2_BASE);//it is uart[0..2] instead of uart[1..2]
#endif
}

/lk/platform/msm8953/acpuclock.c

void clock_config_uart_dm(uint8_t id)
{
int ret;
/*
NOTE: In clock regime clocks are # from 1 to 2 so UART0 would
be identified as UART1*/
//iface_clk is BLSP clk
ret = clk_get_set_enable("uart2_iface_clk", 0, 1);
//core_clock is UART clock.
ret = clk_get_set_enable("uart2_core_clk", 7372800, 1);
}

/lk/platform/msm8953/gpio.c

void gpio_config_uart_dm(uint8_t id)
{
/*Configure the RX/TX GPIO
Argument 1: GPIO #
Argument 2: Function (See device pinout for more information)
Argument 3: Input/Ouput (Can be 0/1)
Argument 4: Should be no PULL
Argument 5: Drive strength
Argument 6: Output Enable (Can be 0/1)*/
gpio_tlmm_config(5, 2, GPIO_INPUT, GPIO_NO_PULL,
GPIO_8MA, GPIO_DISABLE);
gpio_tlmm_config(4, 2, GPIO_OUTPUT, GPIO_NO_PULL,
GPIO_8MA, GPIO_DISABLE);
}//此串口用于lk的log输出

五、bootloader中串口相关代码

kmian(lk\kernel\main.c)
|-target_early_init(lk\target\LBxxxx\init.c)
|-uart_dm_init(lk\platform\msm_shared\uart_dm.c)
|-clock_config_uart_dm(lk\platform\msm8953\acpuclock.c)
|-gpio_config_uart_dm(lk\platform\msm8953\gpio.c)
Target_early_init函数中仅对log串口进行的初始化
平台相关的文件都在lk\platform\msm8953下面,包括iomap.h等头文件和源文件。
Lk中通过读写寄存器实现串口功能。

六、 kernel中串口驱动文件:

低速串口:msm_serial_hs_lite.c
高速串口:msm_serial_hs.c

实际应用中可能会用到重新定义串口名字的情况,这里说明一下如何重新定义串口命名。

 低速串口:[ttyHSL] [x]
Msm_uart_ports数组定义了所支持的串口数量,默认代码支持3组。Line参数对应串口名称后面的数字。根据line值去匹配串口.
[x]可通过devicestree中的别名对串口名字进行重定义:这里的修改只针对line值。
aliases{
Serial0 = &blsp1_uart0;
Serial5 = &blsp2_uart1;
}
[ttyHSL]串口名前半部分通过uart_driver中的dev_name来修改,console中的name来修改。

 高速串口:[ttyHS] [x]
与低速串口不一样的地方在于默认最高支持的串口号到256。
[x]可通过devicestree去定义,即串口的id,后面又将id赋值给line.
aliases{
Uart2 = &blsp1_uart1;
Uart4 = &blsp2_uart1;
}
[ttyHS]串口前半部分通过uart_driver中的dev_name来修改.

七、 调试中遇到的问题

卫星通信模块用串口进行通信,且采用CMUX进行多路复用,在ppp拨号时,主板死机。Log上报为:
[ 269.341861] logd: logdr: UID=2000 GID=2000 PID=4031 b tail=0 logMask=19 pid=0 start=0ns timeout=0ns
[ 271.006799] BUG: spinlock recursion on CPU#7, logcat/4031
[ 271.011174] lock: msm_hsl_uart_ports+0x2f0/0x8d0, .magic: dead4ead, .owner: logcat/4031, .owner_cpu: 7
[ 271.020537] Causing a watchdog bite!
Log初步分析为串口死锁,即串口的递归调用属于死锁的第一种AA情况。
因之前遇到过串口接收丢数据的情况,原因是存在其他服务程序,与当前服务程序所用的串口一样,导致数据被其他服务程序抢走。所以首先排除串口命名一致,放止串口的重复打开,修改名称后问题仍存在。
更换为高速串口,问题仍存在。
根据log提示,定位到最后log出现的函数,增加dump代码:
在这里插入图片描述
通过查看函数的调用关系发现死锁位置,如下图:
在这里插入图片描述
最终通过增加新锁解决此问题。

八、 串口回环测试

首先将RX与TX短接
echo 1 > /sys/kernel/debug/msm_serial_hs/loopback.0 //打开回环开关
cat /sys/kernel/debug/msm_serial_hs/loopback.0 //确保已经打开回环开关了
cat /dev/ttyHS0
echo 111 > /dev/ttyHS0
查看是否有数据被读出

九、参考文档

sp80-p3255-6_c_msm8953_sdm450_linux_android_software_porting_manual.pdf
80-pc173-5b_f_sdm450_sda450_digital_baseband_design_guidelines_training_guidelines.pdf


http://chatgpt.dhexx.cn/article/6OLiD1bE.shtml

相关文章

windows 10安装sqlyog详细步骤

sqlyog下载链接&#xff1a; 链接: https://pan.baidu.com/s/1D_iRna8V90omfHsKHyeBtg 提取码: bqht 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 1. 下载完以后解压&#xff0c;双击SQLyog-12.0.9-0.x64 2. 如下图&#xff0c;选择Ok 3 . 如图&#xff0c;点…

SQLyog下载与安装

SQLyog卸载与安装 声明SQLyog卸载SQLyog安装一、SQLyog下载二、正式安装SQLyog 课后习题即答案 声明 SQLyog卸载 用360直接卸载 SQLyog安装 一、SQLyog下载 1.百度搜索SQLyog官网并进入。 2.下载&#xff0c;稍等片刻&#xff0c;即在浏览器下载列表中看到下载成功。 …

MySQL下载与安装、mysql服务启动与停止、mysql使用cmd命令行登录、SQLyog下载与安装,sqlyog登录与操作mysql

文章目录 1.MySQL下载与安装1.1 下载地址1.2 打开官网&#xff0c;点击DOWNLOADS1.3 点击 MySQL Community Server1.4 在General Availability(GA) Releases中选择适合的版本 2.配置MySQL8.03.配置MySQL8.0 环境变量4.服务的启动与停止4.1 使用图形界面工具4.1.1 打开windows服…

MySQL连接工具(SQLyog、Navicat)下载安装

目录 ❤ SQLyog 下载 安装 双击下载的文件 选择Chinese后点击OK ​编辑 点击“下一步” 选择“我接受”后点击“下一步” 点击“下一步” 修改安装位置&#xff08;尽量不要安装在C盘&#xff09;&#xff0c;点击“安装” ​编辑 安装后点击“下一步” 点击“完…

【小白】SQLyog下载安装配置篇全攻略

我是第一次使用 SQLyog 这款对于MySQL数据库的可视化图形管理工具&#xff0c;本篇是我对于SQLyog安装配置的过程和总结&#xff0c;仅供大家参考。 如下&#xff1a; 了解SQLyog: SQLyog 是一个快速而简洁的图形化管理MYSQL数据库的工具&#xff0c;它能够在任何地点有效地管理…

python+pycharm+mysql+sqlyog下载安装

目录 工具包详情 Python pycharm mysql sqlyog 工具包详情 工具包包括python安装包&#xff0c;pycharm安装包&#xff0c;mysql安装包&#xff0c;sqlyog安装包及注册码 Python 首先是python安装&#xff0c;较为简单&#xff0c;只需要打开然后选择Add to PATH即可&…

SQLyog——下载2058问题

前言&#xff1a;本文记录了我今天下载和安装SQLyog的过程&#xff0c;主要问题就出在了SQLyog链接这部分——2058号问题。写下来一方面希望我的文章能有所帮助&#xff0c;另一方面记录一下自己的生活。感谢文中链接的作者。 1.先下载安装SQLyog 下载安装SQLyog我看的是这个…

SQLyog(旗舰版)下载

安装导航(以及常见问题的解决方案): https://docs.qq.com/doc/DS0VSV2toQXd0dWtN (如图所示:)

关于SQLyog 下载 无限试用

1: 关于SQLyog下载 获知最新版本&#xff1a; 最新版本的SQLyog可以通过GitHub查看SQLyog Community Edition&#xff08;社区版&#xff09;的最新版本号获取。 参阅&#xff1a;https://github.com/webyog/sqlyog-community/wiki/Downloads 获取下载链接&#xff1a; x64链接…

SQLyog的下载与安装

1、下载安装包 SQLyog下载链接 2、安装 2.1、选择语言&#xff0c;默认即可 2.2、下一步即可 2.2、接受协议并下一步 2.3、选择选项 2.4、选定安装目录 2.5、安装完成 3、连接Mysql服务 看到这个界面就连接成功了。

sqlyog

一、SQLYog下载 sqlyog百度云链接&#xff08;永久有效&#xff09;&#xff1a;百度网盘 请输入提取码 密码&#xff1a;t906 注册码链接&#xff1a;百度网盘 请输入提取码 密码&#xff1a;e35u 二、sqlyog安装 1、将下载好的压缩包进行解压之后点击双击安装程序下拉选择…

SQLyog 下载地址

SQLyog - DownloadSQLyog, free and safe download. SQLyog latest version: Administrate MySQL Databases With Ease Using a Graphical Interface. MySQL is probably the worldhttps://sqlyog.en.softonic.com/

数据库客户端安装(SQLYog)

一、官网下载sqlyog 网址&#xff1a; SQLyog - Download (softonic.com)https://sqlyog.en.softonic.com/ 二、安装 1、双击exe文件 2、选择安装的语言 3、选择I do 的那个选项&#xff0c;再按next 4、选择如下的 5、默认的安装路径 6、更改路径为&#xff1a;D:\softwa…

MySql下载和安装Sqlyog下载安装

1 下载&安装 视频教程: https://www.bilibili.com/video/BV1Qf4y1T7Hx?p3 1.1 下载 https://downloads.mysql.com/archives/community/ 点开上面的链接就能看到如下界面&#xff1a; 选择选择和自己系统位数相对应的版本点击右边的 Download &#xff0c;此时会进到另…

MyBatis快速入门——第三章、DML语句操作

MyBatis快速入门——第三章、DML语句操作 目录 在接口类中添加【UsersMapper.java】 修改【com.item.mapper.UsersMapper.】 【action.java】 在接口类中添加【UsersMapper.java】 /*** 添加* param nickName* param sex* param age* param introduce* return*/int AddInfo…

泛微 DML语句 存储过程

这是我写的第一个存储过程&#xff0c;纪念一下&#xff0c;开发兄弟在侧口述~&#xff0c; 存储过程在SQL中设置 CREATE PROCEDURE MAX_WLBM_TOOATABLEREQUESTID VARCHAR (100),YXCS INTAS BEGINIF (YXCS0) BEGIN insert into uf_MaxIDToRequestid (LCID,MAX_YTWL,MAX_YERT)…

sql语句之DML语句

1.SELECT 语句 SELECT 语句用于从表中选取数据。结果被存储在一个结果表中&#xff08;称为结果集&#xff09;。 SELECT 列名称 FROM 表名称 或 SELECT * FROM 表名称例如&#xff1a; eg&#xff1a;SELECT LastName,FirstName FROM Persons&#xff08;从Persons表中查Las…

DDL与DML语句

1. DDL语句 SQL语句&#xff1a;结构化查询语句&#xff0c;使用SQL与数据库“沟通”&#xff0c;完成相应的数据库操作。 l DDL&#xff1a;数据定义语言&#xff0c;用来维护数据库对象 1.1 创建表 CREATE&#xff1a;创建表 演示&#xff1a;创建员工表 CREATE TABLE …

用JDBC执行DML语句

在已经建立数据库链接的基础上&#xff0c;如何执行SQL语句呢&#xff1f;这时候&#xff0c;我们就会用到Statement对象和ResultSet对象 Statement 对于增删改操作&#xff0c;我们只需要用到Statement对象&#xff0c;用法如下&#xff1a; 总的五步骤&#xff1a; 声明Stat…

【解决方案 二十六】DateGrip一键生成DML语句用于上线

在开发环境和测试环境创建好数据表后&#xff0c;我们想实现一键将建表语句及建索引语句等发到线上&#xff0c;有什么好的方式么&#xff1f;DateGrip可以轻松完成这个任务&#xff0c;例如我们想要将person表导出为建表语句 可以在要处理的表右键&#xff1a; 点击SQL Gene…