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

 

posted @ 2022-10-22 15:49  一只小毛驴~  阅读(1808)  评论(0编辑  收藏  举报