色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    1838

    瀏覽量

    85262
  • Linux
    +關注

    關注

    87

    文章

    11292

    瀏覽量

    209332
收藏 人收藏

    評論

    相關推薦

    如何在Petalinux下Patch u-boot源碼

    在軟件開發過程中我們經常遇到用 Patch 來傳遞和更新代碼的場景。本文以一個端到端的例子來演示在 Petalinux 使用過程中,如何給 u-boot 的源碼生成 Patch 并在 Petalinux 中編譯。
    的頭像 發表于 12-04 16:26 ?994次閱讀
    如何在<b class='flag-5'>Petalinux</b>下Patch u-boot源碼

    嵌入式工程師都在找的【Linux內核調試技術】建議收藏!

    ,我們可以定位到導致系統不穩定的具體代碼位置。然后,根據這些信息對內核代碼進行修復和優化。 調試結果經過上述調試過程,我們發現SPI控制器驅動中存在一個競態條件,導致在數據傳輸過程
    發表于 11-28 15:37

    elmo直線電機驅動調試細則

    elmo驅動直線電機調試步驟及參數整定
    發表于 11-04 17:43 ?10次下載

    如何調試伺服驅動

    伺服驅動器的重要性:在自動化和精密控制領域,伺服驅動器是實現精確運動控制的關鍵組件。 調試的目的:確保伺服驅動器與電機匹配,提高系統性能,減少故障率。 1. 了解伺服
    的頭像 發表于 11-04 15:00 ?398次閱讀

    linux內核中通用HID觸摸驅動

    在linux內核中,為HID觸摸面板實現了一個通用的驅動程序,位于/drivers/hid/hid-multitouch.c文件中。hid觸摸驅動是以struct hid_driver實現,首先定義一個描述hid觸摸
    的頭像 發表于 10-29 10:55 ?542次閱讀
    linux<b class='flag-5'>內核</b>中通用HID觸摸<b class='flag-5'>驅動</b>

    linux驅動程序如何加載進內核

    在Linux系統中,驅動程序是內核與硬件設備之間的橋梁。它們允許內核與硬件設備進行通信,從而實現對硬件設備的控制和管理。 驅動程序的編寫 驅動
    的頭像 發表于 08-30 15:02 ?444次閱讀

    STC串口驅動調試程序

    STC的串口驅動調試程序。
    發表于 07-08 14:23 ?3次下載

    SPI+DMA方式驅動ADC芯片

    有SPI+DMA方式驅動ADC芯片的例程嗎
    發表于 04-26 17:53

    AOSP源碼定制-內核驅動編寫

    有時候為了分析一些殼的檢測,需要在內核層面對讀寫相關的操作進行監控,每次去修改對應的內核源碼編譯重刷過于耗時耗力,這里就來嘗試編寫一個內核驅動,載入后監控讀寫。
    的頭像 發表于 04-23 11:15 ?1200次閱讀
    AOSP源碼定制-<b class='flag-5'>內核</b><b class='flag-5'>驅動</b>編寫

    Linux DMA子系統驅動開發

    Streaming DMA在訪問內存地址時經過cache,是non-coherence設備,通常采用streaming mapping的API進行內存申請,在單次DMA傳輸時進行map,在傳輸完成后進行unmap;
    發表于 04-07 14:38 ?878次閱讀
    Linux <b class='flag-5'>DMA</b>子系統<b class='flag-5'>驅動</b>開發

    什么是DMADMA究竟有多快!

    直接內存訪問(Direct Memory Access,DMA):在計算機體系結構中,DMA 是一種數據傳輸方式,允許外部設備直接訪問計算機的內存,而無需通過中央處理單元(CPU)的干預。這有
    的頭像 發表于 02-22 10:43 ?2008次閱讀
    什么是<b class='flag-5'>DMA</b>?<b class='flag-5'>DMA</b>究竟有多快!

    RK3568驅動指南|驅動基礎進階篇-進階8 內核運行ko文件總結

    RK3568驅動指南|驅動基礎進階篇-進階8 內核運行ko文件總結
    的頭像 發表于 01-31 14:58 ?1142次閱讀
    RK3568<b class='flag-5'>驅動</b>指南|<b class='flag-5'>驅動</b>基礎進階篇-進階8 <b class='flag-5'>內核</b>運行ko文件總結

    TLT507-GDB程序調試方法說明

    TLT507-GDB程序調試方法說明
    的頭像 發表于 01-26 10:11 ?972次閱讀
    TLT507-GDB程序<b class='flag-5'>調試</b>方法<b class='flag-5'>說明</b>

    RK3568-GDB程序調試方法說明

    RK3568-GDB程序調試方法說明
    的頭像 發表于 01-19 16:16 ?1826次閱讀
    RK3568-GDB程序<b class='flag-5'>調試</b>方法<b class='flag-5'>說明</b>

    dma和通道技術的區別

    DMA是一種通過繞過中央處理器(CPU)來直接訪問內存的機制。它允許外部設備(如硬盤驅動器、網卡等)直接與內存進行數據傳輸,而無需通過CPU的干預。DMA的設計理念是提高數據傳輸的效率,減少CPU的負擔。
    的頭像 發表于 01-04 14:31 ?2549次閱讀
    主站蜘蛛池模板: 亚洲精品免费在线视频| 空姐内射出白浆10p| 国产99久久九九精品无码不卡| 1788福利视频在视频线| 亚洲成熟人网站| 亚洲国产cao| 性欧美金发洋妞xxxxbbbb| 色聚网久久综合| 日韩一区精品视频一区二区| 欧美性极品黑人hd| 欧洲日韩av无线在码| 欧美极限扩肛| 热99RE久久精品国产| 强伦姧久久久久久久久久| 欧美日韩高清一区二区三区| 欧美成ee人免费视频| 嫩草影院在线观看网站成人| 男女啪啪抽搐呻吟高潮动态图| 浪货嗯啊趴下NP粗口黄暴| 伦理片在线线手机版韩国免费6| 久久综合丁香激情久久| 芒果视频看片在线观看| 免费观看男生桶美女私人部位| 男人边吃奶边挵进去呻吟漫画| 年轻的老师5理伦片| 欧美午夜理伦三级在线观看| 日本久久久久亚洲中字幕| 日韩精品欧美亚洲高清有无| 色www永久免费| 亚洲 无码 在线 专区| 亚洲电影不卡| 永久午夜福利视频一区在线观看| 影音先锋男人资源813.| 99久久精品毛片免费播放| 草莓视频在线看免费高清观看| 国产 亚洲 中文在线 字幕| 国产精品久久人妻拍拍水牛影视| 国产在线一区二区AV视频| 久久热免费视频| 琪琪的色原网站| 亚洲 欧美 中文 日韩 另类|