Articles of 设备驱动程序

如何在Linux设备驱动程序中设置errno?

我正在devise一个Linux字符设备驱动程序。 我想在ioctl()系统调用中发生错误时设置errno。 long my_own_ioctl(struct file *file, unsigned int req, unsigned long arg) { long ret = 0; BOOL isErr = FALSE; // some operation // … if (isErr) { // set errno // … <— What should I do? ret = -1; } return ret; } 我该怎么做才能做到这一点? 提前谢谢! 请允许我更详细地解释我的申请。 我的设备位于/ dev / myCharDev。 我的用户空间应用程序是这样的: #define […]

如何将matrix_keypad.h文件用于自定义键盘驱动程序?

我可以用input_dev来模拟一个自定义键盘(来自input.h) //an example with just one key. button_dev = input_allocate_device(); if (!button_dev) { printk(KERN_ERR "button.c: Not enough memory\n"); error = -ENOMEM; goto err_free_irq; } button_dev->evbit[0] = BIT_MASK(EV_KEY); button_dev->keybit[BIT_WORD(BTN_0)] = BIT_MASK(BTN_0); 或者我将不得不使用matrix_keypad头文件?如果是,那么如何?

在Linux中,如何在现有类中使用device_create?

注意:我现在列出这个问题,我不反对改变实现(例如,将类的创build移动到公共区域),如果它让事情变得更简单,我只是不确定怎么做。 :结束注意 我有两个Linux内核模块,我试图更新他们的/ sys条目。 search谷歌和其他来源,我已经看到了大量的代码沿线: static dev_t MyDev; static struct class *c1; static int __init start_func(void) { … MyDev = MKDEV(nMajor, MINOR_VERSION); register_chrdev_region(MyDev, 1, MODULE_NAME); c1 = class_create(THIS_MODULE, "chardrv"); device_create(c1, NULL, MyDev, NULL, MODULE_NAME); …. 我已经validation了我的第一个模块这个代码的作品,它正确地创build一个: /sys/class/chardrv/<MODULE_NAME> 条目。 我想知道的是如何在现有的类中创build一个设备。 换句话说,我的一个模块创build了这个新的chardrv类,现在我希望我的其他模块也能够在同一个类下注册它的设备。 我不能再次调用class_create()(在第二个模块中),因为“chardrv”类已经存在… 所以我可以运行一个检查来查看/ sys / class / chardrv是否存在,这可以帮助我决定是否需要调用class_create()或不是这个问题。 让我们在这里澄清一些伪代码: if ( path "/sys/class/chardrv" does not exist) […]

Linux设备驱动程序不安全FXSAVE / FXRSTOR错误 – 任何先例?

有一个令人讨厌的问题,暂时难倒了我公司的一些工程师试图进行debugging。 C ++程序通常运行在具有MPI的多核计算机集群上。 它会跑很长一段时间 – 也许是几天 – 然后突然失败。 大多数工程师已经消除了程序本身出现任何错误的合理可能性,所以他们开始将责任归于可能的硬件问题,但是我怀疑在Linux内核模块或者设备中必定存在软件问题驱动程序。 令人怀疑的是内核模块或设备驱动程序为了执行一些浮点计算,正在以对SMP系统不安全的方式执行FXSAVE / FXRSTOR。 这可能与FXS​​AVE在需要重入的内核例程中的静态缓冲区一样简单。 这将创build一个竞争条件错误,很less会损坏线程的浮点上下文。 在应用程序层面,似乎发生的情况是MXCSR的一个或多个位(即FXSAVE / FXRSTOR上下文的一部分)突然更改,但没有应用程序代码可以对其进行更改。 我在Windows上遇到了类似的问题,最终在video驱动程序中出现了一个错误,例如当应用程序代码被操作系统抢占时,该线程上下文中的某些MXCSR位已损坏。 我不是Linux Kernel黑客或设备驱动程序开发方面的专家,但是我正在读的是重入规则已经发生了很大的变化。 在非SMP和SMP(多核)系统之间; 在内核版本之间; 等等。所以种族条件错误的可能性似乎是合理的。 所以我的问题是: 是否有任何已知的Linux驱动程序(或内核)错误符合该描述? 如果他们有类似的症状,我可以引用任何先例都是有帮助的。 在这一点上,很多涉及到的人都是(IMHO)浪费时间思考“好吧,我的代码中没有错误,所以它肯定是坏的硬件”。 我想让他们超越这个,寻找更有可能成为真正原因的东西。

编程USB传输电缆/与USB设备驱动程序交谈

如何以编程方式从Windows访问USB传输电缆(如Belkin的Easy Transfer电缆 )? 我熟悉libusb-win32 ,但从我所知道的情况来看,使用更新的设备和Windows Vista似乎很麻烦。 我知道Windows轻松传送可以做到这一点。 如何编写与Windows轻松传送function相同的代码? 如果没有关于如何做到这一点的jar头文件,我愿意做一些挖掘,但我不知道从哪里开始。 如何查看Windows Easy Transfer正在执行哪些操作? 我发现Windows甚至在设备pipe理器“传输电缆设备”中给出了自己的传输电缆类别。 我如何与这些驱动程序之一进行低级别的沟通?

编写一个模拟input设备的Windows驱动程序

我的应用程序需要performance为一个虚拟游戏杆(想象用鼠标拖动一个方块并将其转换为模拟游戏杆的输出),然后通过networking将一些击键发送到驱动程序将接收该input的另一台计算机。 我只需要支持XP,Vista和Win7。 也许这可以在不写驱动程序的情况下完成。 我尝试用SendKey()发送键击,似乎工作,但不知道如何模拟模拟操纵杆。 我已经下载了VDK,并且正在阅读关于这个主题的所有内容,但是还有很多东西我还是不明白。 你能指点我正确的方向吗? 我应该build立一个内核模式还是用户模式的驱动程序? 我的驱动程序可以作为networking上应用程序的服务器吗? 你知道很好的教程/书籍/样本,可以帮助我这个。 谢谢

虚拟networking接口的Windows

我正在开发各种VPN应用程序,需要虚拟networking接口(又名TUN / TAP)。 有没有这样的驱动程序可用于Windows? 我唯一知道的是OpenVPN,但它是GPLed,因此AFAIK不能用于闭源应用程序。 如果没有现成的解决scheme,我将不胜感激对自己编写这种野兽有多复杂(也可能从哪里开始)。 我发现了这个类似的问题 ,但是这个问题早在2008年。

便宜的Windows驱动程序签署64位Windows 7

我需要在Windows 7 64位机器上安装libusb-win32驱动程序。 这个驱动程序是开源的,所以它没有数字签名,所以我想自己做这个,但我不知道这是否可以付出很多钱。 是否可以使用未经Verisign或GlobalSign签名的证书? 也许自签名或通过使用StartSSL ? 如果是的话,我该怎么做呢? 根据一个关于x64内核驱动程序签名的实用真理 ,我必须使用“交叉证书”(微软列表中只有6个可用,大多数是不再活动的CA) 。 我不在乎用户是否面临警告信息。 我甚至可以接受,如果用户必须先安装一个特殊的CA证书。 我只要求驱动程序运行,而不必手动禁用每个Windows启动时的签名检查。

我在哪里可以得到Windows检查构build?

我正在开发一个文件系统驱动程序。 我使用免费的Windows作为目标机器。 如果我能得到Windows的检查版本,我想我会更方便。 不是吗 但我甚至不知道我在哪里可以得到它。 是否需要成本? 当我使用它时,我可以得到什么好处。

虚拟USB设备

我一直在search一个虚拟的USB存根。 这个想法是制作一个驱动程序,您可以使用通常来自USB控制器芯片的数据stream。 从Windows开始,它应该是透明的,所以当虚拟设备连接时,它会显示“正在安装新硬件”的泡泡等等。 我知道USB / IP开源项目,有没有其他的项目库?