Xilinx Zynq 配置UARTLITE驱动
介绍
AXI 通用异步串行总线收发器 (UART) Lite 核可以实现基于AMBA AXI 接口的UART收发,且这个软核基于AXI Lite总线接口设计。
硬件特性
- 用于寄存器访问核数据传输的AXI4-Lite 接口
- 全双工
- 16字符深度的收发FIFO
- 字符宽度可配置为5-8比特
- 可配置的奇偶校验位 (odd or even or none)
- 可配置的波特率
驱动程序特性支持
- 支持16字符深度的收发FIFO
- 字符宽度可配置为5-8比特
- 可配置的奇偶校验位 (odd or even or none)
内核配置
要在 Linux 内核中启用 uartlite 驱动程序,必须在内核中集成它或将其构建为内核模块(.ko)。在petalinux中可以通过以下方式启用:
make menuconfig---> Device Drivers ---> Character devices ---> Serial drivers ---> Xilinx uartlite serial port support
或者直接修改 .config 文件下面几行:
# 集成进内核 CONFIG_SERIAL_UARTLITE=y # 编译为ko模块 CONFIG_SERIAL_UARTLITE=m
当使用较新版本时,以及当系统中需要多个UART Lite时,用户还应配置以下配置项以增加驱动程序中 UART 端口的数量。驱动程序基于此配置项目静态分配端口数据结构。端口号设备树属性用于每个 UART Lite 设备节点,并用于索引到驱动程序中的端口数据结构。端口号类似于别名号,因此这受系统中 UART 总数(包括 PS UART)的影响。
CONFIG_SERIAL_UARTLITE_NR_UARTS=<系统中UART设备总数,包括PS串口>
设备树
这有个设备树的例子
https://www.kernel.org/doc/Documentation/devicetree/bindings/serial/xlnx%2Copb-uartlite.txt
uartlite_0@42C00000 { compatible = "xlnx,xps-uartlite-1.00.a"; reg = <0x42C00000 0x10000>; interrupt-parent = <&gic>; interrupts = <0 59 4>; clock = <100000000>;}; uartlite_1@42C10000 { compatible = "xlnx,xps-uartlite-1.00.a"; reg = <0x42C10000 0x10000>; interrupt-parent = <&gic>; interrupts = <0 59 4>; clock = <100000000>;};
请注意如何使用相同的中断,但要使其正常工作,您必须或从uarts到中断输入的中断。
Vivado Block Design
与其将中断输出直接连接到IRQ_F2P还可以使用实用程序简化逻辑对其进行OR(或)连接,以仅将它们连接到一个中断通道。中断输出(irq_0,irq_1)为上升沿敏感中断输入(IRQ_F2P)产生一个小的正向脉冲。
The driver source file in the linux kernel at drivers/tty/serial/uartlite.c limits the number of supported UARTs to 16. If you need to increase that number, adjust this define near the top of the file:
Linux 内核中驱动程序源文件位于驱动程序/tty/serial/uartlite.c 处,将支持的 UART 的数量限制为 16 个。如果需要增加该数字,请在文件顶部附近调整此定义:
#define ULITE_NR_UARTS 16
之后,必须重建内核并将其部署到 Zynq 设备。
Linux中使用UARTLITE
With the FPGA binary loaded, the updated devicetree and updated kernel you should see one or more /dev/ttyULx devices.
Beware that linux puts all uarts in Canonical Mode, something you might not want in an embedded system. Chances are you want to use Non-Canonical or Raw Mode. Also don’t use fopen / fprintf / fputs / etc. if you want raw access, use open / close / read / write instead.
$echo 123456789 > /dev/ttyUL0
输出
root@Xilinx-ZC1751-DC2:~# root@Xilinx-ZC1751-DC2:~# echo 123456789 > /dev/ttyUL0 [70.634844] 123456789 root@Xilinx-ZC1751-DC2:~# echo 123456789abcd > /dev/ttyUL0 [75.774761] 123456789abcd