嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十八)串口编程(中)

简介: 嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十八)串口编程

四. TTY驱动程序框架


参考资料

解密TTY :https://www.cnblogs.com/liqiuhao/p/9031803.html

彻底理解Linux的各种终端类型以及概念:https://blog.csdn.net/dog250/article/details/78766716

Linux终端和Line discipline图解:https://blog.csdn.net/dog250/article/details/78818612

What Are Teletypes, and Why Were They Used with Computers?:https://www.howtogeek.com/727213/what-are-teletypes-and-why-were-they-used-with-computers/


1. 行规程的引入

1670926663275.jpg

以下文字引用自参考资料解密TTY:

大多数用户都会在输入时犯错,所以退格键会很有用。这当然可以由应用程序本身来实现,但是根据

UNIX设计“哲学”,应用程序应尽可能保持简单。为了方便起见,操作系统提供了一个编辑缓冲区和一些

基本的编辑命令(退格,清除单个单词,清除行,重新打印),这些命令在行规范(line discipline)内

默认启用。高级应用程序可以通过将行规范设置为原始模式(raw mode)而不是默认的成熟或准则模

式(cooked and canonical)来禁用这些功能。大多数交互程序(编辑器,邮件客户端,shell,及所有

依赖curses或readline的程序)均以原始模式运行,并自行处理所有的行编辑命令。行规范还包含字符

回显和回车换行(译者注:\r\n 和 \n)间自动转换的选项。如果你喜欢,可以把它看作是一个原始的内

核级sed(1)。

另外,内核提供了几种不同的行规范。一次只能将其中一个连接到给定的串行设备。行规范的默认规则

称为N_TTY(drivers/char/n_tty.c,如果你想继续探索的话)。其他的规则被用于其他目的,例如管理

数据包交换(ppp,IrDA,串行鼠标),但这不在本文的讨论范围之内。


2. TTY驱动程序框架


1670926675600.jpg

五. 在STM32MP157上做串口实验的准备工作(imux6ull不用操作,了解一下修改驱动程序)


本节课程源码在GIT仓库里

01_all_series_quickstart\04_嵌入式Linux应用开发基础知识\source\14_UART\
00_stm32mp157_devicetree_for_uart8


1. 出厂系统不支持扩展板上的UART


1670926689887.jpg

2. 只关注APP开发的话


把GIT仓库中这个dtb文件复制到开发板上去就可以:

doc_and_source_for_drivers\STM32MP157\source\A7\09_UART\00_stm32mp157_devicetree
_for_uart8\dtb
stm32mp157c-100ask-512d-lcd-v1.dtb


操作方法:

Ubuntu上:复制dtb文件到NFS目录:

$ cp stm32mp157c-100ask-512d-lcd-v1.dtb ~/nfs_rootfs/


开发板上挂载NFS文件系统

vmware使用NAT(假设windowsIP为193.168.1.100)

[root@100ask:~]# mount -t nfs -o nolock,vers=3,port=2049,mountport=9999
193.168.1.100:/home/book/nfs_rootfs /mnt


vmware使用桥接,或者不使用vmware而是直接使用服务器:假设Ubuntu IP为

193.168.1.137

[root@100ask:~]# mount -t nfs -o nolock,vers=3
193.168.1.137:/home/book/nfs_rootfs /mnt


更新设备树

[root@100ask:~]# mount /dev/mmcblk2p2 /boot
[root@100ask:~]# cp /mnt/stm32mp157c-100ask-512d-lcd-v1.dtb /boot
[root@100ask:~]# sync


重启开发板

在串口可以看到以下设备节点

ls /dev/ttySTM*
/dev/ttySTM0
/dev/ttySTM1
/dev/ttySTM3


3. 从头修改设备树文件


3.1 确定硬件资源

1670926759052.jpg

打开STM32MP157底板原理图,可知UART8_TX、UART8_RX使用引脚PE1、PE0,如下图:

1670926768159.jpg


3.2 使能设备树节点


在STM32MP157的内核设备树文件 arch/arm/boot/dts/stm32mp151.dtsi 中,已经设置了uart8节点:

1670926911448.jpg

我们需要使能这个节点(改为okay),往下看。


3.3 通过Pinctrl指定引脚


光使能UART8还不行,还需要为它选择引脚。

修改 arch/arm/boot/dts/stm32mp15xx-100ask.dtsi ,如下:

