Linux串口驱动

《I.MX6ULL 参考手册》第 3561 页的“Chapter 55 Universal Asynchronous

Receiver/Transmitter(UART)

I.MX6ULL串口原理

1.1UART与USART

UART是异步通信,USART是异步/同步通信,比UART多了一条时钟线

USART 的全称是 Universal Synchronous/Asynchronous Receiver/Transmitter

通信格式如下:

Linux串口驱动_第1张图片

1.2电平标准

常见电平标准有TTL(逻辑电平0和1)、RS-232(差分信号,-3~-15 表示逻辑1,+3~+15表示逻辑1)

I.MX6ULL串口

一共有8个串口

Linux串口驱动_第2张图片

硬件原理

Linux串口驱动_第3张图片

三种操作模式

Linux串口驱动_第4张图片

2.1时钟源

由时钟配置寄存器 CCM_CSCDR1 ( CCM Serial Clock Divider Register)的UART_CLK_SEL(bit)位选择,当为 0 的时候 UART 的时钟源为 pll3_80m(80MHz),如果为 1 的时候 UART 的时钟源为 osc_clk(24M),一般选择 pll3_80m 作为 UART 的时钟源。寄存器 CCM_CSCDR1 的 UART_CLK_PODF(bit5:0)位是 UART 的时钟分频值,可设置 0~63,分别对应 1~64 分频,一般设置为 1 分频,因此最终进入 UART 的时钟80MHz。

2.2UART重要寄存器

使能

UART 的UART Control Register 1 ,即UARTx_UCR1(x=1~8)

Linux串口驱动_第5张图片

需要关注的地方:

1.自动波特率检测使能位:

Linux串口驱动_第6张图片

2.使能位

Linux串口驱动_第7张图片

UARTx_UCR2寄存器(奇偶校验、停止位等设置)

Linux串口驱动_第8张图片

Linux串口驱动_第9张图片

UARTx_UCR3 寄存器

Linux串口驱动_第10张图片

本章实验就用到了寄存器 UARTx_UCR3 中的位 RXDMUXSEL(bit2),这个位应该始终为 1,

寄存器 UARTx_USR2(发送和接收完成标志位设置)

Linux串口驱动_第11张图片

寄存器 UARTx_USR2 用到的重要位如下:

TXDC(bit3)发送完成标志位,为 1 的时候表明发送缓冲(TxFIFO)和移位寄存器为空,也

就是发送完成,向 TxFIFO 写入数据此位就会自动清零。

RDR(bit0)数据接收标志位,为 1 的时候表明至少接收到一个数据,从寄存器

UARTx_URXD 读取数据接收到的数据以后此位会自动清零

分频设置

接 下 来 看 一 下 寄 存 器

UARTx_UFCR 、 UARTx_UBIR 和 UARTx_UBMR , 寄 存 器

UARTx_UFCR 中我们要用到的是位 RFDIV(bit9:7),用来设置参考时钟分频

Linux串口驱动_第12张图片

Linux串口驱动_第13张图片

发送数据和接收数据

最后来看一下寄存器 UARTx_URXDUARTx_UTXD,这两个寄存器分别为 UART 的

发送数据寄存器。

3.串口实验

3.1裸机步骤如下

  • 设置 UART1 的时钟源
  • 初始化 UART1
  • 使能 UART1
  • 编写 UART1 数据收发函数

  1. 板子硬件原理

Linux串口驱动_第14张图片

3.2Linux下的串口实验

使用串口3,硬件接口如下:

RS232电平转换

Linux串口驱动_第15张图片

RS485电平转换

Linux串口驱动_第16张图片

RS232驱动编写

UART驱动NXP已经写好了,我们需要做的是向设备树中添加UART3对应的节点

所以

3.2.1修改设备树,添加UART3节点IO

通过寄存器IOMUXC_SW_PAD_CTL_PAD_UART3_TX_DATAIOMUXC_SW_PAD_CTL_PAD_UART3_RX_DATA 设置UART3的Rx、Tx引脚的电气属性为0x1b0b1

for example:

Linux串口驱动_第17张图片

注意引脚不能被其它设备节点使用

pinctrl_uart3: uart3grp {
fsl,pins = <
    //这里前面的宏定义是设置IO复用,后面的数字是设置电气属性,也就是config_reg寄存器的值
    MX6UL_PAD_UART3_TX_DATA__UART3_DCE_TX 0X1b0b1 
    MX6UL_PAD_UART3_RX_DATA__UART3_DCE_RX 0X1b0b1
>;
};

pinctrl子系统 IO配置复习

其中,宏定义定义在/arch/arm/boot/dts/imx6ul-pinfunc.h文件中

#define MX6UL_PAD_UART3_CTS_B__UART3_DCE_CTS 0x00AC 0x0338 0x0000 0x0 0x0

#define MX6UL_PAD_UART3_CTS_B__UART3_DTE_RTS 0x00AC 0x0338 0x0630 0x0 0x0

