库存专业下的自定义字符设备 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。
我正在编写我的第一个 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()
.
任何尝试 "chain on" 另一个模块到现有模块的尝试都会弄乱 owner.
的file_operations
条目的关系
如果你真的想这样做并且不需要内置驱动程序,你可以配置一个没有安装 "conflicting" 驱动程序的内核,然后将你的模块命名为相同的名称并安装它。
如果您希望您的设备显示为 TTY,请将其实现为串行驱动程序,类似于 drivers/tty/serial
. The kernel will apply the TTY layer 中的其他设备,它将显示为 TTY。