Linux Uart串口开发指南

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