Articles of 驱动程序

如何为平台驱动程序正确初始化属性组?

编辑#4:我想,我不应该将attr_groups分配给struct platform_driver结构的driver字段中的groups字段。 寻找评论/* WRONGO: should not be assigned here. */ /* WRONGO: should not be assigned here. */下面。 我还没有想出我应该把它分配到哪里… 我的平台驱动程序的代码在读取sysfs属性时,由于NULL引用而导致内核“OOPS”。 我确定这是一个简单的监督下面的代码,但我看不到它: … static int samples_per_frame = SAMPLE_CHANNEL_COUNT; DEVICE_INT_ATTR(samples_per_frame, S_IRUGO | S_IWUSR, samples_per_frame); static struct attribute *attrs[] = { &dev_attr_samples_per_frame.attr.attr, NULL, }; static struct attribute_group attr_group = { .attrs = attrs, }; static const struct attribute_group […]

I2C_SLAVE ioctl的用途

我正在编写代码来实现一个简单的i2c读/写function,使用一般的linux i2c驱动程序linux/i2c-dev.h 我对ioctl : I2C_SLAVE感到困惑 内核文档说明如下: 您可以使用read(2)和write(2)调用来执行简单的i2c事务。 你不需要传递地址字节; 而是在尝试访问设备之前通过ioctl I2C_SLAVE进行设置 但是,我正在使用ioctl I2C_RDWR ,我再次使用i2c_msg.addr设置从站地址。 内核文档还提到了以下内容: 一些ioctl()调用是用于pipe理任务的,由i2c-dev直接处理。 例子包括I2C_SLAVE 那么是否必须使用ioctl I2C_SLAVE ? 如果是这样,我只需要设置一次或每次执行读取和写入? 如果我有一个i2c设备,我可以刚刚在设备上testing代码,不会打扰你们,但不幸的是我现在没有一个。 谢谢您的帮助。

HR定时器精确度研究案例