宏定义部分表示将UART3_CTS_B 这个IO复用为UART3_DCE_CTS ,后面五个值的含义如下:

  • mux_reg:复用寄存器偏移地址
  • conf_reg:寄存器偏移地址
  • input_reg:寄存器偏移地址
  • mux_mode : mux_reg寄存器的值
  • input_val :input_val值
  1. 添加uart3节点

此处删除uart3,因为它占用了uart3的IO

完成以后重新编译设备树并使用新的设备树启动 Linux,如果设备树修改成功的话,系统

启动以后就会生成一个名为“/dev/ttymxc2”的设备文件,ttymxc2 就是 UART3 对应的设备文

件,应用程序可以通过访问 ttymxc2 来实现对 UART3 的操作。

 &uart3 {
 pinctrl-names = "default";
 pinctrl-0 = <&pinctrl_uart3>;
 status = "okay";
 };
3.2.2向开发板中移植minicom串口开发工具
  • 2.1移植依赖库ncurses

在Ubuntu中 在自己路径下eg:/home/dongdong/linux/IMX6ULL 目录下创建了一个名为“tool”的目录来存放所有的移植文件,解压文件

tar -vxzf ncurses-6.0.tar.gz

解压完成以后就会生成一个名为“ncurses-6.0”的文件夹,此文件夹就是 ncurese 的源码文件夹

在 tool 目录下新建名为“ncurses”目录,用于保存 ncurses 编译结果,一切准备就绪以后

就可以编译 ncureses 库了。进入到 ncureses 源码目录下,也就是刚刚解压出来的 ncurses-6.0 目

录中,首先是配置 ncureses,输入如下命令:

./configure  --prefix=/home/dongdong/linux/ncurses_code/ncurses   --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf --with-shared --without-profile --disable-stripping --without-progs --with-manpages --without-tests

解释:configure 就是配置脚本,--prefix 用于指定编译结果的保存目录,这里肯定将编译结果保存

到我们前面创建的“ncurses”目录中。--host 用于指定编译器前缀,这里设置为 “arm-linux-

gnueabihf”,--target 用于指定目标,这里也设置为“arm-linux-gnueabihf”。

Linux串口驱动_第18张图片

编译make 再安装 make install(安装的意思就是将编译出来的结果拷贝到--pfefix 指定的目录里面去).此处要加权限

Linux串口驱动_第19张图片

Linux串口驱动_第20张图片

安装成功以后查看一下前面创建的“ncurses”文件夹,我们需要将其中 include、lib 和 share 这三个目录中存放的文件分别拷贝到开发板根文件系统中的/usr/include、/usr/lib 和/usr/share 这三个目录中,如果哪个目录不存在的话请自行创建!!拷贝命令如下:

sudo cp lib/* /home/dongdong/linux/nfs/rootfs/usr/lib/ -rfa
sudo cp share/* /home/dongdong/linux/nfs/rootfs/usr/share/ -rfa
sudo cp include/* /home/dongdong/linux/nfs/rootfs/usr/include/ -rfa

然后在开发板根目录的/etc/profile(没有的话自己创建一个)文件中添加如下所示内容:

#!/bin/sh
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
export TERM=vt100
export TERMINFO=/usr/share/terminfo
  • 继续移植 minicom

1.将 minicom-2.7.1.tar.gz 拷贝到 ubuntu 中的/home/zuozhongkai/linux/IMX6ULL/tool 目录下

2.在 tool 目录下新建一个名为“minicom”的子目录,用于存放 minicom编译结果

3.解压 minicom tar -vxzf minicom-2.7.1.tar.gz

4.解压完成以后会生成一个叫做 minicom-2.7.1 的文件夹,这个就是 minicom 的源码,进入到

此目录中,然后配置 minicom

./configure CC=arm-linux-gnueabihf-gcc --prefix=/home/dongdong/linux/ncurses_code/minicom --host=arm-linux-gnueabihf CPPFLAGS=-I/home/dongdong/linux/ncurses_code/ncurses/include LDFLAGS=-L/home/dongdong/linux/linux/ncurses_code/ncurses/lib -enable-cfg-dir=/etc/minicom

Linux串口驱动_第21张图片

5.配置成功以后执行如下命令编译并安装

make
make install

缺少依赖,待解决!!!

Linux串口驱动_第22张图片

6.将 minicom 目录中 bin 子目录下的所有文件拷贝到开发板根目录中的/usr/bin 目录下

sudo cp bin/* /home/zuozhongkai/linux/nfs/rootfs/usr/bin/

完成以后在开发板中输入“minicom -v”来查看 minicom 工作是否正常,输入如下命令打开 minicom 配置界面:minicom -s

如果结果是打不开,新建/etc/passwd 文件,然后在 passwd 文件里面输入如下所示内容:

root:x:0:0:root:/root:/bin/sh

完成以后重启开发板!

minicom工具使用

你可能感兴趣的:(Linux驱动学习,linux,单片机,驱动开发)