【问题标题】:How to associate the device in /dev/ with the actual driver如何将 /dev/ 中的设备与实际驱动程序相关联
【发布时间】:2009-10-06 09:01:37
【问题描述】:

我正在尝试了解设备驱动程序在 linux 中的工作原理。

  1. 我有一个设备节点如下(主编号89,设备名称i2c-0)

     crw-r--r--    1 0        0         89,   0 Sep 29 01:36 /dev/i2c-0
    
  2. 我有名为i2c.ko 的i2c 驱动程序,我将在启动过程中使用insmod i2c.ko

  3. 在驱动中,初始化时会调用如下函数:

    register_chrdev(89, "i2c", &i2chtv_fops)<0    // not "i2c-0"
    

我的问题是:当用户调用open("/dev/i2c-0", O_RDWR) 时,内核如何知道要使用哪个驱动程序?我注意到设备名称是i2c-0,但注册的设备名称是i2c。是否因为它们使用相同的主编号,内核才能使用正确的驱动程序?

【问题讨论】:

    标签: linux embedded device-driver


    【解决方案1】:

    主设备号告诉您哪个驱动程序处理哪个设备文件。次要编号仅由驱动程序本身用于区分它在哪个设备上运行,以防驱动程序处理多个设备。

    将驱动程序添加到您的系统意味着将其注册到内核。这与在模块初始化期间为其分配主编号相同。您可以使用 linux/fs.h 定义的 register_chrdev 函数来完成此操作。

     int register_chrdev(unsigned int major, const char *name,
           struct file_operations *fops); 
    

    其中 unsigned int major 是您要请求的主要号码, const char *name 是设备的名称,因为它将出现在 /proc/devices 和 struct file_operations *fops 是指向您的文件操作表的指针司机。负返回值表示注册失败。请注意,我们没有将次要编号传递给 register_chrdev。那是因为内核不关心次要号码。只有我们的司机使用它。

    来自here

    【讨论】:

      【解决方案2】:

      是的,主要数字选择驱动程序,次要数字选择“单位”(无论是什么;对于控制台驱动程序,它是不同的屏幕)。

      您看到的-0 是“单元”(如果您的系统中有多个 i2c 总线)。

      【讨论】:

      • 我们的系统中有两条 i2c 总线。并为他们使用了两个不同的主要号码。这不是标准的方法吗?注册的设备名称(register_chrdev调用中的名称)有什么用?
      • 这取决于。如果使用次要编号,则必须管理代码中的单位。如果您使用两个主设备号,那么内核将为您分配两个不同的设备结构。所以后者会让事情变得更简单,前者会让你从系统中挤出更多字节的空闲 RAM(如果你的“单元”处理代码足够小的话)。
      猜你喜欢
      • 1970-01-01
      • 2013-04-26
      • 1970-01-01
      • 2011-04-26
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      相关资源
      最近更新 更多