Articles of 驱动程序

Linux:我的字符驱动程序在sysfs中创build一个节点,但在重新加载后无法清理

我正在写一个简单的字符驱动程序。 我使用device_create()在sysfs中创build节点,并正确创build它。 我也在/ dev中自动获取我的节点。 我的问题是,class_distroy()和device_destroy()不会清除在init上创build的/ sys / devices / virtual / tdmcdev / tdm /目录。 我的init和closures代码如下 … /* Node in the /dev/ */ tdm->dev_major = 0; //for dynamic major tdm_dev = MKDEV(tdm->dev_major, 0); tdm->dev_major = MAJOR(tdm_dev); err = alloc_chrdev_region(&tdm_dev, 0, 1, "tdm"); //One node to read/write data frame if (err) { printk("can't alloc minor for […]

如何从用户空间访问Linux内核中已注册的I2C器件

我希望能够修改I2C从设备中的寄存器。 该设备在内核中有一个驱动程序,驱动程序注册一个I2C客户端的地址。 驱动程序是非常基本的,并输出所有的设备function。 我想从用户空间访问寄存器,但是当我尝试使用I2C-dev访问寄存器时,出现错误 – 设备或资源忙碌。 我不想为驱动添加function,我更愿意编写用户空间应用程序来修改设备寄存器。 在这种情况下如何使用I2C-dev来修改寄存器?

为什么在rapberry pi驱动中有`gpio_request`而不是`request_region`?

在书LDD3中 ,如果一个驱动程序想要控制CPU的引脚,它应该调用request_region()函数来声明端口的使用情况。 然而,当我想在Raspberry Pi上实现一个简单的驱动程序模块时,我发现在这个例子中,端口的请求是由gpio_request()函数实现的。 为什么当我们需要使用gpio_request()而不是request_region() ? 而这两个函数有什么区别呢? 顺便说一句:我一页一页searchLDD3 ,但是我找不到关于GPIO任何线索……为什么没有任何GPIO介绍? 是因为2.6内核版本吗?

USB设备ID表的理解

我想了解linux内核初始化结构的不同方法。 在这个查询中,我写了一个示例USB驱动程序,但我不明白一些观点,指出前面的评论? static struct usb_device_id pen_table[] = //?? why pen_table is an array { { USB_DEVICE(0xaaaa , 0x8816) }, //??what type of array initialization is this {} /* Terminating entry */ //??how this terminates }; 我试图以这种方式初始化设备ID表,但我接近初始化错误 static struct usb_device_id pen_table = { .match_flags = USB_DEVICE_ID_MATCH_DEVICE, .idVendor=0xaaaa, .idProduct = 0x8816, };

RX / TX环和sk_buff之间的关系是什么?

我知道每个网卡都有RAM的RX / TX环,用于操作系统接收/发送数据包。 并且环中的一个项目(包描述符)包括数据包的物理地址,数据包的长度等等。我想知道这个描述符指向了sk_buff吗? 如果数据包是一个GSO数据包,会发生什么情况?这是真的,环中的一个描述符=一个数据包=一个sk_buff?

学习linux驱动

我现在正在学习编程驱动程序。 我正在从本书的Linux设备驱动程序中学习 但是我有点缺乏练习。 你能推荐我一些简单的项目,我可以开始。 或者一些新手可以理解正在发生的开源项目。 其他示例和教程将受到欢迎。 感谢帮助。

未能创build次要编号为0和1的设备

我无法在/ proc下创build两个小号为0和1的设备节点。 device_create创build次编号为0的第一个设备,但是如何创build次编号为1的第二个设备? static int __init my_driver_init (void) { int result; int major; printk("In init module"); result = alloc_chrdev_region(&dev, 0, 2, mydev_name); if (result<0) return result; major = MAJOR(dev); printk("The device is registered by Major no: %d\n", major); my_driver_cdev = cdev_alloc(); cdev_init (my_driver_cdev, &my_driver_fops); my_driver_cdev->owner = THIS_MODULE; result = cdev_add(my_driver_cdev, 0, 2); if (result<0){ printk("Error […]

我如何读取数据从条形码0,从用户空间,在Linux的PCIE卡?

在Windows上有这个程序叫做pcitree ,它允许你在不写设备驱动程序的情况下设置和读取内存。 是否有一个Linux的替代pcitree,将允许我读取我的pcie卡的块0内存? 一个简单的用例是我使用驱动程序代码在我的pci-e卡的第零块的第一个内存地址上写入一个32位整数。 然后,我使用pcitree替代读取块的第一个内存地址的值,并看到我的整数。 谢谢

更改PID / VID后,VCOM驱动程序无法工作

当使用Silicon Labs的CP2102 USB-UART桥接控制器时,我遇到了一个问题。 Silicon Labs提供了一个更改USB相关configuration值(PID,VID,设备描述…)的应用程序,所以我将VID值更改为由USB-IFpipe理分配给我的值。 所有字段似乎已经正确更新(我可以在设备pipe理器中看到),但是Windows报告没有可用的驱动程序。 在更改VID / PID和设备描述之前,一切运行良好。 任何想法如何告诉Windows像以前一样使用相同的驱动程序? 是否有可能,甚至可能是正常的驱动程序绑定到一个特定的VID / PID,并通过改变它,我基本上“打破”控制器,除非我写我自己的驱动程序? 操作系统:Windows 7 USB-UART控制器:Silicon Labs CP2102有关控制器的更多信息: http : //www.silabs.com/products/interface/usbtouart/Pages/usb-to-uart-bridge.aspx 提前感谢您的帮助。

文件筛选器驱动程序页面文件

我有一个文件filter驱动程序应该在特定情况下不允许文件/目录访问。 我使用IoRegisterFsRegistrationChange来获取有关文件系统更改的通知,并附加到适当的卷设备对象。 它通常是一个传递filter。 它唯一处理的是IRP_MJ_CREATE (实际上不允许某些types的文件/目录访问)。 所有其他IRP和快速I / O请求只传递给底层设备。 除了一件事情,它工作正常。 如果驱动程序在系统启动时加载( SERVICE_SYSTEM_START ) – 因为我不太明白系统页面文件被禁用。 用户login后会显示“性能选项”popup对话框。 虚拟内存分页文件被禁用(这是什么触发这个对话框popup恕我直言)。 如果驱动程序在后期dynamic加载 – 没有明显问题,一切正常。 我试图禁用处理IRP_MJ_CREATE (只是像所有其他请求传递),但没有任何改变。 我明白,通常很难说在没有看到代码的情况下问题出在哪里。 但无论如何,这是一个已知的问题? 我应该检查什么? 这是不是以适当的方式传递某些请求的症状,或者将设备对象附加到卷设备对象的偶然事实可能会导致这样的问题? 欢迎所有可能的想法。 提前致谢。