嵌入式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
相关文章
|
2月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
2天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
2月前
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
64 6
|
2月前
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
108 3
|
2月前
|
Shell Linux Python
python执行linux系统命令的几种方法(python3经典编程案例)
文章介绍了多种使用Python执行Linux系统命令的方法,包括使用os模块的不同函数以及subprocess模块来调用shell命令并处理其输出。
23 0
|
3月前
|
项目管理 敏捷开发 开发框架
敏捷与瀑布的对决:解析Xamarin项目管理中如何运用敏捷方法提升开发效率并应对市场变化
【8月更文挑战第31天】在数字化时代,项目管理对软件开发至关重要,尤其是在跨平台框架 Xamarin 中。本文《Xamarin 项目管理:敏捷方法的应用》通过对比传统瀑布方法与敏捷方法,揭示敏捷在 Xamarin 项目中的优势。瀑布方法按线性顺序推进,适用于需求固定的小型项目;而敏捷方法如 Scrum 则强调迭代和增量开发,更适合需求多变、竞争激烈的环境。通过详细分析两种方法在 Xamarin 项目中的实际应用,本文展示了敏捷方法如何提高灵活性、适应性和开发效率,使其成为 Xamarin 项目成功的利器。
48 1
|
3月前
|
安全 Linux 开发工具
探索Linux操作系统:从命令行到脚本编程
【8月更文挑战第31天】在这篇文章中,我们将一起潜入Linux操作系统的海洋,从最基础的命令行操作开始,逐步深入到编写实用的脚本。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和实用技能。我们将通过实际代码示例,展示如何在日常工作中利用Linux的强大功能来简化任务和提高效率。准备好了吗?让我们一起开启这段旅程,探索Linux的奥秘吧!
|
3月前
|
网络协议 Linux Shell
探索Linux操作系统:从基础到高级编程
【8月更文挑战第31天】本文旨在为读者提供一条清晰的路径,从Linux操作系统的基础知识出发,逐步深入到高级编程技巧。我们将一起揭开Linux神秘的面纱,了解其内部工作原理,并通过实际代码示例加深理解。无论你是初学者还是有一定经验的开发者,这篇文章都将为你带来新的视角和技能提升。
|
3月前
|
Linux
探索Linux操作系统:命令行与脚本编程基础
【8月更文挑战第31天】在这篇文章中,我们将一起踏上一段旅程,深入探索Linux操作系统的奥秘。通过学习命令行的使用和编写简单的脚本,你将能够更高效地与你的计算机进行交流。无论你是新手还是有经验的用户,本文都将为你打开一扇通往Linux世界的大门。准备好了吗?让我们开始吧!