Uart串口开发指南
1. 概述
1.1 编写目的
介绍 Linux 内核中 UART 驱动的接口及使用方法,为 UART 设备的使用者提供参考。
1.2 适用范围
K230 Linux SDK V1.0及后续版本。
1.3 使用人员
需关注嘉楠平台 UART串口的 驱动、及应用层的开发/维护人员。
1.4 硬件术语
| 术语 | 解释说明 |
|---|---|
| canmv | 指 Canaan 的K230系列 SOC 硬件平台 |
| UART | Universal Asynchronous Receiver/Transmitter,通用异步收发传输器 |
| Console | 控制台,Linux 内核中用于输出调试信息的 TTY 设备 |
| TTY | TeleType/TeleTypewriters 的一个老缩写,原来指的是电传打字机,现在泛指 和计算机串行端口连接的终端设备。TTY 设备还包括虚拟控制台,串口以及伪 终端设备 |
2.模块适配指南
在开始前我们需要知道使用哪两个引脚作为UART引脚,假设使用GPIO44作为UART2 TX、GPIO45作为UART2 RX。
1.uboot设备树
对于K230,需要在Uboot设备树下提前复用引脚的功能,我们需要找到GPIO44和GPIO45引脚,将其复用为UART功能。
设备树路径:
k230_linux_sdk/buildroot-overlay/boot/uboot/u-boot-2022.10-overlay/arch/riscv/dts
需要找到对应的设备树文件,这里以k230_canmv_dongshanpi.dts为例。
修改设备树引脚内容为:
(IO44) ( 1<<SEL | 0<<SL | BANK_VOLTAGE_IO38_IO49<<MSC | 1<<IE | 1<<OE | 1<<PU | 0<<PD | 7<<DS | 1<<ST )
(IO45) ( 1<<SEL | 0<<SL | BANK_VOLTAGE_IO38_IO49<<MSC | 1<<IE | 1<<OE | 1<<PU | 0<<PD | 7<<DS | 1<<ST )
- SEL为功能号选择,从0开始,iomux表 里面 Function Number - 1。UART2_TX对应1<<SEL
=
- SL输出翻转率控制,只有IO0/IO1单电压PAD可配置。
- MSC工作电压配置,需要与板子上的bank供压保持一致
- IE输入使能,为0表示方向无效,输入为低电平。
- OE输出使能,为0表示输出方向无效,PAD的电压取决于PU/PD,不确定IO的方向,IE/OE都配置为1也没问题。
- PU上拉配置,与IO的功能有关。IIC总线,空闲是高电平,所以建议配置上拉。一般硬件设计外部会有上拉,所以IOMUX配置不上拉也没有问题。
- PD下拉配置,与IO的功能有关。
-
DS驱动强度配置,单电压PAD为8驱PAD,3bit有效,取值为4’b000~4’b111。双电压PAD为16驱PAD,4bit有效,取值为4’b0000~4’b1111,IO2~IO63都是双电压PAD。
-
ST输入施密特触发器配置,一般配置为1
2.Linux内核设备树
在linux内核设备树中使能uart2节点,拉取内核的设备树路径:
k230_linux_sdk/dl/linux/git/arch/riscv/boot/dts/canaan/
编译output中的设备树路径:
k230_linux_sdk/output/k230_canmv_dongshanpi_defconfig/build/linux-ae4a7e6518cd46407be9b648828b6f704d7dc302/arch/riscv/boot/dts/canaan
其中k230_canmv_dongshanpi_defconfig为编译生成的板级方案,如果您编译的是其他板级方案,请修改为您实际编译的板级方案。
如果您已经编译过,建议修改output目录下的设备树!
在设备树文件中新增uart2节点,这里以k230-canmv-dongshanpi.dts为例,请选择您板级方案对应的设备树。
&uart2 {
status = "okay";
};
3.编译
由于我们修改了uboot和Linux内核,我们需要重新编译uboot和linux,并重新生成镜像。
重新编译uboot
make uboot-rebuild
重新编译Linux
make linux-rebuild
重新生成镜像
make CONF=k230_canmv_dongshanpi_defconfig
注意:这里需要编译您对应的板级方案。
重新启动系统可看到生成的设备节点/dev/ttyS1。如果您只想简单测试该节点是否有收发能力,可执行:
#向设备节点发送
echo 11111 > /dev/ttyS1
#读取设备节点的信息
cat /dev/ttyS1




