日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Xilinx XDMA 上位机应用程序控制逻辑

發布時間:2024/3/12 编程问答 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Xilinx XDMA 上位机应用程序控制逻辑 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Xilinx XDMA pcie 上位機應用程序控制邏輯

1. 驅動安裝的參數

關于驅動的編譯和安裝這里就不多講了,無非就是make 和 insmod 。這里講一下驅動安裝時,控制驅動屬性的幾個參數:
1.中斷模式

static unsigned int interrupt_mode; module_param(interrupt_mode, uint, 0644); MODULE_PARM_DESC(interrupt_mode, "0 - Auto , 1 - MSI, 2 - Legacy, 3 - MSI-x");

中斷模式分為三種,MSIX是最新的中斷模式,老版本的內核可能不支持。就比如說我的內核。如果不指定驅動安裝額中斷參數,那么就會產生內核安裝的錯誤。所以這里我們選擇MSI的中斷模式。

2.驅動運行模式

static unsigned int poll_mode; module_param(poll_mode, uint, 0644); MODULE_PARM_DESC(poll_mode, "Set 1 for hw polling, default is 0 (interrupts)");

驅動的運行模式分為兩種, 中斷模式和poll_mode 模式,默認是中斷模式,設置為1是硬件polling模式。根據實際應用場景可以選擇相應的設置。
3.sgdma傳輸延時

unsigned int h2c_timeout = 10; module_param(h2c_timeout, uint, 0644); MODULE_PARM_DESC(h2c_timeout, "H2C sgdma timeout in seconds, default is 10 sec.");unsigned int c2h_timeout = 10; module_param(c2h_timeout, uint, 0644); MODULE_PARM_DESC(c2h_timeout, "C2H sgdma timeout in seconds, default is 10 sec.");

默認是10s鐘, 可以自定義設置。

4.其他參數

static unsigned int enable_st_c2h_credit = 0; module_param(enable_st_c2h_credit, uint, 0644); MODULE_PARM_DESC(enable_st_c2h_credit,"Set 1 to enable ST C2H engine credit feature, default is 0 ( credit control disabled)");unsigned int desc_blen_max = XDMA_DESC_BLEN_MAX; module_param(desc_blen_max, uint, 0644); MODULE_PARM_DESC(desc_blen_max,"per descriptor max. buffer length, default is (1 << 28) - 1");

這兩個參數,沒有使用過,基本上也沒怎么了解。 大概也就是數據傳輸的認證和描述符的buf長度吧 。

2.驅動安裝后生成的幾個設備

驅動安裝成功后,會生成幾個設備文件。對應的應用編程, 就是操作這些設備文件來實現對應的業務邏輯。簡單的介紹一下幾個設備的功能:

1. xdma0_h2c_0 xdma0_c2h_0
這兩個設備就是用來讀寫的設備文件,h2c 是寫設備,c2h是讀設備。對應的是FPGA端設置的通道。
2. xdma0_events_x
用于處理中斷事件的設備,IP核內設置對應的中斷號,對應的中斷設備。
3. xdma0_user
xdma_user設備節點用于實現PCIe的地址映射,為上層應用提供編程控制接口、AXI接口等
4. xdma0_control
xdma0_control設備節點主要是為上層提供DMA寄存器接口

比較常用的就這幾個設備。

3.應用程序邏輯

兩個線程:一個線程用于處理中斷事件,另外一個線程用于處理數據讀取。線程之間的同步用信號量。
讀取的數據保存在文件。

/*信號量初始化*/sem_init(&c2h_sem, 0, 0);/*線程創建*/pthread_create(&c2h_event_thread, NULL, c2h_event_process, NULL);pthread_create(&c2h_data_thread, NULL, c2h_data_process, NULL); void *c2h_event_process(void *param) {static int flag = 0;int fd = open_event("/dev/xdma0_events_0");printf("c2h event thread running, c2h_event_fd = %d\n", fd);while(1){int val = read_event(fd);if(val ) {sem_post(&c2h_sem);if (flag < total_frame) {printf("c2h get %d frame event\n",flag);flag++;}else{pthread_exit(0);}}else{ continue;}} } void *c2h_data_process(void *param) {int fd = open("/dev/xdma0_c2h_0",O_RDWR | O_NONBLOCK);printf("c2h data thread running, c2h_data_fd = %d\n", fd);/*讀取的數據寫文件*/FILE *record_fp = fopen("/mnt/nfs/c2h_record.bin", "wb");unsigned char *buf = new unsigned char[frame_bytes];while(1){sem_wait(&c2h_sem);int read_bytes = read(xdma_c2h_fd, c2h_align_mem, trans_bytes);memcpy(buf, c2h_align_mem, read_bytes);recv_frame_cnt++;fwrite(buf, frame_bytes, 1, record_fp);printf("Have been read %d frame,with %d irq\n",recv_frame_cnt,irq_num);if(recv_frame_cnt >= total_frame){clock_gettime(CLOCK_MONOTONIC, &ts_end);printf("video recv over!\n");delete buf;fclose(record_fp);pthread_exit(0);}} }

讀取的數據保存在以4096字節的堆區。函數調用時:

/*4096字節對齊分配內存*/ posix_memalign((void **)&c2h_align_mem,4096, frame_bytes);

設備xdma_usr的使用,之前有說過,xdma_user設備節點用于實現PCIe的地址映射,為上層應用提供編程控制接口、AXI接口等。
那么FPGA端可以設置一些屬性放在寄存器中供我們讀取。比如我這邊就從寄存器a4獲取的幀的大小,
mmap 函數是將硬件的地址硬件映射至linux 用戶層可訪問的虛擬地址空間。

int control_fd = open_control("/dev/xdma0_user");control_base = mmap_control(control_fd,MAP_SIZE);/*獲取幀大小*/frame_bytes = read_control(control_base,0x0a4);printf("frame_bytes:%d\n", frame_bytes);

測試代碼很簡單,邏輯基本上就是這樣。

最近我會去研究XDMA的驅動,看他的實際邏輯時如何的。之后會更新一篇文章,來梳理我之后的學習內容。

相關的的驅動及測試代碼,以及FPGA工程,已經上傳至網盤,有需要的朋友可以自行下載。

鏈接:https://pan.baidu.com/s/1wdPqUf8_2K6r8ZbVupizrw
提取碼:i2sw

總結

以上是生活随笔為你收集整理的Xilinx XDMA 上位机应用程序控制逻辑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。