AXI4_Stream入门(3):信号缺省值与兼容

本文是ARM开发自学笔记,介绍AXI4 - Stream默认信号需求,如TREADY、TKEEP、TSTRB等信号的设置及作用,还提及TLAST不同设置方式的优缺点及推荐设置。同时阐述了兼容性考虑,包括主从接口匹配、线宽问题及空字节处理等内容。

本文来自自学过程中所记的笔记,可能有不少错漏与胡言乱语,仅供参考,建议主要以ARM官方文件进行参考。原参考文档官网可下载,为了方便各位,我也上传了,需要的自取;
链接:https://pan.baidu.com/s/1voHyFmkpGqABcKH8OSF_Ng
提取码:izix

默认信号需求:

TREADY: 该信号有时可以被省略,但是建议添加;其缺省值为HIGH;从从机的角度考虑,如果能始终保持信号接收,则可以将其省略;从主机的角度说,省略这个信号意味着始终保持信号接受,且不能承受Back-Pressure;对主机而言,即使没有承受Back-Pressure的功能,也会被建议添加TREADY信号,这有助于标记传输错误的情况;

TKEEPTSTRB: TKEEP和TSTRB都是可选信号,不是所有信号流都需要这两个信号;[如果要进行放大操作,且数据流不足以填满最大的一组,则必须使用TKEEP产生并标注空字节]; 当TKEEP缺失时,其默认值为HIGH;当TSTRB缺失时,其默认值为TSTRB = TKEEP; 当两者都缺失时,其默认值均为为HIGH;

TLAST: 当传输没有包或帧概念的数据流时,TLAST默认是无定义的;TLAST有以下几种设置方法:

  1. 设置TLAST始终为低位。这会将所有的传输都默认为一个包,也意味着为包的扩大与合并提供了最多的机会。但这同样意味着频繁出现的高延迟(为了合并数据流出现延迟)。同时这种设置会导致跨共享通道的数据流出错,因为其使用TLAST作为分流仲裁的判断;
  2. 设置TLAST始终未高位。这会把每个byte都看作一个单独的包,不会在传输过程中出现任何的主动延迟,跨共享通道的数据流也可以被有效仲裁;但这种情况下所有的数据流合并和扩大都会被阻止;
  3. 一个很好的折中方案是在发送固定Byte数之后进行TLAST声明,如每传输16 Bytes声明一次TLAST。这样既不会过度占用通路产生延迟,又不会影响数据流的扩大与合并;

按照推荐,TLAST的设置应当为:

  1. 对于任何拥有包概念的设备,TLAST必须存在。在使用一个包含TLAST信号的接口时,TLAST信号必须一直可用;
  2. 对于不支持TLAST信号的设备而言,TLAST信号必须一直为HIGH,防止一些设置下的组件将传输无限延迟;
  3. 对于不支持TLAST信号的设备而言,如果因为结构可以保证被传输的信号无需使用TLAST来防止传输无线延迟时,TLAST信号也可以被固定为LOW;

TIDTDESTTUSER: 这三种信号均为可选信号,主机不被要求提供这些信号;当主机不提供时,有额外TID、TDEST与TUSER接口的从机必须将这些接口置零;

TDATA: 绝大多数的AXI4-Stream接口都需要进行数据传输,However,没有这个的接口也是被允许的。如果TDATA不存在,则TSTRB也不能存在。如果TDATA不存在,TKEEP存在,则利用TKEEP来制造空包,进行扩大、缩小与合并操作;在TDATA与TKEEP都不存在时,则所有的扩大、缩小与合并的操作方式都必须与操作单个数据Byte相同;

兼容性考虑:

AXI4-Stream具有大量的可选特性,这也意味着主组件与从组件都有大量的指令集可以选择。对于输入接口而言,可以通过保持对所有信号的接受来获得完全的兼容性;对于输出接口而言,可以将未使用的输出接口全部按照default设置,以获得更好的输出兼容性;一般可以从两个方面考虑连接的兼容性,一是直连兼容性,主要是考虑主从部件之间直接连接的兼容性;二是互联兼容性,主要是考虑链接对两端设备兼容的影响;