&uart8 {
pinctrl-names = "default", "sleep";
pinctrl-0 = <&uart8_pins_mx>;
pinctrl-1 = <&uart8_sleep_pins_mx>;
status = "okay";
};


这些Pinctrl信息已经在 arm/boot/dts/stm32mp157-100ask-pinctrl.dtsi 中有了,无需我们添加:

1670926937571.jpg


3.4 指定设备别名


UART8对应的设备节点是哪个?它的驱动程序需要从"别名"里确定编号。

修改 arch/arm/boot/dts/stm32mp157c-100ask-512d-v1.dts ,如下:

aliases {
ethernet0 = &ethernet0;
serial0 = &uart4; //debug
serial1 = &usart6; //rs485
serial2 = &usart1; //bluetooth
serial3 = &uart8; // extend board uart, /dev/ttySTM3
};


3.5 编译、使用


设置工具链

export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihfexport PATH=$PATH:/home/book/100ask_stm32mp157_pro-sdk/ToolChain/armbuildroot-linux-gnueabihf_sdk-b


编译设备树:

在Ubuntu的STM32MP157内核目录下执行如下命令,

得到设备树文件: arch/arm/boot/dts/stm32mp157c-100ask-512d-lcd-v1.dtb

make dtbs


复制到NFS目录:

$ cp arch/arm/boot/dts/stm32mp157c-100ask-512d-lcd-v1.dtb ~/nfs_rootfs/


开发板上挂载NFS文件系统

vmware使用NAT(假设windowsIP为193.168.1.100)

[root@100ask:~]# mount -t nfs -o nolock,vers=3,port=2049,mountport=9999
193.168.1.100:/home/book/nfs_rootfs /mnt


vmware使用桥接,或者不使用vmware而是直接使用服务器:假设Ubuntu IP为

193.168.1.137

[root@100ask:~]# mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt

更新设备树

[root@100ask:~]# mount /dev/mmcblk2p2 /boot
[root@100ask:~]# cp /mnt/stm32mp157c-100ask-512d-lcd-v1.dtb /boot
[root@100ask:~]# sync


重启开发板

在串口可以看到以下设备节点

ls /dev/ttySTM*
/dev/ttySTM0
/dev/ttySTM1
/dev/ttySTM3
相关文章
|
1月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
83 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
2月前
|
存储 Linux 开发工具
如何进行Linux内核开发【ChatGPT】
如何进行Linux内核开发【ChatGPT】
|
3月前
|
Java Linux API
Linux设备驱动开发详解2
Linux设备驱动开发详解
44 6
|
3月前
|
消息中间件 算法 Unix
Linux设备驱动开发详解1
Linux设备驱动开发详解
50 5
|
3月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
|
3月前
|
编解码 安全 Linux
基于arm64架构国产操作系统|Linux下的RTMP|RTSP低延时直播播放器开发探究
这段内容讲述了国产操作系统背景下,大牛直播SDK针对国产操作系统与Linux平台发布的RTMP/RTSP直播播放SDK。此SDK支持arm64架构,基于X协议输出视频,采用PulseAudio和Alsa Lib处理音频,具备实时静音、快照、缓冲时间设定等功能,并支持H.265编码格式。此外,提供了示例代码展示如何实现多实例播放器的创建与管理,包括窗口布局调整、事件监听、视频分辨率变化和实时快照回调等关键功能。这一技术实现有助于提高直播服务的稳定性和响应速度,适应国产操作系统在各行业中的应用需求。
110 3
|
3月前
|
传感器 人工智能 网络协议
:嵌入式 Linux 及其用途
【8月更文挑战第24天】
170 0
|
4月前
|
Ubuntu 算法 Linux
嵌入式Linux的学习误区
**嵌入式Linux学习误区摘要** 1. **过度聚焦桌面Linux** - 许多学习者误将大量时间用于精通桌面Linux系统(如RedHat、Fedora、Ubuntu),认为这是嵌入式Linux开发的基石。 - 实际上,桌面Linux仅作为开发工具和环境,目标不应是成为Linux服务器专家,而应专注于嵌入式开发工具和流程。 2. **盲目阅读Linux内核源码** - 初学者在不了解Linux基本知识时试图直接研读内核源码,这往往导致困惑和挫败感。 - 在具备一定嵌入式Linux开发经验后再有针对性地阅读源码,才能有效提升技能。
|
7天前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
27 3