库存专业下的自定义字符设备 linux 模块(如 "tty")

Custom char device linux module under stock major (like "tty")

我正在编写我的第一个 linux 内核模块。它是通过 GPIO 引脚进行通信的标准字符设备。

它就像一个魅力。它在 /dev 下以其设备名称注册,在 /sys 下以我自己的 class 名称注册(它有一些属性可供主机应用程序配置)。

我的愿望是将我的设备移动到 /dev/tty//sys/class/tty/ 下。

我应该如何更改下面的代码来完成此操作?

非常感谢!

  // Allocate major device number

  majorNumber = register_chrdev(0, DEVICE_NAME, &devFileOps);

  if (majorNumber < 0)
  {
    kobject_put(dev_kobj);

    pr_crit(
      "%s/%s: failed to register a major number.\n", 
      CLASS_NAME, 
      DEVICE_NAME
    );

    return majorNumber;
  }

  pr_debug(
    "%s/%s: successfully registered with major number %d.\n", 
    CLASS_NAME,
    DEVICE_NAME,
    majorNumber
  );

  // Register device class

  devClass = class_create(THIS_MODULE, CLASS_NAME);

  if (IS_ERR(devClass))
  {
    unregister_chrdev(majorNumber, CLASS_NAME); 
    kobject_put(dev_kobj);

    pr_crit(
      "%s/%s: failed to register device class.\n", 
      CLASS_NAME,
      DEVICE_NAME
    );

    return PTR_ERR(devClass);
  }

  pr_debug(
    "%s/%s: device class successfully registered.\n", 
    CLASS_NAME, 
    DEVICE_NAME
  );

  // Register device driver

  devDevice = device_create(
    devClass, 
    NULL, 
    MKDEV(majorNumber, 0), 
    NULL, 
    DEVICE_NAME
  );

  if (IS_ERR(devDevice))
  {
    class_destroy(devClass);
    unregister_chrdev(majorNumber, CLASS_NAME);
    kobject_put(dev_kobj);

    pr_crit("%s/%s: failed to create the device.\n", CLASS_NAME, DEVICE_NAME);

    return PTR_ERR(devDevice);
  }

我认为您不能将其重命名为 /dev/tty 或已加载模块提供的任何其他 class。在调用 class_create().

时,任何尝试加载具有已存在的 class 名称的模块的尝试都将被拒绝

任何尝试 "chain on" 另一个模块到现有模块的尝试都会弄乱 owner.

file_operations 条目的关系

如果你真的想这样做并且不需要内置驱动程序,你可以配置一个没有安装 "conflicting" 驱动程序的内核,然后将你的模块命名为相同的名称并安装它。

如果您希望您的设备显示为 TTY,请将其实现为串行驱动程序,类似于 drivers/tty/serial. The kernel will apply the TTY layer 中的其他设备,它将显示为 TTY。