四. 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. 行规程的引入
以下文字引用自参考资料解密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驱动程序框架
五. 在STM32MP157上做串口实验的准备工作(imux6ull不用操作,了解一下修改驱动程序)
本节课程源码在GIT仓库里
01_all_series_quickstart\04_嵌入式Linux应用开发基础知识\source\14_UART\ 00_stm32mp157_devicetree_for_uart8
1. 出厂系统不支持扩展板上的UART
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 确定硬件资源
打开STM32MP157底板原理图,可知UART8_TX、UART8_RX使用引脚PE1、PE0,如下图:
3.2 使能设备树节点
在STM32MP157的内核设备树文件 arch/arm/boot/dts/stm32mp151.dtsi 中,已经设置了uart8节点:
我们需要使能这个节点(改为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 中有了,无需我们添加:
3.4 指定设备别名
UART8对应的设备节点是哪个?它的驱动程序需要从"别名"里确定编号。
修改 arch/arm/boot/dts/stm32mp157c-100ask-512d-v1.dts ,如下:
aliases { ethernet0 = ðernet0; 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