Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel 平台设备/char设备的struct类和sysfs_Linux Kernel_Linux Device Driver - Fatal编程技术网

Linux kernel 平台设备/char设备的struct类和sysfs

Linux kernel 平台设备/char设备的struct类和sysfs,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,我创建了一个平台设备驱动程序,该驱动程序在启动时从设备树进行初始化。我想能够访问这个设备作为一个字符驱动程序也和我试图找出哪些结构条目,我应该使用 基本上,我希望我的设备(在设备树中使用从0x34000000开始的资源)在/dev/myDevice中显示为char设备 要做到这一点,我知道我需要使用dev\u t注册主要和次要号码。 1) 我可以在platform\u device->dev.devt中使用dev\t吗?如果可以,我仍然需要调用'alloc\u chrdev\u region',

我创建了一个平台设备驱动程序,该驱动程序在启动时从设备树进行初始化。我想能够访问这个设备作为一个字符驱动程序也和我试图找出哪些结构条目,我应该使用

基本上,我希望我的设备(在设备树中使用从
0x34000000
开始的资源)在
/dev/myDevice
中显示为char设备

要做到这一点,我知道我需要使用
dev\u t
注册主要和次要号码。 1) 我可以在platform\u device->dev.devt中使用dev\t吗?如果可以,我仍然需要调用'alloc\u chrdev\u region',还是由内核预初始化

目前我使用它,我仍然调用
alloc\u chrdev\u region
来初始化它,然后调用
cdev\u init
/
cdev\u add
来创建我的char设备

现在,我的设备显示在/dev中为/dev/340000000.myDevice

2) 为什么它会在前面显示它的内存资源

在阅读了一些内容之后,我决定尝试创建一个新类和一个新设备(看起来不太正确),以获得一个
/dev/myDevice
条目

我看到在
platform\u device->dev.class
中有一个
struct class*
字段

3) 我需要初始化这个字段还是由内核预初始化

4) 既然我已经初始化了一个设备(
struct platform\u device->dev
),为什么我需要用新的“struct class”调用
device\u create


dev\u t
cdev
class
之间的连接,以及它们与
平台设备
之间的关系,对我来说有点复杂。如果有人能帮忙解释,那就太好了。

cdev\u add&cdev\u del是低级的char框架。它们不提供创建设备节点的直接接口。相反,您必须使用
class\u create
device\u create
手动创建设备节点。否则,如果您的设备绑定到某些框架(如input、tty等),则注册到该框架将自动为您创建设备节点。永远不要直接弄乱总线基础设施的字段。为什么在创建PCIe模块时,我只需要使用cdev add,然后使用mknod来创建设备节点?
mknod
是一个从内核模块“外部”创建设备节点的实用工具。而
class\u create()
device\u create()
也会创建设备节点,但是,从内核模块的“内部”开始。首选方法是使用第二种方法。因此,从内核代码中,您可以依次调用
class\u create()
,然后调用
cdev\u add()
,然后调用
device\u create()
。我认为udev实际上是在使用device\u create创建的设备上调用mknod的?它不是使用规则从sysfs中获取主要和次要数字,然后调用mknod吗?如果是这种情况,那么在这两种情况下似乎都需要mknod。是的。你是对的。但是,作为开发人员,您不必担心内部问题。它将被自动处理。使用
class\u create()
device\u create()