Windows操作系统:PCIE Axidma篇 2 多设备的准备及开发

简介: 在之前提到过的测试模式开启后,无须数字签名的axidma驱动就安装成功了,设备管理器中可以很开心的看到我们xilinx dma的设备,但是实际使用中,有时候并不会只用一台设备

前言

 在之前提到过的测试模式开启后,无须数字签名的axidma驱动就安装成功了,设备管理器中可以很开心的看到我们xilinx dma的设备,但是实际使用中,有时候并不会只用一台设备。当遇到了多台设备可以支持吗?以两台为例:

b7fa55edd8ca4a059b98bb4ae9c32d44.png


一.驱动层:

 点开设备属性,事件查看驱动信息,发现PCI编号是不同的,也就是区分我们代码里devpath的依据,

109d6c0c43f64dc1b6461c6849c1ae4d.png

 比如新增一个设备,同样的设备信息会看到设备号为7024,(上图7025为我们后加的设备)7024和7025由逻辑端指定分配(可改),第一步要解决的就是官方驱动里是否支持我们自定义的设备编号,打开驱动目录进行查找,

 能查到两个相关文件里对这个值进行了配置,先随便打开一个,不难看到刚好是没有7025的支持的,可以先把不用的设备号比如7028先更改为7025保存,

74230c71a43d44f1803f7e5cbd0cfac7.png

 重新安装驱动,就能出现最开始的画面了,在驱动层面上就支持了两个不同的设备,增加设备可以用同样的方法。

二.应用层:

 还是以官方的例程为例,下一篇会重点介绍官方例程怎么使用,这里只介绍一下设备的区分

 打开xdma_rw.c,这是官方用于读写寄存器或者内存空间值的demo,不论是我们后面自己开发还是怎么使用,一般都会和demo一样,有获取上面设备号的函数

官方demo里是

static int get_devices(GUID guid, char* devpath, size_t len_devpath)
static int get_devices(GUID guid, char* devpath, size_t len_devpath) {
    HDEVINFO device_info = SetupDiGetClassDevs((LPGUID)&guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
    if (device_info == INVALID_HANDLE_VALUE) {
        fprintf(stderr, "GetDevices INVALID_HANDLE_VALUE\n");
        exit(-1);
    }
    SP_DEVICE_INTERFACE_DATA device_interface;
    device_interface.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
    // enumerate through devices
    DWORD index;
    for (index = 0; SetupDiEnumDeviceInterfaces(device_info, NULL, &guid, index, &device_interface); ++index) {
        // get required buffer size
        ULONG detailLength = 0;
        if (!SetupDiGetDeviceInterfaceDetail(device_info, &device_interface, NULL, 0, &detailLength, NULL) && GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
            fprintf(stderr, "SetupDiGetDeviceInterfaceDetail - get length failed\n");
            break;
        }
        // allocate space for device interface detail
        PSP_DEVICE_INTERFACE_DETAIL_DATA dev_detail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, detailLength);
        if (!dev_detail) {
            fprintf(stderr, "HeapAlloc failed\n");
            break;
        }
        dev_detail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
        // get device interface detail
        if (!SetupDiGetDeviceInterfaceDetail(device_info, &device_interface, dev_detail, detailLength, NULL, NULL)) {
            fprintf(stderr, "SetupDiGetDeviceInterfaceDetail - get detail failed\n");
            HeapFree(GetProcessHeap(), 0, dev_detail);
            break;
        }
        StringCchCopy(devpath, len_devpath, dev_detail->DevicePath);
        HeapFree(GetProcessHeap(), 0, dev_detail);
    }
    SetupDiDestroyDeviceInfoList(device_info);
    return index;
}

其中for (index = 0; SetupDiEnumDeviceInterfaces(device_info, NULL, &guid, index, &device_interface); ++index)做到了遍历所有设备,但是会只返回最后一个设备,也就是说比如我们在7024和7025设备同时在线时,加载成功的是7025设备,那么我们就先只让他查找一次就好了比如改成这样,在应用开发的时候比如我们会分配cpu1核2核去专门做收发那么在另一个设备里最好换成3核4核做同样的工作

