我需要一些建议来开发自定义PCIe驱动程序.驱动程序必须同时支持Windows CE 6.0和Windows桌面(准备就绪时为xp,7和8).
我们有很多开发Windows CE驱动程序的经验,但没有为Windows桌面开发的驱动程序.我很确定我们可以开发一个好的,可靠的Windows CE驱动程序,但我认为如果没有一些外部帮助我们将无法为Windows桌面做同样的事情.我认为我们有两种选择:
1)使用现有的驱动程序框架,例如Jungo WinDriver,它允许我们开发一次驱动程序并编译到多个平台.这也具有以下优点:大部分开发将在用户空间中,因此它应该使开发过程更简单.
2)获得一些外部帮助来设置一个好的Windows桌面驱动程序,其中所有的管道都已完成,我们只需要添加与我们的板通信的代码并公开相关的IOControls.也许尽可能将代码移动到用户空间库中.
每种选择的好处和缺点是什么?你会推荐其他方法吗?
我正在尝试编写一个简单的帮助应用程序,用于在没有检测到信号的情况下提示用户打开摄像机,这在这种情况下意味着摄像机关闭和/或HDMI电缆没有插入PCMCIA采集卡.如果信号存在,那么我将启动相应的录制应用程序,在本例中为Wirecast.
我怎么可能在VisualStudio中使用C#创建它?
我认为现在我已经接近了一个基于其中一条建议的建议,建议使用GraphEdit并查看硬件上可用的内容.我能够在捕获设备的属性中找到一个"信号检测"标志,如果摄像机打开/关闭或拔掉HDMI电缆,它会从0变为1,这就是我想要的.
现在,我将如何通过代码访问此标志?我想我真的很亲密,但不知道如何访问cElems和pElems从中获取结构caGUID.cElems返回值3,这与屏幕截图中显示的GraphEdit属性窗口中显示的选项卡数相同.pElems每次运行应用程序时都会返回不同的值,所以我不确定该结构中发生了什么.我认为我正在寻找的旗帜位于这些结构中的某个位置.
码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using DirectShowLib;
namespace Test
{
static class Program
{
[STAThread]
static void Main()
{
using (System.Threading.Mutex mutex = new System.Threading.Mutex(false, "Global\\" + appGuid))
{
if (!mutex.WaitOne(0, false))
{
return;
}
DsDevice[] capDevices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);
foreach (var dev in capDevices)
{
if (dev.DevicePath == @"@device:pnp:\\?\pci#ven_1131&dev_7160&subsys_12abf50a&rev_03#6&37bccbbe&0&000800e1#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\{6f814be9-9af6-43cf-9249-c0340100021c}")
{
IFilterGraph2 m_FilterGraph = (IFilterGraph2)new FilterGraph();
IBaseFilter capFilter = null; …Run Code Online (Sandbox Code Playgroud) 我正在尝试以编程方式找出特定PCIe设备连接的物理插槽.前提是我有卡的PCI-ID肯定会占用一个插槽,解决方案是找出哪一个.
请注意,我只对使用PCI Express总线感兴趣,尽管我认为设备识别/枚举过程与旧PCI相同.
该SMBIOS包含可用的主板插槽信息.可以从linux命令行检查这些信息:
$ sudo dmidecode -t slot
# dmidecode 2.11
SMBIOS 2.7 present.
Handle 0x003A, DMI type 9, 17 bytes
System Slot Information
Designation: PCIEX16_1
Type: x16 PCI Express x16
Current Usage: In Use
Length: Short
ID: 1
Characteristics:
3.3 V is provided
Opening is shared
PME signal is supported
Bus Address: 0000:03:02.0
Handle 0x003B, DMI type 9, 17 bytes
System Slot Information
Designation: PCIEX16_2
Type: x8 PCI Express x8
Current Usage: In Use …Run Code Online (Sandbox Code Playgroud) 我试图了解PCI Express如何工作,所以我可以编写一个Windows驱动程序,可以读取和写入没有板载内存的自定义PCI Express设备.
据我所知,PCIE配置空间中的基地址寄存器(BAR)保存了PCI Express应响应/允许写入的存储器地址.(这是正确的理解吗?)
我的问题如下:
我很感激你的时间.
最好的祝福,
我希望能够在由PCI ID识别的多GPU系统上将OpenCL设备与系统中的GPU相匹配.
例如,如果我的系统有多个GPU,可能来自不同的供应商,我可以通过枚举PCI总线列出设备.这给了我PCI供应商,设备和总线ID.如果我根据某些选择标准选择其中一个(GPU)PCI设备用于OpenCL计算,我该如何将其与OpenCL设备相匹配?
我可以使用clGetDeviceIDs()在OpenCL中枚举GPU设备,但没有明显的方法可以将OpenCL设备与PCI设备相匹配.OpenCL函数clGetDeviceInfo()提供对PCI供应商ID和设备名称的访问,但不提供对PCI设备或总线ID的访问.我可以尝试将PCI设备名称与OpenCL设备名称匹配,但是您可能有多个相同类型的设备,并且名称并不总是相同.
为什么这有必要?假设我知道程序X在GPU A上运行CUDA或其他东西.我想避免使用GPU A进行OpenCL操作,因此我选择GPU B.然后我需要弄清楚哪个OpenCL设备是GPU A,哪个是GPU B. PCI ID似乎是识别GPU设备的唯一一致且跨平台的方式.
顺便说一下,CUDA API确实为您提供了PCI,总线和插槽ID(CU_DEVICE_ATTRIBUTE_PCI_BUS_ID,CU_DEVICE_ATTRIBUTE_PCI_DEVICE_ID),但CUDA仅适用于NVidia设备.
理想情况下,我需要使用C或C++的解决方案.
经过我理解的一些基础文档后,基地址寄存器是可以通过PCIe IP访问的地址空间.PCIe IP既可以在基地址寄存器中传输数据,也可以将接收到的数据写入其中.
我对吗?或遗漏任何东西?
我正在寻找一个内核模式调用,我可以从驱动程序,用户空间实用程序,或系统调用,要求内核查看PCI总线,并完全重新运行其初始化,或初始化特定设备.具体来说,我需要内核来识别启动后添加到总线的设备,然后配置其地址空间,中断和其他配置参数,最后启用设备以便我可以为其加载驱动程序(除非全部作为驱动程序负载的一部分发生).
我为此坚持2.4.x系列内核,目前正在使用2.4.20,但如果重要的话将会转向2.4.37.发行版是一个在ram磁盘上运行的Red Hat 7.3,但我可以添加任何工具来实现这个功能(只要它们与2.4系列配合使用).
如果某些背景有助于澄清我正在尝试做什么:从冷启动,一旦在Linux中我使用GPIO编程FPGA.FPGA的一部分,一旦编程,就实现了一个简单的PCI设备.目前,在对FPGA进行编程之后,我重新启动系统并且Linux在启动后识别设备并为其加载驱动程序.
而不是需要重新启动,我想简单地要求内核在启动期间做任何事情以找到PCI设备(我已经配置了内核来自己找到PCI设备,而不是向BIOS询问该信息,所以BIOS不需要知道这个设备(我希望)).
我相信Linux能够在设备编程后但在重启之前看到设备,因为它scanpci会在我编程后显示设备,因为它会lspci -H 1.我只需要一种方法来进入/proc/pci,配置和启用.
有谁知道适合Android开发的PCI卡?
我发现仿真器速度非常慢(Linux 64位,四核,8GB RAM),而且我可以隐藏在桌面上的卡也不错.我知道那里有USB选项,但这意味着我需要更多套件才能找到一个架子......或者适当地安装USB板
想要这样做的原因,原因是:
如果没有已经具有Android特定功能的卡,那么我会对带有共享内存的通用ARM卡感到满意.图形协处理器将是有用的,但不是必需的.
我很高兴我想要这样做的原因,并乐于编写我需要的任何驱动程序代码.
提前致谢,
Phil Lello
在Linux中,有没有办法找出插入哪个PCI插槽的PCI卡?
/ sys/bus/pci/devices /包含许多非卡的设备(网桥,CPU通道等),我无法在设备目录中找到有关插槽卡映射的任何信息.
我正在为一个简单的测试设备编写PCI驱动程序.
使用lspci可以正确识别硬件(如您所见,我的驱动程序vab已经注册):
04:02.0 Non-VGA unclassified device: Device bace:55aa
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0
Region 0: Memory at f0000000 (32-bit, prefetchable) [size=16M]
Kernel driver in use: vabs
Run Code Online (Sandbox Code Playgroud)
驱动程序和PCI子系统的初始化和去新化工作正常.我收到了设备号,udev创建了一个设备文件.
从设备文件中读取时,我收到以下错误消息:
BUG: unable to handle kernel paging request at 00000000f0000000
Run Code Online (Sandbox Code Playgroud)
我成功地在初始化中请求PCI资源.这将为memstart0返回00000000f0000000,这是我的PCI基地址0.
memstart0 = pci_resource_start( pdev, 0 );
memlen = pci_resource_len( pdev, 0 );
if( request_mem_region(memstart0,memlen,pdev->dev.kobj.name)==NULL ) {
dev_err(&pdev->dev,"Memory address …Run Code Online (Sandbox Code Playgroud)