0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Petalinux2020.01 内核DMA驱动调试说明

C29F_xilinx_inc 来源:用户发布 作者:用户发布 2022-02-16 16:21 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1、在用户设备树中 pl-custom中

/delete-node/ &axi_dma_0;
/ {
axi_dma_0: dma@a0000000 {
#dma-cells = ;
clock-names = "s_axi_lite_aclk", "m_axi_mm2s_aclk", "m_axi_s2mm_aclk";
clocks = , , ;
compatible = "xlnx,axi-dma-7.1", "xlnx,axi-dma-1.00.a";
interrupt-names = "mm2s_introut", "s2mm_introut";
interrupt-parent = ;
interrupts = ;
reg = ;
xlnx,addrwidth = ;
xlnx,sg-length-width = ;
dma-channel@a0000000 {
compatible = "xlnx,axi-dma-mm2s-channel";
dma-channels = ;
interrupts = ;
xlnx,datawidth = ;
xlnx,device-id = ;
xlnx,include-dre ;
};
dma-channel@a0000030 {
compatible = "xlnx,axi-dma-s2mm-channel";
dma-channels = ;
interrupts = ;
xlnx,datawidth = ;
xlnx,device-id = ;
xlnx,include-dre ;
};
};
};

2 、在用户system-user中

/include/ "system-conf.dtsi"
/include/ "pl-custom.dtsi"
/ {
axidma_chrdev: axidma_chrdev@0 {
compatible = "xlnx,axidma-chrdev";
dmas = ;
dma-names = "tx_channel", "rx_channel";
};
};

&axi_dma_0 {
dma-coherent;
status = "okay";
};

3、device-tree.bbappend

SRC_URI += "file://system-user.dtsi"
SRC_URI += "file://pl-custom.dtsi"

4 、teminal

petalinux-create -t modules -n xilinx-axidma --enable

5 、github上下载dma驱动,xilinx_axidma-master.zip 并解压,由于内核的改变,对下列部分文件做出改变。
(1) makefile

DRIVER_NAME = xilinx-axidma
$(DRIVER_NAME)-objs = axi_dma.o axidma_chrdev.o axidma_dma.o axidma_of.o
obj-m := $(DRIVER_NAME).o

(2)xilinx-axidma.bb

SRC_URI = "file://Makefile \
file://axi_dma.c \
file://axidma_chrdev.c \
file://axidma_dma.c \
file://axidma_of.c \
file://axidma.h \
file://axidma_ioctl.h \
file://COPYING \

(3)axi_dma.c

#include
// new

(4)axidma_chrdev.c
linux 内核4.x到5.x,参数减少,查看内核函数,无影响
https://elixir.bootlin.com/linux/v4.9.251/source/include/linux/of_device.h
https://elixir.bootlin.com/linux/v4.9.251/source/include/linux/uaccess.h

在 static bool axidma_access_ok(const void __user *arg, size_t size, bool readonly)函数中

