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;
}
相关文章
|
5月前
|
运维 安全 网络安全
Windows Server 2019拨号“找不到设备”?Error 1058解决指南
Windows Server 2019拨号报错1058?别急!这不是硬件故障,而是关键服务被禁用。通过“服务依存关系”排查,依次启动“安全套接字隧道协议”“远程接入连接管理”和“路由与远程访问”服务,仅需4步即可恢复PPPoE或VPN拨号功能,轻松解决网络中断问题。
445 1
|
9月前
|
人工智能 搜索推荐 API
🚀 2小时极速开发!基于DeepSeek+智体OS的AI社交「头榜」震撼上线!
基于DeepSeek大模型与DTNS协议的革命性AI社交平台「头榜」震撼上线!仅需2小时极速开发,即可构建完整社交功能模块。平台具备智能社交网络、AI Agent生态、Prompt市场、AIGC创作等六大核心优势,支持低代码部署与个性化定制。开发者可快速接入DeepSeek API,体验去中心化架构与数据自主权。官网:[dtns.top](https://dtns.top),立即开启你的AI社交帝国!#AI社交 #DeepSeek #DTNS协议
306 4
|
12月前
|
存储 人工智能 JavaScript
Harmony OS开发-ArkTS三
本文介绍了ArkTS的基础语法,包括常量、命名规则、数组及其常用函数,以及函数的定义与使用,涵盖匿名函数和箭头函数的区别。通过具体示例,帮助读者快速掌握ArkTS编程技巧,踏上Harmony OS开发之旅。君志所向,一往无前!
703 1
Harmony OS开发-ArkTS三
|
5月前
|
安全 Linux 网络安全
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
162 0
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
|
7月前
|
监控 Linux 开发者
理解Linux操作系统内核中物理设备驱动(phy driver)的功能。
综合来看,物理设备驱动在Linux系统中的作用是至关重要的,它通过与硬件设备的紧密配合,为上层应用提供稳定可靠的通信基础设施。开发一款优秀的物理设备驱动需要开发者具备深厚的硬件知识、熟练的编程技能以及对Linux内核架构的深入理解,以确保驱动程序能在不同的硬件平台和网络条件下都能提供最优的性能。
394 0
|
9月前
|
Ubuntu 虚拟化 Windows
无影云电脑选择哪个操作系统Windows server 2019还是Ubuntu?
在选择阿里云无影云电脑的操作系统时,Windows Server 2019 和 Ubuntu 各有优势。Windows适合依赖微软生态的企业级应用,提供图形化界面和高安全性;Ubuntu则轻量、经济,适合开源工具链和容器化部署。根据应用场景、资源占用、安全性、开发效率及成本考量,选择最适合的系统。条件允许下,可采用混合方案满足多样化需求。
|
9月前
|
安全 Ubuntu Linux
Nipper 3.8.0 for Windows & Linux - 网络设备漏洞评估
Nipper 3.8.0 for Windows & Linux - 网络设备漏洞评估
347 0
Nipper 3.8.0 for Windows & Linux - 网络设备漏洞评估
|
10月前
|
XML 安全 网络安全
Nipper 3.7.0 Windows x64 - 网络设备漏洞评估
Nipper 3.7.0 Windows x64 - 网络设备漏洞评估
234 0
Nipper 3.7.0 Windows x64 - 网络设备漏洞评估
|
存储 人工智能 JavaScript
Harmony OS开发-ArkTS语言速成二
本文介绍了ArkTS基础语法,包括三种基本数据类型(string、number、boolean)和变量的使用。重点讲解了let、const和var的区别,涵盖作用域、变量提升、重新赋值及初始化等方面。期待与你共同进步!
618 47
Harmony OS开发-ArkTS语言速成二
|
12月前
|
存储 人工智能 编译器
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
816 11
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡

推荐镜像

更多