IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 基于瑞芯微RV1109 Linux串口驱动调试心得(给正点原子DS100示波器点赞!) -> 正文阅读

[系统运维]基于瑞芯微RV1109 Linux串口驱动调试心得(给正点原子DS100示波器点赞!)

点击上方「嵌入式云IOT技术圈」,选择「置顶公众号」第一时间查看嵌入式笔记!

在调试的时候发现板厂供应商调整了RK原厂的原理图设计,然后他们把串口5原来的M0的连接换成了另一路IO M1,也就是说他们并没有按照原厂的原理图去设计,所以UART5根本动不起来,由于好久没搞驱动了,对驱动也不熟,所以只能硬着头皮追代码、上示波器、上逻辑分析仪调试等等,走了很多弯路,最后终于把问题给找出来了,在此记录一下调试过程。

1、关于uart5节点pinctrl配置的描述

uart5?{
??/omit-if-no-ref/
??uart5m0_xfer:?uart5m0-xfer?{
???rockchip,pins?=
????/*?uart5_rx_m0?*/
????<3?RK_PA7?4?&pcfg_pull_up>,
????/*?uart5_tx_m0?*/
????<3?RK_PA6?4?&pcfg_pull_up>;
??};
??/omit-if-no-ref/
??uart5m0_ctsn:?uart5m0-ctsn?{
???rockchip,pins?=
????<3?RK_PB1?4?&pcfg_pull_none>;
??};
??/omit-if-no-ref/
??uart5m0_rtsn:?uart5m0-rtsn?{
???rockchip,pins?=
????<3?RK_PB0?4?&pcfg_pull_none>;
??};
??/omit-if-no-ref/
??uart5m1_xfer:?uart5m1-xfer?{
???rockchip,pins?=
????/*?uart5_rx_m1?*/
????<2?RK_PB1?4?&pcfg_pull_up>,
????/*?uart5_tx_m1?*/
????<2?RK_PB0?4?&pcfg_pull_up>;
??};
??/omit-if-no-ref/
??uart5m1_ctsn:?uart5m1-ctsn?{
???rockchip,pins?=
????<2?RK_PB3?4?&pcfg_pull_none>;
??};
??/omit-if-no-ref/
??uart5m1_rtsn:?uart5m1-rtsn?{
???rockchip,pins?=
????<2?RK_PB2?4?&pcfg_pull_none>;
??};
??/omit-if-no-ref/
??uart5m2_xfer:?uart5m2-xfer?{
???rockchip,pins?=
????/*?uart5_rx_m2?*/
????<2?RK_PA1?3?&pcfg_pull_up>,
????/*?uart5_tx_m2?*/
????<2?RK_PA0?3?&pcfg_pull_up>;
??};
??/omit-if-no-ref/
??uart5m2_ctsn:?uart5m2-ctsn?{
???rockchip,pins?=
????<2?RK_PA3?3?&pcfg_pull_none>;
??};
??/omit-if-no-ref/
??uart5m2_rtsn:?uart5m2-rtsn?{
???rockchip,pins?=
????<2?RK_PA2?3?&pcfg_pull_none>;
??};
};

我的电路原理图是这样的:

看到如上原理图的标识,我们很容易就知道pinctrl配置的IO是什么:

uart5m1_xfer:?uart5m1-xfer?{
?rockchip,pins?=
?/*?uart5_rx_m1?*/
?<2?RK_PB1?4?&pcfg_pull_up>,
?/*?uart5_tx_m1?*/
?<2?RK_PB0?4?&pcfg_pull_up>;
};

也就是上面定义的这个节点。

2、原厂默认配置的uart5节点的配置描述

原厂dtsi:rv1126.dtsi

关于aliases的配置:

aliases?{
??i2c0?=?&i2c0;
??i2c1?=?&i2c1;
??i2c2?=?&i2c2;
??i2c3?=?&i2c3;
??i2c4?=?&i2c4;
??i2c5?=?&i2c5;
??mmc0?=?&emmc;
??mmc1?=?&sdio;
??mmc2?=?&sdmmc;
??serial0?=?&uart0;
??serial1?=?&uart1;
??serial2?=?&uart2;
??serial3?=?&uart3;
??serial4?=?&uart4;
??serial5?=?&uart5;
??spi0?=?&spi0;
??spi1?=?&spi1;
??dphy0?=?&csi_dphy0;
??dphy1?=?&csi_dphy1;
};

驱动会根据以下的aliase,来对应串口编号,比如serial0最后会在/dev/目录下生成ttyS0,其它以此类推:

关于uart5dts配置:

uart5:?serial@ff5a0000?{
??compatible?=?"rockchip,rv1126-uart",?"snps,dw-apb-uart";
??reg?=?<0xff5a0000?0x100>;
??interrupts?=?<GIC_SPI?17?IRQ_TYPE_LEVEL_HIGH>;
??reg-shift?=?<2>;
??reg-io-width?=?<4>;
??dmas?=?<&dmac?15>,?<&dmac?14>;
??clock-frequency?=?<24000000>;
??clocks?=?<&cru?SCLK_UART5>,?<&cru?PCLK_UART5>;
??clock-names?=?"baudclk",?"apb_pclk";
??pinctrl-names?=?"default";
??pinctrl-0?=?<&uart5m0_xfer?&uart5m0_ctsn?&uart5m0_rtsn>;
??status?=?"disabled";
};

这个配置一般来说是原厂的一个默认的参数配置,然后我们只需要找到板厂的dts将节点的状态设置为okay,那么这个驱动一般来说就可以使用了。

3、板厂端开启串口功能

3.1、基于中断收发的串口配置

默认情况下,配置的串口是基于中断方式的。

在xxx.dts(你自己板子的dts配置)中添加你的端口使能:

&uart5?{
?pinctrl-0?=?<&uart5m1_xfer?&uart5m1_ctsn?&uart5m1_rtsn>;
?status?=?"okay";
};

一般情况下,串口不需要硬件流控来进行控制,所以可以将上面的这个节点简化为如下:

&uart5?{
?pinctrl-0?=?<&uart5m1_xfer>;
?status?=?"okay";
};

其中uart5m1_xfer在pinctrl中已经有所体现:

uart5m1_xfer:?uart5m1-xfer?{
?rockchip,pins?=
?/*?uart5_rx_m1?*/
?<2?RK_PB1?4?&pcfg_pull_up>,
?/*?uart5_tx_m1?*/
?<2?RK_PB0?4?&pcfg_pull_up>;
};

这部分一定要和硬件原理图对应好,确保配置正确,否则串口很可能工作不正常,配置完毕后如果串口没有开DMA的时候,在使用这个串口驱动的时候可能会看到如下信息:

但并不影响正常使用,报这个错的原因是因为没有配置dma的端口。

3.2、基于dma方式配置

这部分参考原厂的UART文档的:关于DMA的使用?有非常清晰的描述:

如果要配置成DMA的方式,那么DTS要做如下的修改:

&uart5?{
?pinctrl-0?=?<&uart5m1_xfer>;
?//使能DMA发送和接收
?dma-names?=?"tx",?"rx";?
?//配置DMAC连接的通道号
?dmas?=?<&dmac?15>,?<&dmac?14>;
?status?=?"okay";
};

这里的DMAC通道号需要通过手册来查找Req number,如下图:

4、串口驱动调试

4.1、查看开机是否有串口驱动加载信息

调试指令如下:

dmesg?|?grep?"serial"

可以看到:

4.2、查看串口pinctrl的占用情况

调试指令如下:

cat?/sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins?|?grep?ff5a0000

如上,这里的ff5a0000指的是设备树节点的标识:

可以看到:

打出来的信息会告诉你,当前你的串口的发送、接收以及硬件流控的引脚接在CPU管脚的哪个位置,如上所示,我的串口收发引脚分别接在gpio2-8以及gpio2-9的位置,即是第二组GPIO的第8和第9这两个管脚,我们来查一下GPIO管脚的序号:

4.3、查看串口时钟

调试指令如下:

cat?/sys/kernel/debug/clk/clk_summary?|?grep?uart

可以看到:

这个时钟频率就是设备树里配置的时钟频率,如下:

波特率 = 时钟源 / 16 / DIV,DIV是分频系数。

我这边的时钟默认分频系数为1,所以DIV为1,根据以上计算公式,可计算得到波特率为:

波特率 = 24000000 / 16 / 1 = 1500000

4.4、测试串口是否收发正常

我们可以借助busybox的stty工具来进行设置,接下来我们将串口波特率为115200:

接下来用串口调试助手进行收发测试:

测试双向发送和接收成功!驱动调试完成!下班鸟!秀一下调试过程中用正点原子DS100示波器打出来的时序图,此处一定要推荐下正点原子的DS100示波器,要是没有它,估计我不能下午6点半按时下班了吧!

往期精彩

一个强大的音视频编解码库-rkmedia的应用

瑞芯微RV1109配置7寸电容触摸屏的方向修改笔记

如何添加APP到Buildroot里(以瑞芯微rv1126为例)

瑞芯微RV1109配置7寸电容触摸屏的方向修改笔记

基于瑞芯微RV1109 Linux触摸屏GT911驱动调试心得

Linux MIPI DSI LCD设备驱动开发调试细节学习笔记(一)

Linux MIPI DSI驱动调试笔记-LCD时序参数配置(三)

Linux MIPI DSI驱动调试笔记-设备树DCS格式序列之配置LCD初始化代码(二)

瑞芯微RV1109配置GPIO设备树修改笔记(熟悉新平台从点灯大法开始)

新产品立项了,作为嵌入式软件工程师该如何来开展设计工作?(个人经验分享)

觉得本次分享的文章对您有帮助,随手点[在看]并转发分享,也是对我的支持。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-08-29 09:44:38  更:2021-08-29 09:44:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 11:39:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码