有了这个话题,我会更好地讨论人力资源计时器和真正的精确度问题。 我研究了大量关于它们的文档,我确信它们是在Linux内核模块中延迟执行问题的最好和最可靠的解决scheme,CPU成本较低,时序精度更高(例如一些时间关键驱动程序使用它们,就像这个https://dev.openwrt.org/browser/trunk/target/linux/generic/files/drivers/pwm/gpio-pwm.c?rev=35328 )。 你也适合吗? 这是我见过的最全面和最详细的文档之一: https : //www.landley.net/kdocs/ols/2006/ols2006v1-pages-333-346.pdf 。 人力资源计时器承诺在jiffies的决议下,但不幸的是,在我的系统,我没有得到低于6毫秒的延迟的预期结果(我会稍后显示更多的细节)。 我的环境是: Windows 10 PRO 64位/ 8Gb RAM / CPU Intel 4 Core VMWare播放器12 虚拟化操作系统Linux Mint 18.1 64位 内核configuration 版本:4.10.0-24 – 通用 CONFIG_HIGH_RES_TIMERS = Y CONFIG_POSIX_TIMERS = Y CONFIG_NO_HZ_COMMON = Y CONFIG_NO_HZ_IDLE = Y CONFIG_NO_HZ = Y CONFIG_HZ_250 = Y CONFIG_HZ = 250 / sys / […]

最好的Linux文件系统filter选项?

我需要一个Linux文件系统filter来强制执行文件系统调用的ACL策略(允许/拒绝读/写基于运行时计算的东西)。 到目前为止,我偶然发现了DazukoFS和相关的工作 。 我不喜欢DazukoFS的是,它必须为每个内核版本进行编译。 有一些用户模式库可以dynamic地过滤文件系统调用吗? 如果没有,是否有一些内核模式库可以dynamic地过滤FS调用,而不是为每个内核版本编译? 如果没有, DazukoFS和其他的最好的select是什么?

将驱动程序编译为内核的一部分,而不是作为模块

我正在尝试为embedded式设备创build一个简约的Linux。 这意味着编译内核和驱动程序的必要性。 一个驱动程序是由它的创build者直接写入设备板,所以它不是一个存储库。 它可以被编译为一个内核模块。 但是由于Linux不可变的性质以及对内存使用量极小的要求,我不想使用模块。 我想要内核中的所有驱动程序。 所有提供的内核驱动都是这样设置的。 所以我的问题是如何编译一个特殊的驱动程序到内核? 所有的search都没有给我提供一个解决scheme – 所有的只是作为模块编译。 谢谢你的帮助。

Linux内核:udelay()返回太早?

我有一个需要微秒延迟的驱动程序。 要创build这个延迟,我的驱动程序正在使用内核的udelay函数。 具体来说,有一个调用udelay(90): iowrite32(data, addr + DATA_OFFSET); iowrite32(trig, addr + CONTROL_OFFSET); udelay(30); trig |= 1; iowrite32(trig, addr + CONTROL_OFFSET); udelay(90); // This is the problematic call 我们有设备的可靠性问题。 经过大量的debugging,我们追溯到90us之前的驱动程序恢复的问题。 (请参阅下面的“certificate”。) 我在英特尔奔腾双核(E5700)上运行内核版本2.6.38-11-通用SMP(Kubuntu 11.04,x86_64)。 据我所知,该文件指出,udelay将延迟执行至less指定的延迟,是不可中断的。 这个版本的内核有bug吗,还是误解了udelay的使用? 为了说服自己这个问题是由udelay返回太早造成的,我们给一个I / O端口提供了一个100kHz的时钟,并实现了我们自己的延迟,如下所示: // Wait until n number of falling edges // are observed void clk100_delay(void *addr, u32 n) { int i; […]

我需要在Linux 3.12驱动程序中“启用”PCIe内存区域吗?

我有我的PCIe驱动程序(松散地基于这篇文章 )的probe()函数调用的代码: 编辑: 基于Andreas Bombe的回应,我改变了代码使用pci_iomap() ,但我仍然体验系统挂起 static my_pci_dev pci_dev; /* local structure */ static int pci_setup_region(struct pci_dev *dev) { int bar = 0; pci_dev.physical.addr = pci_resource_start(dev, bar); pci_dev.physical.size = pci_resource_len(dev, bar); pci_dev.virtual.addr = pci_iomap(dev, bar, pci_dev.physical.size); if (NULL == pci_dev.virtual.addr) { return -ENOMEM; } else { pci_dev.virtual.size = pci_dev.physical.size; } printk(KERN_ALERT "Virtual address: %p", pci_dev.virtual.addr); […]

为什么没有Linux的DirectX API?

考虑到现代video卡的Windows系统上的DirectX API的驱动程序端实现,我想知道为什么这个实现在非Windows系统,特别是Linux上不可用。 由于这个function显然不存在,我只能假定我有一个很好的理由,但是在我原始的理解中,我只是将DirectX调用看作硬件设备上的函数入口点。 而对于logging来说,我并不是指兼容性层(最值得注意的是WINE,一个我每天都为之惊叹的项目),而是一个直接硬件调用的库。 是否有可能创build一个开放源代码版本的DirectX? 这是可能的,但是很难实现吗?

如何编写Linux驱动程序模块调用/使用另一个驱动程序模块?

我正在开发一个Linux驱动程序可加载模块,我必须在我的驱动程序中使用另一个设备(驱动程序堆叠在另一个驱动程序上) 如何在我的驱动程序中调用/使用另一个驱动程序? 我认为他们都在内核中,所以可能有一种方法可以直接使用另一个驱动程序。

将物理地址映射到虚拟地址linux

我正在研究一个小型的embedded式系统。 当我的Linux启动到用户空间,我知道我的设备在物理内存中。 我想将它们映射到用户空间虚拟地址。 目前,我正在通过一个内核模块来做这件事。 我使用vmalloc / kmalloc(取决于大小),然后在返回的虚拟地址上使用ioremap_page_range来映射我的物理地址。 我不认为这是正确的方式去。 首先我分配内存,然后我要求内核重新映射虚拟地址空间到一些不同的物理地址空间。 (最初在vmcall / kmalloc中映射物理 – >虚拟是有用的,因为我不关心这些物理页面,这绝对不是好的。 有没有更好的方法将已知的物理内存映射到用户空间进程。 (我知道除了我的用户空间的过程,没有人会去触及那个记忆。) 谢谢