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)浪费时间思考“好吧,我的代码中没有错误,所以它肯定是坏的硬件”。 我想让他们超越这个,寻找更有可能成为真正原因的东西。

获取与COM端口相关的设备/驱动程序信息?

我有一个串口到USB设备,在Windows设备pipe理器中有一个类似命名的设备驱动程序。 在系统启动时,设备并不总是占用相同的COM端口,所以我的程序需要在启动时识别它。 我已经尝试使用RXTX来枚举系统上的COM端口,但是这不起作用,因为CommPortIdentifier.getName()只是返回COM名称(例如COM1,COM2等),我需要获取驱动程序制造商名称或设备pipe理器中显示的驱动程序名称,并将其与COM名称相关联。 这可以轻松地在Java中完成吗? (我会对任何支持这个的第三方Java库感兴趣。)否则,我怎样才能通过win32 API来完成这个任务呢?

Windows驱动程序时间戳function

我正在修改现有的Windows内核设备驱动程序,并在那里我需要捕获一个时间戳。 我打算使用time.h库并调用clock()函数来获取,但是在windows visual studio下,链接失败。 所以我把它作为一种手段,我需要在司机的图书馆工作。 我发现了下面的函数,KeInitializeTimer和KeSetTimerEx,但是如果我打算设置一个计时器并将其唤醒,则会使用这些函数。 我真正需要的是能给我一个时间戳的东西。 有任何想法吗?

为什么在Windows SDK中找不到cfgmgr32.lib?

我正在尝试使用Configuration Manager API,例如CM_Get_Device_ID 。 文档说链接到cfgmgr32.lib 。 但是,当我这样做时,我从链接器中收到一条错误消息: 错误1错误LNK1104:无法打开文件'cfgmgr32.lib' 我无法在Windows SDK中的任何位置findcfgmgr32.lib 。 如果我离开cfgmgr32.lib我得到未解决的外部符号错误。 我如何使用Configuration Manager API?

如何从USB读取没有任何驱动程序?

我们正在创build具有GPS接收器和PC的小型系统。 我们要testing我的GPS接收器,我们不想一路去找司机。 首先,我想testing我的电路工作还是不。 GPS IC已设置为输出NMEA句子。 我们需要一个只从USB端口读取数据并将其打印在屏幕上的程序。 我们可以轻松地写这样的东西吗? 我们有没有开源工具可以达到这个目的? 平台:Windows 7

如何用cat文件安装驱动程序?

我有内核驱动程序。 在32位系统和Windows XP及更低版本上安装时,我没有任何问题,并且使用了SetupCopyOEMInf,但需要对64位驱动程序进行签名。 我已经签署了,我需要有一个猫的文件与驱动程序复制在计算机上的某个地方,这种安装方法不起作用。 我应该如何安装? 编辑:澄清的问题。

在Windows下重命名USB HID设备

我为使用通用HID类的USB设备编写了一个固件,用于与主机进行通信。 将设备连接到PC时,会显示固件中的硬编码string,但在驱动程序安装结束后(使用通用Windows驱动程序),设备名称将更改为通用的“USBinput设备”。 我如何重新命名设备?