嵌入式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月前
|
Ubuntu 搜索推荐 Linux
详解Ubuntu的strings与grep命令:Linux开发的实用工具。
这就是Ubuntu中的strings和grep命令,透明且强大。我希望你喜欢这个神奇的世界,并能在你的Linux开发旅程上,通过它们找到你的方向。记住,你的电脑是你的舞台,在上面你可以做任何你想做的事,只要你敢于尝试。
141 32
|
2月前
|
安全 算法 Ubuntu
Linux(openssl)环境:编程控制让证书自签的技巧。
总结:在Linux环境中,OpenSSL是一个非常实用的工具,可以帮助我们轻松地生成自签名证书。通过上述三个简单步骤,即可为内部网络、测试环境或开发环境创建自签名证书。但在公共访问场景下,建议购买经过权威认证机构签发的证书,以避免安全警告。
91 13
|
4月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
715 76
|
4月前
|
JavaScript Ubuntu Linux
如何在阿里云的linux上搭建Node.js编程环境?
本指南介绍如何在阿里云Linux服务器(Ubuntu/CentOS)上搭建Node.js环境,包含两种安装方式:包管理器快速安装和NVM多版本管理。同时覆盖全局npm工具配置、应用部署示例(如Express服务)、PM2持久化运行、阿里云安全组设置及外部访问验证等步骤,助你完成开发与生产环境的搭建。
|
5月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
104 17
|
24天前
|
开发者
鸿蒙开发:资讯项目实战之项目初始化搭建
目前来说,我们的资讯项目只是往前迈了很小的一步,仅仅实现了项目创建,步虽小,但概念性的知识很多,这也是这个项目的初衷,让大家不仅仅可以掌握日常的技术开发,也能让大家理解实际的项目开发知识。
鸿蒙开发:资讯项目实战之项目初始化搭建
|
18天前
|
缓存 JavaScript IDE
鸿蒙开发:基于最新API,如何实现组件化运行
手动只是让大家了解切换的原理,在实际开发中,可不推荐手动,下篇文章,我们将通过脚本或者插件,快速实现组件化模块之间的切换,实现独立运行,敬请期待!
鸿蒙开发:基于最新API,如何实现组件化运行
|
24天前
|
SQL 弹性计算 数据库
鸿蒙5开发宝藏案例分享---优化应用时延问题
鸿蒙性能优化指南来了!从UI渲染到数据库操作,6大实战案例助你提升应用流畅度。布局层级优化、数据加载并发、数据库查询提速、相机资源延迟释放、手势识别灵敏调整及转场动画精调,全面覆盖性能痛点。附赠性能自检清单,帮助开发者高效定位问题,让应用运行如飞!来自华为官方文档的精华内容,建议收藏并反复研读,共同探讨更多优化技巧。
|
24天前
|
缓存
鸿蒙5开发宝藏案例分享---Swiper组件性能优化实战
本文分享了鸿蒙系统中Swiper组件的性能优化技巧,包括:1) 使用`LazyForEach`替代`ForEach`实现懒加载,显著降低内存占用;2) 通过`cachedCount`精准控制缓存数量,平衡流畅度与内存消耗;3) 利用`onAnimationStart`在抛滑时提前加载资源,提升构建效率;4) 添加`@Reusable`装饰器复用组件实例,减少创建开销。实际应用后,图库页帧率从45fps提升至58fps,效果显著。适合处理复杂列表或轮播场景,欢迎交流经验!
|
24天前
|
缓存 JavaScript 前端开发
鸿蒙5开发宝藏案例分享---Web开发优化案例分享
本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!