static int get_devices(GUID guid, char *devpath, size_t len_devpath) {
    size_t result = 0;
    HDEVINFO device_info = SetupDiGetClassDevs((LPGUID)&guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
    if (device_info == INVALID_HANDLE_VALUE) {
        LOGE(LOG_TAG"GetDevices INVALID_HANDLE_VALUE\n");
        return -(int)GetLastError();
    }
    SP_DEVICE_INTERFACE_DATA device_interface;
    device_interface.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
    // enumerate through devices
    DWORD index;
    index = 1; SetupDiEnumDeviceInterfaces(device_info, NULL, &guid, index, &device_interface);
        // get required buffer size
        ULONG detailLength = 0;
        if (!SetupDiGetDeviceInterfaceDetail(device_info, &device_interface, NULL, 0, &detailLength, NULL) && GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
            LOGE(LOG_TAG"SetupDiGetDeviceInterfaceDetail - get length failed\n");
            //break;
        }
        // allocate space for device interface detail
        PSP_DEVICE_INTERFACE_DETAIL_DATA dev_detail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, detailLength);
        if (!dev_detail) {
            LOGE(LOG_TAG"HeapAlloc failed\n");
            //break;
        }
        dev_detail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
        // get device interface detail
        if (!SetupDiGetDeviceInterfaceDetail(device_info, &device_interface, dev_detail, detailLength, NULL, NULL)) {
            LOGE(LOG_TAG"SetupDiGetDeviceInterfaceDetail - get detail failed\n");
            HeapFree(GetProcessHeap(), 0, dev_detail);
            //break;
        }
        StringCchCopy(devpath, len_devpath, dev_detail->DevicePath);
        HeapFree(GetProcessHeap(), 0, dev_detail);
    SetupDiDestroyDeviceInfoList(device_info);
    return index;
}
相关文章
|
1月前
|
数据安全/隐私保护 虚拟化 Windows
如何在 VM 虚拟机中安装 Windows Server 2012 操作系统保姆级教程(附链接)
如何在 VM 虚拟机中安装 Windows Server 2012 操作系统保姆级教程(附链接)
77 0
|
1月前
|
数据安全/隐私保护 虚拟化 Windows
如何在 VM 虚拟机中安装 Windows Server 2003 操作系统保姆级教程(附链接)
如何在 VM 虚拟机中安装 Windows Server 2003 操作系统保姆级教程(附链接)
57 0
|
1月前
|
数据安全/隐私保护 虚拟化 Windows
如何在 VM 虚拟机中安装 Windows 7 操作系统保姆级教程(附链接)
如何在 VM 虚拟机中安装 Windows 7 操作系统保姆级教程(附链接)
92 0
如何在 VM 虚拟机中安装 Windows 7 操作系统保姆级教程(附链接)
|
2天前
|
前端开发 Android开发 开发者
移动应用与系统:探索开发实践与操作系统融合
【4月更文挑战第23天】 在数字化时代的浪潮中,移动应用与系统的发展已成为技术创新和商业竞争的前沿阵地。本文将深入探讨移动应用的开发实践、移动操作系统的最新趋势以及二者之间的紧密融合。通过分析跨平台工具的效能、原生开发的优化策略以及操作系统的定制化功能,旨在为开发者提供一个全面而深入的视角,以适应不断变化的市场需求和技术挑战。
|
14天前
|
监控 测试技术 Android开发
移动应用与系统:开发与操作系统的深度解析
【4月更文挑战第11天】在这篇文章中,我们将深入探讨移动应用的开发过程,以及移动操作系统如何影响这些应用的性能和功能。我们将详细分析移动应用开发的关键步骤,包括需求分析、设计、编码、测试和维护。同时,我们也将探讨移动操作系统,如Android和iOS,如何为应用开发提供支持,并影响其性能。
|
17天前
|
Java 物联网 Android开发
移动应用与系统:探索开发与操作系统的融合
【4月更文挑战第8天】 在数字化时代的浪潮中,移动应用与系统的发展已成为技术创新的前沿阵地。本文将深入探讨移动应用开发的关键技术、移动操作系统的架构演变以及两者之间的相互作用。通过对当前流行的开发工具、编程语言和操作系统特性的分析,我们旨在为开发者提供一套全面的指导,以优化移动应用的性能和用户体验。同时,文章还将展望移动技术的未来趋势,特别是在人工智能和物联网领域的潜在应用。
|
27天前
|
机器学习/深度学习 搜索推荐 vr&ar
移动应用与系统的未来:从开发到操作系统的全面解析
本文将探讨移动应用和系统的未来,包括移动应用开发的趋势,移动操作系统的进展,以及这两者如何相互影响。我们将深入探讨如何通过理解这些变化,来优化移动应用的性能和用户体验。
10 2
|
1月前
|
监控 API 数据库
Python语言Windows操作系统
Python语言Windows操作系统
|
1月前
|
物联网 Windows
安装windows 10操作系统
安装windows 10操作系统
47 1
|
1月前
|
数据可视化 数据库 C++
Qt 5.14.2揭秘高效开发:如何用VS2022快速部署Qt 5.14.2,打造无与伦比的Windows应用
Qt 5.14.2揭秘高效开发:如何用VS2022快速部署Qt 5.14.2,打造无与伦比的Windows应用