// if (!readonly && !access_ok(VERIFY_WRITE, arg, size)) {
if (!readonly && !access_ok(arg, size)) {

// } else if (!access_ok(VERIFY_READ, arg, size)) {
} else if (!access_ok(arg, size)) {

//of_dma_configure(struct device->dev, NULL);
of_dma_configure(struct device->dev, NULL,true);

(5)axidma_dma.c

#include
// new

static void axidma_dma_callback(void *data)
struct kernel_siginfo sig_info;

6、petalinux-build petalinux-build --sdk petalinux-package --sysroot

7、配置qt的环境。

8 qt 将example中的axidma_benchmark.c复制到qt,并添加其他所需文件。

(1)**.pro
SOURCES += \
gpio.cpp \
libaxidma.c \
main.cpp \
util.c

HEADERS += \
axidma_ioctl.h \
conversion.h \
gpio.h \
libaxidma.h \
util.h

(2)main.cpp() 由于是将C文件改为c++文件,所以此文件中这个函数需要做改变((void *)和(char *)相同)

static int single_transfer_test(axidma_dev_t dev, int tx_channel, void *tx_buf,
int tx_size, struct axidma_video_frame *tx_frame, int rx_channel,
void *rx_buf, int rx_size, struct axidma_video_frame *rx_frame)
{
int rc;

// Initialize the buffer region we're going to transmit
init_data((char *)tx_buf, (char *)rx_buf, tx_size, rx_size);

// Perform the DMA transaction
rc = axidma_twoway_transfer(dev, tx_channel, (char *)tx_buf, tx_size, tx_frame,
rx_channel, (char *)rx_buf, rx_size, rx_frame, true);
if (rc return rc;
}

// Verify that the data in the buffer changed
return verify_data((char *)tx_buf, (char *)rx_buf, tx_size, rx_size);
}

(3)在所有的 **.h中,为了使用QT的类功能,尽量用C++编程,对C文件的头文件做如下改变。

#ifdef __cplusplus
extern "C"{
#endif

......

#endif /* UTIL_H_ */

#ifdef __cplusplus
}
#endif

9、加载驱动

root@u3_save:/lib/modules/5.4.0-xilinx-v2020.1/extra# insmod xilinx-axidma.ko
[ 1637.846215] axidma: axidma_dma.c: axidma_dma_init: 725: DMA: Found 1 transmit channels and 1 receive channels.
[ 1637.856240] axidma: axidma_dma.c: axidma_dma_init: 727: VDMA: Found 0 transmit channels and 0 receive channels.

10、测试 因为dma的输入输出并没有还起来,所以只能看到发出去,看不到接收的

root@u3_save:/mnt# ./u3_dma_save
AXI DMA Benchmark Parameters:
Transmit Buffer Size: 7.91 MiB
R[ 1661.465441] axidma axidma: DMA mask not set
eceive Buffer Size: 7.91 MiB
Number of DMA Transfers: 1000 transfers

Using transmit channel 0 and receive channel 1.
[ 1671.710879] axidma: axidma_dma.c: axidma_start_transfer: 309: DMA receive transaction timed out.
[ 1672.719678] xilinx-vdma a0000000.dma: Cannot stop channel 00000000145aa465: 0
Failed to perform the AXI DMA read-write transfer: Timer expired

11、当使用环回时

root@u3_dma_test:/# ./mnt/u3_dma_save
AXI DMA Benchmark Parameters:
Transmit Buffer Size: 7.91 MiB
Receive Buffer Size: 7.91 MiB
Number of DMA Transfers: 1000 transfers

Using transmit channel 0 and receive channel 1.
Single transfer test successfully completed!
Beginning performance analysis of the DMA engine.

DMA Timing Statistics:
Elapsed Time: 41.49 s
Transmit Throughput: 190.66 MiB/s
Receive Throughput: 190.66 MiB/s
Total Throughput: 381.32 MiB/s
root@u3_dma_test:/#

13、qt and opencv 的配置
(1)安装sdk.sh
(2)在qt的pro中添加

INCLUDEPATH += /home/lcl/Soft/Sdk/sysroots/aarch64-xilinx-linux/usr/include

LIBS += \
-lopencv_imgcodecs \
-lopencv_highgui \
-lopencv_imgproc \
-lopencv_core \

即可。

14、接口改为128

root@u3_dma_test:/# ./mnt/u3_dma_save
AXI DMA Benchmark Parameters:
Transmit Buffer Size: 16.00 MiB
Receive Buffer Size: 16.00 MiB
Number of DMA Transfers: 1000 transfers

Using transmit channel 0 and receive channel 1.
Elapsed Time: 0.25 s
Single transfer test successfully completed!
Beginning performance analysis of the DMA engine.

DMA Timing Statistics:
Elapsed Time: 12.39 s
Transmit Throughput: 1291.32 MiB/s
Receive Throughput: 1291.32 MiB/s
Total Throughput: 2582.65 MiB/s
root@u3_dma_test:/#

15、第一个Elapsed Time: 0.25 s是当我把数据从缓冲区复制到其他位置消耗的时间,也就是16MB的数据需要250ms的时间,速率也就在60M左右,也验证以前的贴子,dma的实现方式(UIO或者内核驱动)与数据从缓冲区copy到别的地方的速率是没有关系的。

16、速度慢是缓冲区的问题 https://github.com/bperez77/xilinx_axidma/issues/69
(1)在设备树中
/include/ "system-conf.dtsi"
/include/ "pl-custom.dtsi"
/ {

axidma_chrdev: axidma_chrdev@0 {
compatible = "xlnx,axidma-chrdev";
dmas = ;
dma-names = "tx_channel", "rx_channel";
dma-coherent;
};
&axi_dma_0 {
dma-coherent;
status = "okay";
};

在测试代码中加速加入测速代码
......
rc = single_transfer_test(axidma_dev, tx_channel, tx_buf, tx_size,
tx_frame, rx_channel, rx_buf, rx_size, rx_frame);
if (rc goto free_rx_buf;
}

struct timeval start_time0, end_time0;
double elapsed_time0;
// Begin timing
gettimeofday(&start_time0, NULL);
memcpy(image_mid0, rx_buf, 2048*4096*4);
gettimeofday(&end_time0, NULL);
elapsed_time0 = TVAL_TO_SEC(end_time0) - TVAL_TO_SEC(start_time0);
printf("\tElapsed Time0: %0.2f s\n", elapsed_time0);

struct timeval start_time1, end_time1;
double elapsed_time1;
// Begin timing
gettimeofday(&start_time1, NULL);
memcpy(image_mid1, image_mid0, 2048*4096*4);
gettimeofday(&end_time1, NULL);
elapsed_time1 = TVAL_TO_SEC(end_time1) - TVAL_TO_SEC(start_time1);
printf("\tElapsed Time1: %0.2f s\n", elapsed_time1);

(3)测试结果
root@u3_dma_test:/# ./mnt/u3_dma_save
AXI DMA Benchmark Parameters:
Transmit Buffer Size: 32.00 MiB
[ 84.709677] axidma axidma: DMA mask not set
Receive Buffer Size: 32.00 MiB
Number of DMA Transfers: 1000 transfers

Using transmit channel 0 and receive channel 1.
Elapsed Time0: 0.07 s
Elapsed Time1: 0.07 s
Single transfer test successfully completed!
Beginning performance analysis of the DMA engine.

DMA Timing Statistics:
Elapsed Time: 24.75 s
Transmit Throughput: 1292.82 MiB/s
Receive Throughput: 1292.82 MiB/s
Total Throughput: 2585.64 MiB/s
root@u3_dma_test:/#

最后测得速率 32MB/70ms=450MB。
17、虽然速度是提高了,但是读写的数据是不对的
https://forums.xilinx.com/t5/%E5%B5%8C%E5%85%A5%E5%BC%8F-%E7%A1%AC%E4%BB...
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842098/Zynq+Ultr...

审核编辑:符乾江

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动
    +关注

    关注

    12

    文章

    1988

    浏览量

    88683
  • Linux
    +关注

    关注

    88

    文章

    11806

    浏览量

    219508
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何理解Linux内核中的PCIe驱动

    我们习惯了用 Verilog 去死磕 PCIe 的底层协议状态机。但一旦越过硬件边界来到操作系统层面,Linux 内核是如何接管并驱动这些 PCI/PCIe 设备的呢?由于不同的 CPU 架构实现了
    的头像 发表于 04-11 17:22 1231次阅读

    Visionfive的串口调试与编译内核

    18 块买的。 不过只是用来调试开发板的话,它们用起来都一样的,连接到电脑的 usb 口之后,安装店家提供的驱动,顺利的话就可以在【设备管理器】的【端口】看到了。我们需要记住的是它对应的 com
    发表于 04-01 07:35

    Linux内核驱动开发的技术核心精要

    嵌入式Linux驱动开发是连接硬件与操作系统的关键环节。随着内核演进(如Linux 6.13)和硬件复杂度提升,开发者需掌握并发控制、中断分层、内存管理、设备树、调试工具等核心知识。本文提炼出
    发表于 03-10 13:56

    【「Linux 设备驱动开发(第 2 版)」阅读体验】Linux内核平台抽线共和设备驱动程序

    \"; vcc-supply = <&vdd_3v3>; wakeup-source; }; }; 设备、驱动程序和平台抽象简介 LDM是Linux内核
    发表于 02-03 21:57

    深入RK3588内核:rockchip_linux_defconfig的作用与调试价值

    编译内核、适配硬件,还是调试复杂的内核故障,这个看似“平平无奇” 的配置文件,都扮演着 “基石” 般的角色。
    的头像 发表于 02-03 15:56 1354次阅读
    深入RK3588<b class='flag-5'>内核</b>:rockchip_linux_defconfig的作用与<b class='flag-5'>调试</b>价值

    Linux内核日志玩明白了吗?printk调试神器全解析

    前言:做Linux驱动开发或内核调试的朋友,一定对printk不陌生,但你真的会用它吗?为什么同样是调试RK3588内核,别人能精准捕捉关键
    的头像 发表于 12-19 08:32 1045次阅读
    Linux<b class='flag-5'>内核</b>日志玩明白了吗?printk<b class='flag-5'>调试</b>神器全解析

    Linux驱动开发的必备知识

    驱动框架进行开发。 6、调试技能: 掌握内核调试工具,如 KDB、KGDB、printk 等。 能够分析内核日志,定位
    发表于 12-04 07:58

    GCC -O0 编译内核调试党的 “救命神器”,这些优势 90% 开发者没吃透!

    在 Linux 内核开发、驱动调试内核问题定位的场景中,“编译优化等级” 是个容易被忽略却影响巨大的选择。GCC 的优化等级从 O0 到 O3、Os、Ofast 各有侧重,而 O0(
    的头像 发表于 12-03 07:05 963次阅读
    GCC -O0 编译<b class='flag-5'>内核</b>:<b class='flag-5'>调试</b>党的 “救命神器”,这些优势 90% 开发者没吃透!

    L42A9A-A机芯调试说明

    L42A9A机芯调试说明
    发表于 08-15 16:20 0次下载

    强实时运动控制内核MotionRT750(一):驱动安装、内核配置与使用

    强实时运动控制内核MotionRT750的驱动安装与内核配置
    的头像 发表于 07-03 15:48 3885次阅读
    强实时运动控制<b class='flag-5'>内核</b>MotionRT750(一):<b class='flag-5'>驱动</b>安装、<b class='flag-5'>内核</b>配置与使用

    硬件调试:JLink 驱动配置与调试技巧

    摘要: 本文深入探讨了 JLink 调试器在嵌入式系统硬件调试中的应用,详细阐述了 JLink 驱动配置的方法以及硬件调试技巧。本文以国科安芯的AS32系列MCU芯片为例,通过分析 J
    的头像 发表于 06-12 23:20 1873次阅读
    硬件<b class='flag-5'>调试</b>:JLink <b class='flag-5'>驱动</b>配置与<b class='flag-5'>调试</b>技巧

    mtb-example-usb-device-hid-generic在配置DMA时失败了,为什么?

    ,如下图所示: 观察到了相同的失败行为。 请注意,以下链接中标题“CAT1A 设备的 DMA 驱动程序”下讨论的关于是否需要这最后一步的说明在该主题上是“模棱两可的”。 https
    发表于 05-16 07:40

    调试变频器详细说明

    调试变频器是一个复杂但至关重要的过程,它涉及多个参数的设定和调整,以确保变频器能够正常运行并满足特定应用需求。以下是对变频器调试的详细说明。 一、准备工作 1. 选择合适的电机功率:根据实际需求选择
    的头像 发表于 04-25 15:32 2516次阅读

    在任何平台上使用PetaLinux的先决条件

    本篇文章介绍了在任何平台上使用 PetaLinux 的先决条件。PetaLinux 是一种嵌入式 Linux 软件开发套件 (SDK),主要用于基于 FPGA 的系统级芯片 (SoC) 设计或 FPGA 设计。
    的头像 发表于 04-24 10:40 1719次阅读
    在任何平台上使用<b class='flag-5'>PetaLinux</b>的先决条件

    IMP-3402微机发电机保护测控装置调试说明

    IMP-3402微机发电机保护测控装置调试说明书.doc
    发表于 04-22 15:46 0次下载