Articles of linux device driver

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 […]

何时使用linux内核的add_timer vs queue_delayed_work

要在Linux内核驱动程序中安排稍后的操作,我有两个选项: add_timer queue_delayed_work 我所知道的一个区别是:对于计时器,您需要指定计时器到期时的jiffies值,因为延迟工作,您需要指定jiffies的延迟。 我一直在阅读有关定时器和work_queue的其他问题 ,并提到定时器在stream程上下文之外运行。 这与延误工作有何不同? 另外我知道定时器有一个问题,在计算expires ,可能会发生数值溢出,所以计算的值比当前的jiffies小,定时器立即过期(纠正我,如果我在这里错了)。 迟到的工作是否遭受同样的问题? 如果是这样,怎么办 对我来说,使用延迟工作似乎更容易(因为工作不是定期的)。 但是使用定时器有什么缺点? 编辑我做了一些进一步的研究。 看来queue_delayed_work只是add_timer内部使用add_timer 。 所以我的新问题是,如何正确处理定时器的溢出问题? 例如,我如何设置一个计时器/ delayed_work延迟10分钟?

linux一次读取一个大于4KB的块(或每块4KB)是正常的吗?

我正在写一个networking连接的硬盘驱动器的设备驱动程序,我的问题是,我可以看到,Linux发送请求到我的块设备,超过了典型的4KB请求。 其实我可以注意到的是 它先发送一个4kB的请求,然后第二个请求的大小是8KB,然后是16KB,依此类推。 有什么办法可以禁止这种行为,限制Linux一次发送4KB的请求吗? 或者在我的代码中这是不好的? 我如何计算请求总大小:我有扇区大小设置为512字节。 当我根据任何请求调用blk_rq_sectors ,我会得到该请求中所述的扇区数。 有时,我看到请求包含8,16,32或64个扇区。 谢谢。

ioread32后跟iowrite32没有给出相同的价值

我已经开始学习Linux设备驱动程序。 我正在做一些示例程序作为我学习的一部分。 为了理解内存映射IO,我写了下面的代码(这里只显示init)。 没有硬件映射在基地址。 static unsigned long base = 0xfed00000; unsigned long device_base=0; unsigned long virtual_base=0; static int __init sharedirqmodule_init(void) { u32 register1=0; u32 value=0x23456789; device_base=base; void *address=0; if(!request_mem_region(device_base,8,"device")) return -ENODEV; virtual_base = (unsigned long) ioremap(device_base, 8); address=(void *)virtual_base; printk(KERN_ERR "Sharedirq : Address value: %lx\n",address); iowrite32(value,address); wmb(); register1=(u32)ioread32(address); rmb(); printk(KERN_ERR "Shared irq :value: %d \n",register1); […]

有关内核中的workqueue的一些标志

我正在处理Linux内核2.6.36中的并发pipe理工作队列。但是我对一些标志感到困惑。 WQ_HIGHPRI WQ_UNBOUND WQ_RESCUER WQ_CPU_INTENSIVE 我创build了一个带有标志WQ_HIGHPRI工作队列,并将一些工作项目(例如w1 w2 w3 w4,按顺序)排队,这四个工作项目都不会进入hibernate状态。 4个工作项是否由同一个线程执行,在这种情况下是否创build了任何线程? 在上面的情况下,如果使用WQ_UNBOUND ,是否有区别? 因为如果你设置了WQ_UNBOUND ,那么内核将设置WQ_HIGHPRI 。 先谢谢你。

在Linux上直接控制HCI设备(绕过蓝牙驱动程序)

我需要直接控制一个HCI设备,而不需要Linux驱动程序/内核干扰。 例如,当创build到外设的LE连接时,驱动程序正在独立地发送“LE连接更新”命令,我想避免这种情况。 我虽然有两种方法来解决这个问题: configuration蓝牙驱动程序以某种方式禁用对HCI设备的干扰(类似于hciattach上的-r标志),然后使用常规的AF_BLUEOOTH套接字来控制HCI设备。 禁用这个特定的HCI设备,但保留父字符设备并直接连接到它。 到目前为止,我还没有成功find如何实施这些方法的方法。 我还应该提到,我仍然需要一个不同的HCI设备来“正常”地使用系统,所以完全禁用蓝牙驱动程序不是一个select。

P1010 MAC切换端口直接连接,无需PHY

我有一个带有freescale P1010处理器的定制板,其中P1010的eTSEC2(增强型3速以太网控制器)端口在SGMII模式下直接连接到Marvell 88E6046以太网交换机端口9。 Linux(3.17)DSA驱动程序能够探测和检测交换机(端口9是'cpu',而端口0和1被指定为'lan1'和'lan2')。 然而问题是没有交换机连接的PHY('ifconfig up'无法连接到ethx)。 U-boot创build一个'通用PHY'eth0,因为它发现有一些(交换机)连接到处理器P1010,但是当Linux启动并且交换机连接到这个“通用PHY”(eth0)时,我无法ping通它(lan1或lan2,虽然DSA链接了)。 我能想到这个行为有两个原因。 交换机端口9直接连接到处于SGMII模式下的处理器MAC,但两者之间没有任何外部PHY。 即使在直接连接交换机时,也不会在“反向MII”模式下进行configuration,因此端口9的内部PHY不会被检测到。 鉴于上述情况,以太网交换机仍然可以使用DSA驱动程序? 另外我尝试使用处理器的内部PHY将其附加到eth0,但不能。 不知何故,以太网驱动总是find外部物理层,而没有。 即使在dts文件中定义了“固定链接”属性,它也不会查找内部PHY。 另外在我的devise中, MDC和MDIO线路的处理器都连接到Switch。 在处理器切换无PHY MAC-MAC连接,它创build2硕士? 如果这些被断开? 是否因为MDC / MDIO连接,我无法访问P1010处理器的内部PHY?

char设备在cdev_add()成功注册到117上的major后出现在哪里?

我写了基本的字符驱动程序。 使用cdev_alloc,cdev_init,cdev_add完成了使用内核注册char设备。 less校= 117,轻微= 1。 cdev_add函数重试成功。 我正在试图检查是否创build的字符设备。 我没有find任何设备下的主要没有117 / dev /或/ dev / char。 register_chrdev不会被用在最新的内核里,我们给NAME。 但是cdev_add只使用主数字来执行内核的char设备注册。 我对最新的内核行为感到困惑。 我是否需要使用register_chrdev和cdev_add? 或者我需要使用mknod commad来在/ dev /中显示设备? 谢谢。