![](https://img-blog.csdnimg.cn/direct/e89140613af44b489cae0863252877d9.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
第九期 | 设备模型
文章平均质量分 89
设备模型
北京迅为
让学习更简单,让开发更容易
展开
-
RK3568驱动指南|第九篇 设备树模型-第85章设备模型基本框架-kobject和kset
一个kobject可以有一个父kobject和多个子kobject,通过parent指针可以将它们连接起来形成一个层次化的结构,类似于目录结构中,一个目录可以有一个父目录和多个子目录,通过目录的路径可以表示目录之间的层次关系。对于一些常见的硬件设备,如USB、i2c和平台设备,内核已经提供了相应的设备模型和相关驱动,开发人员可以基于这些模型来编写驱动,从而更快地实现特定设备的功能,并且可以借助内核的电源管理和热插拔事件管理功能。通过kset和kobject之间的关系,可以实现对内核对象的层次化管理和操作。原创 2023-12-29 10:49:48 · 1117 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备树模型-第86章 创建kobject实验
本章介绍了两种创建kobject的方法,一种是使用kobject_create_and_add函数,另一种是使用kzalloc和kobject_init_and_add函数,还介绍了如何释放创建的kobject。最后,实验演示了将驱动程序加载到开发板上,并验证了创建的kobject是否成功。我们编写驱动代码演示如何在Linux内核模块中创建和管理kobject对象,其中包括俩种方法创建kobject对象,分别使用kobject_create_and_add和kobject_init_and_add函数。原创 2023-12-29 11:05:39 · 831 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备模型-第87章 创建kset实验
我们编写驱动代码,这段代码用于定义并初始化两个自定义内核对象 mykobject01 和 mykobject02,并将它们添加到一个自定义内核对象集合 mykset 中。代码中的注释对各个部分进行了解释,帮助理解代码的功能。通过演示实验现象,讲解了kset是一组kobject的集合,并解释了kobject在sys目录下生成的原因。iTOP-RK3568开发板【底板V1.7版本】\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动例程\。原创 2024-01-02 15:06:58 · 865 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备模型-第88章 为什么要引入设备模型
尽管在芯片原厂提供的BSP中已经实现了设备模型,但是了解这些概念可以帮助您更好地理解设备的工作原理,驱动程序的编写和设备的管理。设备模型的设计目的是为了提供一种统一的方式来管理和操作系统中的各种硬件设备。通过将设备、驱动和总线等概念进行抽象和标准化,设备模型可以提供一致的接口和数据结构,简化驱动开发和设备管理,并实现设备的兼容性和可移植性。设备模型在内核驱动中扮演着关键的角色,通过提供统一的设备描述和管理机制,简化了驱动的编写和维护过程,提高了代码的复用性和可维护性,并支持热插拔和动态资源管理等重要功能。原创 2024-01-02 15:19:30 · 995 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备模型-第89章 进一步探究设备模型
它通过调用kobject_set_name_vargs()设置kobject的名称,并将父节点赋值给kobject的parent字段。在第86章节实验中,我们创建了kobject。该函数分配了一个新的kobject结构体,并对其进行初始化,包括将kobject的name字段设置为传入的name参数,将kobject的parent字段设置为传入的parent参数。因此,可以说kobject是设备模型的基石,通过创建对应的目录结构和属性文件, 它提供了一个统一的接口和框架,用于管理和操作设备模型中的各个实体。原创 2024-01-02 15:42:44 · 980 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备模型-第90章 虚拟文件系统sysfs目录层次分析实验
当引入新的设备类型时,可以将其归类到现有的类别中,而无需修改现有的设备管理和驱动程序。每个设备子目录代表一个具体的设备,通过其路径层次结构和符号链接反映设备的关系和拓扑结构。2. 统一的接口和属性:每个设备类别目录下可以定义一组统一的接口和属性,用于描述和配置该类别下所有设备的共同特征和行为。这样,对于同一类别的设备,可以使用相同的方法和属性来操作和配置,简化了设备驱动程序的编写和维护。这样,相关类型的设备可以被放置在同一个类别目录下,使得设备的组织结构更加清晰和可管理。如果不使用类,使用以下命令。原创 2024-01-02 16:34:16 · 789 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备模型-第91章 什么是引用计数器
91.1 什么是引用计数器。引用计数器(reference counting)是一种内存管理技术,用于跟踪对象或资源的引用数量。它通过在对象被引用时增加计数值,并在引用被释放时减少计数值,以确定何时可以安全地释放对象或资源。引用计数器的基本原理如下:对象或资源被创建时,引用计数器初始化为1。当有新的引用指向对象或资源时,引用计数器增加。当引用不再指向对象或资源时(引用被删除、超出作用域等),引用计数器减少。原创 2024-01-02 16:42:06 · 818 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备模型-第92章 引用计数器实验
第二条打印为:“mykobject01 kref is 2”,因为在mykobject01目录下创建了子目录mykobject02,所以mykobject01的计数器值为2,mykobject02的计数器值为1,如下图所示的II。代码中的注释对各个部分进行了解释,帮助理解代码的功能和目的。如上图所示IV,如果在objectA下面创建俩个object,那么objectA的计数器值为3,在objectB下创建object,那么objectB的计数器值为2,objectC的计数器值为1。原创 2024-01-02 17:26:44 · 856 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备模型-第93章 kobject释放实例分析实验
kobject_create_and_add()函数首先调用 kobject_create()函数,该函数使用 kzalloc()为 kobject分配内存空间。接下来,kobject_create_and_add()函数调用 kobject_add()函数将 kobject添加到系统中,使其可见。kobject_add()函数内部调用了kobject_add_internal()函数,该函数负责将 kobject添加到父对象的子对象列表中,并创建相应的 sysfs 文件系统条目。原创 2024-01-03 11:01:02 · 777 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备模型-第94章 引入并完善kobject_type结构体
瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。【公众号】迅为电子。原创 2024-01-03 13:44:56 · 891 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备模型-第95章 创建属性文件并实现读写功能实验1
我们编写驱动代码,该代码创建了一个自定义的 kobject,并在 sysfs 中创建了两个属性——value1和value2,允许读取和写入这些属性的值。我们将深入研究一个代码示例,演示如何创建具有属性的自定义 kobject,使我们能够读取和写入值。iTOP-RK3568开发板【底板V1.7版本】\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动例程\。驱动加载之后,我们进入/sys/目录下,可以看到创建生成的myobject01,如下图所示。原创 2024-01-03 14:02:17 · 409 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备模型-第96章 优化属性文件读写函数实验
在上个章节中,我们创建具有属性的自定义 kobject,并且能够读取和写入值。我们可以通过属性文件实现用户空间和内核空间信息交换的功能。通过属性文件实现用户空间和内核空间信息交换,用户可以根据自己的需求自定义属性和操作,增强了系统的灵活性和可定制性。我们编写驱动代码,在驱动代码中,创建了一个自定义的 kobject,并在 sysfs 中创建了两个属性文件,并实现了读取和写入这些属性的功能。驱动加载之后,我们进入/sys/目录下,可以看到创建生成的myobject01,如下图所示。原创 2024-01-03 14:19:52 · 437 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备模型-第97章 创建属性文件并实现读写功能实验2
我们编写驱动代码,使用kobject_create_and_add函数创建了一个名为 "mykobject01" 的自定义 kobject,并在其中创建了两个属性文件 "value1" 和 "value2"。函数创建kobject,并创建了属性文件,实现了读写功能。我们可以使用echo和cat命令对属性值进行写入和读取,如下图所示,可以看到在写入和读取的过程中,会打印我们在内核中添加的打印。驱动加载之后,我们进入/sys/目录下,可以看到创建生成的myobject01,如下图所示。原创 2024-01-03 14:37:35 · 918 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备模型-第98章 创建多个属性文件的简便方法
在上一章节中,我们创建了一个属性文件,但是在情况中,我们可能需要创建N个属性文件,如果还按照上个章节的方法是非常麻烦的。在上述示例中,我们创建了一个名叫“my_group”的组,并将属性文件attr1和attr2添加到该组中,然后使用sys_create_group将该组添加到指定的kobject kobj中。接下来我们开始做实验。我们编写驱动代码,创建了一个名为 "mykobject01" 的自定义 kobject,并在其中使用上小节介绍的方式创建了两个属性文件 "value1" 和 "value2"。原创 2024-01-03 16:07:51 · 837 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备模型-第99章 注册一个自己的总线实验
在前面的章节中,我们学习了设备模型的基本框架kobject和kset。我们编写驱动代码,驱动中定义了一个名为 "mybus" 的自定义总线,并指定了该总线的匹配回调函数 mybus_match 和探测回调函数 mybus_probe。我们进入开发板的/sys/bus目录下,/sys/bus 是 Linux 系统中的一个目录,用于表示总线(bus)子系统的根目录。驱动加载之后,我们进入/sys/bus目录下,可以看到创建生成的总线mybus,如下图所示,我们进到mybus目录下,可以看到创建属性文件。原创 2024-01-03 16:40:51 · 884 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备模型-第100章 在总线目录下创建属性文件实验
现在,在本章节中,我们将继续深入了解总线的概念,并在总线目录下创建属性文件以扩展其功能。我们编写驱动代码,定义了一个名为 "mybus" 的总线,并实现了总线的匹配回调函数 mybus_match 和设备探测回调函数 mybus_probe。在创建属性文件时,还可以指定其他属性的回调函数,如 .show、.store等,以实现对属性值的读取和写入操作。驱动加载之后,我们进入/sys/bus目录下,可以看到创建生成的总线mybus,如下图所示,我们进到mybus目录下,可以看到创建属性文件value。原创 2024-01-03 17:46:23 · 905 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备模型-第101章 总线注册流程理论分析实验
通过sysfs,设备模型中的对象、属性和关系可以以目录和文件的形式在用户空间中表示。将priv结构体指针存储在当前注册的总线结构体的成员p中,目的是让当前注册的总线结构体能够快速地找到并访问与之关联的priv结构体。现在,在本章节中,我们将深入分析总线注册的流程,从代码的层面来理解总线的实现过程。那么什么是子系统呢?如上图所示,为什么在sys/bus目录下会生成mybus目录以及对应的devices,drivers,drivers_autoprobe,drivers_probe,uevent目录和属性呢?原创 2024-01-04 13:46:15 · 787 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备模型-第102章 platform总线注册流程实例分析实验
然后使用调用device_register(platform_bus_type) 注册平台总线设备,将platform_bus结构体注册到设备子系统中。然后使用bus_register(&platform_bus_type)函数注册平台总线类型,将 platform_bus_type 结构体注册到总线子系统中。如果匹配成功,则返回匹配(非零)。如果存在,则调用platform_match_id(pdrv->id_table, pdev)函数来检查设备是否与ID表中的任何条目匹配。原创 2024-01-04 13:51:51 · 760 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备模型-第103章 在总线下注册设备实验
我们编写驱动代码,定义了一个名为 "mybus" 的总线,并实现了总线的匹配回调函数 mybus_match 和设备探测回调函数 mybus_probe。现在,在本章节中,将继续构建在该总线上注册设备的流程。我们进入到/sys/bus/mybus/devices目录下,如下图所示,在总线下注册的设备为mydevice。我们编写驱动文件device.c,在驱动中,Linux内核中创建一个自定义设备并将其注册到自定义总线上。驱动加载之后,我们进入/sys/devices目录下,如下图所示,有注册生成的设备。原创 2024-01-04 14:04:18 · 790 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备模型-第104章 设备注册流程分析实验
5. sysfs_create_link(&bus->p->devices_kset->kobj, &dev->kobj, dev_name(dev)):在总线类型的设备集(devices_kset)的内核对象(kobj)下创建设备的符号链接。启动设备接下来的代码主要是处理设备的设备号(devt)相关操作,以及通知相关组件设备添加的过程。首先,代码将设备对象的kobj.kset成员设置为devices_kset,表示该设备对象所属的kset为devices_kset,即设备对象属于devices子系统。原创 2024-01-04 14:45:28 · 826 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备模型-第105章 platform总线设备注册流程实例分析实验
RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。在平台设备驱动中,我们使用platform_device_register函数注册平台总线设备。在上个章节中,我们详细分析了设备是如何注册到总线上的过程,在本章节中,我们将进一步探讨platform设备是如何注册到platform总线上的。【粉丝群】824412014(加群获取驱动文档+例程)到此,platform总线设备注册流程分析完毕。原创 2024-01-04 15:05:27 · 868 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备模型-第106章 为什么注册总线之前要先注册设备实例分析实验
在注册 platform 总线之前,需要先注册一个 platform bus 设备。这个 platform bus 设备充当了 platform 总线的代表,它是 platform 总线与设备之间的桥梁。通过注册 platform bus 设备,系统可以识别到 platform 总线的存在,并为后续的 platform 设备注册提供必要的基础。这样,当 platform 总线初始化时,它可以找到并识别这个 platform bus 设备,进而完成 platform 设备的注册和管理。原创 2024-01-04 15:35:41 · 973 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备模型-第107章 在自己的总线下注册驱动实验
我们编写驱动代码,这段代码的作用是注册一个驱动程序,该驱动程序属于名为"mydevice"的总线类型"mybus",并在探测设备时调用"mydriver_probe"函数,移除设备时调用"mydriver_remove"函数。我们进入到/sys/bus/mybus/devices目录下,如下图所示,在总线下注册的设备为mydevice。然后进入到/sys/bus/mybus/driver目录下,如下图所示,在总线下注册的驱动为mydevice。然后加载driver.ko驱动模块,如下图所示。原创 2024-01-04 15:49:52 · 835 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备模型-第108章 驱动注册流程分析实验
调用 driver_add_groups函数将驱动程序的组属性添加到驱动程序中。如果添加失败,则调用 bus_remove_driver函数移除已添加的驱动程序,并返回相应的错误码。在上面代码中,调用 bus_add_driver 函数将驱动程序添加到总线。一旦驱动程序的结构体和匹配信息准备就绪,我们就可以调用 driver_register() 函数将驱动程序注册到总线上。综上所述,driver_register函数的功能是注册设备驱动程序并将其添加到总线中,同时进行各种检查和错误处理操作。原创 2024-01-04 16:03:47 · 939 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备模型-第109章 probe函数执行流程分析实验
drv->bus->match(dev, drv)表示调用总线对象的 match函数,并将设备对象和驱动程序对象作为参数传递给该函数。总的来说, bus_for_each_dev() 函数主要是提供了一个遍历指定总线上的设备对象列表,并对每个设备对象进行特定操作的快捷方式,可以用于驱动程序中需要管理和操作大量设备实例的场景。这个函数的作用是遍历指定总线上的所有设备,并对每个设备执行指定的函数 fn。2. 如果 match`函数存在,则调用总线对象的 match函数,传入设备对象和驱动程序对象作为参数。原创 2024-01-04 17:31:57 · 929 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备模型-第110章 加载驱动和加载设备先后顺序分析实验
调用 bus_for_each_drv(dev->bus, NULL, &data, __device_attach_driver) 遍历总线上的驱动程序,并调用 __device_attach_driver 进行匹配。上述代码的作用是将驱动和设备进行绑定,首先,通过调用 device_is_bound(dev) 检查设备是否已经绑定了驱动程序。如果设备已经绑定了驱动程序,则返回1。bus_ probe_ device 函数,如下图所示,此函数中最重要的是device_initial_probe函数。原创 2024-01-05 17:38:42 · 884 阅读 · 0 评论 -
RK3568驱动指南|第九篇 设备模型-第111章 platform总线注册驱动流程实例分析实验
此行将指定的platform_drv_remove函数赋值给drv->driver.remove,表示驱动程序的移除函数。1 首先,将传递给驱动程序的设备指针 _dev 转换为 platform_driver 结构体指针 drv,将传递给驱动程序的设备指针 _dev 转换为 platform_device 结构体指针 dev。此行将指定的platform_drv_probe函数赋值给drv->driver.probe,表示驱动程序的探测函数。这个函数会根据设备的电源管理需求,将设备与相应的电源域进行关联。原创 2024-01-06 17:47:44 · 944 阅读 · 0 评论