Articles of linux device driver

如何增加内核定时器的频率

我想测量我的驱动程序代码(Linux版本3.4)中的一些语句之间的时间。 我使用jiffieslogging计数器的开始和结束,然后转换为毫秒。 默认情况下, HZ值被定义为128 ,其精度仅为7毫秒 (即对于计数器中的每个增量1 ,相应的时间将增加7毫秒 ) 如果我把HZ的值增加到1000 ,我可以得到1ms的精度。 我应该修改内核代码中的一些语句。 到目前为止,我已经试过这些东西,但徒劳无功 在arch/arm/include/asm/param.h , 我replace了 #define HZ CONFIG_HZ 同 #define HZ 256 。 还有其他的陈述要修改吗?

我在哪里可以find/ dev / random驱动程序的源代码?

我想看看/ dev / random如何创build随机数字。 我知道它使用中断产生的熵,但我仍然希望看到源代码以及它是如何工作的。 谢谢

代码覆盖的Linux驱动程序工具

我正在寻找代码覆盖的工具,可以给Linux驱动程序的function和条件覆盖。 该工具应该生成html输出。 到目前为止,我一直在使用牛眼进行C ++应用程序。 但我无法find任何Linux内核模块。

for_each_online_cpu得到一个指向cpuinfo_x86的指针

linux内核的cpuinfo模块使用这段代码来获取一个指向cpu的指针: ssize_t seq_read(struct file *file, char __user *buf, size_t size, loff_t *ppos) { // (…) struct seq_file *m = file->private_data; void *p; // (…) p = m->op->start(m, &pos); 启动方法可以在proc.c中find: static void *c_start(struct seq_file *m, loff_t *pos) { *pos = cpumask_next(*pos – 1, cpu_online_mask); if ((*pos) < nr_cpu_ids) return &cpu_data(*pos); return NULL; } 在void*的指针已经从它返回之后,接下来传给show方法: err = […]

在Linux上debugging一个简单的字符驱动程序在device_create()上失败

我写了一个简单的字符驱动程序,现在想在udev中使用类自动注册它。 我的代码由驱动程序加载时调用的init函数和驱动程序加载其设备时调用的probe函数组成(当然还有它们的等价的exit和remove )。 问题:一旦添加新设备,执行device_create命令时,我的probefunction失败。 现在我想知道为什么: 我怎么能得到更多的信息,为什么这个命令失败(除了失败)? 缺less任何参数(比如我的全局声明fooClass是否存在问题,是否应该将其移至probe函数,而不是在我眼中做出反应,但在许多示例中显示)? 还是其他监督错误? 我的代码我剥离了大多数返回validation(如IS_ERR() )和清理function的可读性。 这两个variables是全局定义的: static int foo_majNbr; static struct class *fooClass; init函数: static int __init foo_init(void) { int rv; dev_t devNbr; /* Registering driver */ rv = pci_register_driver(&foo_driver); /* —-> see answer below for correct order <—- */ /* Create device class */ fooClass = class_create(THIS_MODULE, CLASS_NAME); /* […]

Linux内核模块编程:makefile

在学习Linux内核模块的同时,我可以看到两种方式来编写Makefile。 第一个是这样的: ifneq ($(KERNELRELEASE),) obj-m := module.o else default: $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules endif 后者不那么复杂: obj-m := module.o all: $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules makefile编译导致成功编译模块 。 我的学习伴随着LDD3书,至今我读到的是下一个: 这个makefile在典型的版本上被读取两次。 当从命令行调用makefile时,会注意到KERNELRELEASEvariables没有被设置。 它通过利用已安装模块目录中的符号链接构build指向内核构build树的事实来定位内核源代码目录。 如果你实际上没有运行正在构build的内核,你可以在命令行提供一个KERNELDIR =选项,设置KERNELDIR环境variables,或者重写在makefile中设置KERNELDIR的行。 一旦find内核源代码树,makefile会调用默认:target,它将运行第二个make命令(在makefile中参数化为$(MAKE))来调用内核构build系统,如前所述。 在第二次阅读时,makefile设置obj-m,内核makefiles负责实际构build模块。 如果makefile被读取两次,那么第二种方法应该导致recursion,不是吗?

在设备驱动程序中使用stdlib.h

我试图写一个设备驱动程序,我需要在驱动程序中使用system()函数。 要使用system()我们需要包含<stdlib.h> ,这个dosnt似乎是从驱动程序中运行的。 它说没有find这样的文件或目录。 是否有替代stdlib.h设备驱动程序? 或system()的替代?

i2c驱动程序是否需要像其他字符设备驱动程序一样执行?

我是Linux设备驱动程序的noob,所以请耐心等待。 我试图实现一个i2c驱动程序(客户端)。 这是我可以insmod , .probe被调用(因为设备树条目),并在.probe我可以读/写设备。 大。 不过,我需要能够从用户空间启动读取/写入驱动程序。 为了做到这一点,一个i2c驱动程序应该像任何其他字符设备驱动程序的形状? 意思是有一个file_operations结构,所以用户空间可以open , close , read , write和ioctls ? 我在问,因为在我见过的所有i2c客户端例子中,没有人实现我提到的这些东西。 我想知道他们如何发起呼叫从用户空间没有file_operations结构设置。 也许这是如此明显,没有人提到它,我不知道…我想知道是不是因为i2c被称为平台设备驱动程序,它不需要这个? 如果有人可以证实,将帮助我第二次猜测自己。 如果你明白我在问什么,请忽略其余部分。 如果你对我的问题感到困惑,这里是我所问的更具体的解释: 我现在所拥有的: static int device_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct device *dev = &client->dev; struct device_data *data; /* Check the functionality of the i2c-adapter for smbus byte read/write */ if (!i2c_check_functionality(client->adapter, […]

如何将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头文件?如果是,那么如何?

从内核读取使用procfs的时间戳 – 从内核读取后存储在哪里?

当中断发生在内核和如果我正在读取内核中的时间戳。 我正在通过procfs从内核读取用户的时间戳。 中断时间值将被存储在哪里? 用户应该如何从用户空间读取该值? ssize_t dev_read(struct file *filp,const char *buf,size_t count,loff_t *offset) { if ( count < sizeof(InterruptTime) ) { // Not enough space provided. return 0; // Or some error code maybe. } if (copy_to_user(buf,&InterruptTime,sizeof(InterruptTime)) { return -EFAULT; } else { return sizeof(InterruptTime); // Number of bytes we copied. } } 这是我在/linuxversion/net/core/dev.c中修改的代码 int netif_rx(struct […]