如果要使主接口与从接口匹配,则两端的线宽一定要匹配,如果线宽不匹配,则必须使用能够改变线宽使之兼容的组件;只要总接口支持TREADY,其就可以支持所有种类的从机;在主机不支持的接口上,只要供应默认值即可;

主机与从机的兼容性问题,主要出现在主机发出的信号多于从机可以接收的信号数。首先要解决的问题还是接口宽度,如果线宽不匹配,则必须使用能够改变线宽使之兼容的组件;第二个问题是信源和目的地的通信,如果从机需要与多个信源通信,则其必须能够辨识足够多的TID与TDSET,在此基础上,基于其能够辨识的TID与TDSET数量,从机将可以支持有限个数量的数据流交错;最后是空字节与位置字节的问题。从机无需支持空字节与位置字节,当其不支持时,有以下解决办法:

  1. 将所有的位置字节都转化为数据字节。这一操作不支持将数据部分更新,还有可能导致数据损坏,但其可以保证所有的数据字节都在数据流中且都在正确的位置上;
  2. 如果从机不支持空字节,则需要一个打包用的组件删除数据中的所有空字节;

执行Package的组件可能需要同时处理多个并发流;

建立互联可以保证主机与从机之间的数据传输,但其中含有的放大、缩小与合并功能。这些功能可能会产生空字节。防止这些空字节进入不支持他们的设备的方式有以下几种:

  1. 对传输进行约束,以保证只产生与从机接口宽度相同的空字节,以便于在需要时进行截断;
  2. 使用一个打包用的组件删除数据中的所有空字节;
由于提供的引用内容未涉及解决 `axidma: axidma_dma.c: axidma_request_channels: 652: Unable to get slave channel 0: rx_channel0` 问题的方案,下面基于一般性的经验给出可能的解决思路: ### 检查硬件连接 硬件连接不稳定或者错误可能导致无法获取通道。需要检查AXI DMA设备和相关硬件的连接,确保物理连接正常,例如查看数据传输线是否插好,设备电源是否正常等。 ### 检查设备树配置 设备树中对AXI DMA设备的配置可能存在错误。需要检查设备树文件,确认是否正确配置了从通道0(rx_channel0),检查设备树中AXI DMA节点的通道相关属性,如中断、地址等是否正确。以下是一个简单的设备树中AXI DMA节点示例: ```dts axi_dma_0: axi-dma@40400000 { compatible = "xlnx,axi-dma-1.00.a"; reg = <0x40400000 0x10000>; interrupt-parent = <&intc>; interrupts = <0 29 4>; dma-channel@0 { /* 从通道0相关配置 */ dma-channels = <0>; dma-requests = <0>; }; }; ``` ### 检查驱动代码 在 `axidma_dma.c` 文件中,查看 `axidma_request_channels` 函数的实现,确认函数内部逻辑是否正确。检查函数中获取从通道0相关的代码,例如资源分配、初始化等步骤是否存在问题。同时,可以添加一些调试信息,打印函数执行过程中的关键变量值,帮助定位问题。 ### 检查内核模块加载顺序 确保AXI DMA驱动模块和相关依赖模块正确加载,并且加载顺序正确。某些情况下,模块加载顺序错误可能导致设备无法正常初始化,从而无法获取通道。可以使用 `lsmod` 命令查看当前已加载的内核模块,使用 `modprobe` 命令手动加载和卸载模块,调整加载顺序进行测试。 ### 检查系统资源 系统资源不足也可能导致无法获取通道。检查系统的内存使用情况、中断资源等,确保系统有足够的资源供AXI DMA设备使用。可以使用 `top`、`free` 等命令查看系统资源使用情况。 ### 示例调试代码 在 `axidma_dma.c` 文件中添加调试信息,例如: ```c static int axidma_request_channels(struct axidma_dev *axidma) { int ret; // ... 原有代码 ... // 获取从通道0之前添加调试信息 printk(KERN_INFO "Trying to get slave channel 0 (rx_channel0)\n"); ret = axidma_get_channel(axidma, 0, &axidma->rx_channel0); if (ret) { printk(KERN_ERR "Failed to get slave channel 0 (rx_channel0), error code: %d\n", ret); // 可以进一步添加更多调试信息,如相关寄存器值等 return ret; } // ... 原有代码 ... return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值