当前位置: 首页 > news >正文

做弩的网站河北seo网络优化培训

做弩的网站,河北seo网络优化培训,济南高新区 网站建设,seo关键词优化软件手机文章目录 1.平台总线介绍1.1平台总线模型的组成部分1.2平台总线模型的优势 2.使用平台总线模型开发驱动2.1注册platform设备2.2注册platform驱动2.3效果演示 1.平台总线介绍 Linux 平台总线模型(Platform Bus Model)是一种设备驱动框架,用于…

文章目录

    • 1.平台总线介绍
      • 1.1平台总线模型的组成部分
      • 1.2平台总线模型的优势
    • 2.使用平台总线模型开发驱动
      • 2.1注册platform设备
      • 2.2注册platform驱动
      • 2.3效果演示

1.平台总线介绍

Linux 平台总线模型(Platform Bus Model)是一种设备驱动框架,用于处理那些没有标准总线(如 PCI、USB 等)的嵌入式设备。它为这些设备提供了统一的设备驱动模型,简化了设备驱动程序的编写和管理。

1.1平台总线模型的组成部分

平台总线模型主要由以下几个组成部分构成:

  1. 平台设备(Platform Device)
  2. 平台驱动(Platform Driver)
  3. 平台总线(Platform Bus)

平台设备(Platform Device)

平台设备表示硬件设备,它们通常通过设备树(Device Tree)或者板文件(Board File)进行描述。平台设备通常包括设备名称、资源(如 I/O 端口、内存区域、中断号等)以及其他平台数据。

平台驱动(Platform Driver)

平台驱动是与平台设备匹配并管理这些设备的软件模块。平台驱动提供了 proberemove 函数,用于设备的初始化和清理。

平台总线(Platform Bus)

平台总线在内核中自动管理,不需要显式地定义。它用于匹配平台设备和平台驱动。

在这里插入图片描述

1.2平台总线模型的优势

平台总线模型(Platform Bus Model)在 Linux 内核中的引入为嵌入式设备和驱动程序的开发带来了多项显著的优势。以下是平台总线模型的一些主要优势:

  1. 抽象和统一的设备管理

平台总线模型为没有标准总线的设备提供了统一的抽象和管理方法。通过统一的接口和机制,开发者可以更容易地管理和控制不同类型的设备,无需考虑底层硬件差异。

  1. 简化驱动开发

通过使用平台总线模型,驱动程序开发者不再需要为每种硬件设备编写特定的初始化和资源管理代码。平台设备和平台驱动的标准化接口使得驱动程序的开发和调试更加简单和一致。

  1. 设备树支持

平台总线模型支持设备树(Device Tree),这是一种硬件描述语言,广泛用于描述嵌入式系统中的硬件配置。设备树使得硬件配置从代码中分离出来,可以通过修改设备树文件而不是驱动代码来适应不同的硬件配置,极大地提高了代码的可维护性和可移植性。

  1. 自动匹配和管理

平台总线模型通过内核自动完成平台设备和平台驱动的匹配和管理。这意味着驱动程序不需要显式地查找和初始化设备,内核会自动调用合适的 proberemove 函数来管理设备的生命周期。

  1. 资源管理

平台总线模型提供了简化的资源管理机制。平台设备可以通过设备树或板文件描述其所需的资源(如 I/O 端口、内存区域、中断号等),驱动程序可以通过标准接口获取和使用这些资源,避免了手动管理资源的复杂性和潜在错误。

  1. 模块化和可移植性

通过将硬件特定的配置与驱动代码分离,平台总线模型提高了驱动程序的模块化和可移植性。驱动程序可以更容易地在不同的硬件平台之间移植,只需调整设备树或板文件中的硬件配置即可。

  1. 代码重用

由于平台总线模型提供了标准化的接口和机制,不同驱动程序之间可以共享通用的代码和逻辑。这种代码重用不仅减少了开发时间和成本,还提高了代码的稳定性和可靠性。

8. 内核维护

平台总线模型的标准化和统一管理机制使得内核代码更易于维护和升级。通过减少硬件特定的代码和逻辑,内核开发者可以更专注于改进和优化内核的通用部分,提高内核的整体性能和稳定性。

2.使用平台总线模型开发驱动

2.1注册platform设备

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/uaccess.h>
#include <linux/device.h>
#include <linux/semaphore.h>
#include <linux/timer.h>
#include <linux/atomic.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/gpio.h>// 描述硬件资源 结构体数组
static struct resource my_device_resources[] = {{.start = 0x12340000,.end = 0x123400FF,.flags = IORESOURCE_MEM,},{.start = 5,.end = 5,.flags = IORESOURCE_IRQ,}};
void my_device_release(struct device *dev)
{printk("This is my device release");
}static struct platform_device my_platform_device = {.name = "my_platform_device",.id = -1,.num_resources = ARRAY_SIZE(my_device_resources),.resource = my_device_resources,.dev = {.release = my_device_release},
};static int __init platform_device_init(void)
{platform_device_register(&my_platform_device);printk("platform_device_init!");return 0;
}static void __exit platform_device_exit(void)
{platform_device_unregister(&my_platform_device);printk("platform_device_exit!");
}module_init(platform_device_init);
module_exit(platform_device_exit);
MODULE_AUTHOR("Marxist");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("a simple of platform_device");

其中有两个关键的结构体 platform_deviceresource

struct platform_device 功能描述

platform_device 结构体表示一个平台设备,它包含了设备的名称、资源、设备数据以及其他属性。这个结构体在平台总线模型中非常重要,用于描述那些没有标准总线(如 PCI、USB 等)支持的嵌入式设备。

struct platform_device {const char *name;                     // 设备名称int id;                               // 设备ID,通常用于区分同名设备struct device dev;                    // 嵌入的设备结构体u32 num_resources;                    // 资源数量struct resource *resource;            // 指向资源数组的指针const struct platform_device_id *id_entry; // 设备ID表char *driver_override;                // 用于覆盖默认的驱动程序
};

主要字段解释

  • name: 设备的名称,用于匹配设备和驱动程序。
  • id: 设备ID,用于区分具有相同名称的多个设备。通常设置为 -1。
  • dev: 嵌入的 struct device 结构体,表示通用设备结构,包含设备的通用属性和方法。
  • num_resources: 资源数量,表示设备所使用的资源数量。
  • resource: 指向资源数组的指针,资源数组包含了设备所使用的各种资源(如内存、I/O 端口、中断等)。
  • id_entry: 指向设备ID表的指针,用于在驱动程序中匹配特定的设备。
  • driver_override: 用于指定一个特定的驱动程序覆盖默认的驱动程序。

一般只需要关注name,id, dev,以及使用的资源描述

struct resource 结构体描述

resource 结构体描述了设备使用的硬件资源,例如内存地址范围、中断号等。每个设备可以有多个资源,这些资源通过 platform_device 结构体中的 resource 字段进行管理。

struct resource {resource_size_t start; // 资源的起始地址resource_size_t end;   // 资源的结束地址const char *name;      // 资源的名称unsigned long flags;   // 资源的类型和属性struct resource *parent, *sibling, *child; // 资源树结构中的节点关系
};

主要字段解释

  • start: 资源的起始地址或起始值,例如内存映射地址的开始位置。
  • end: 资源的结束地址或结束值,例如内存映射地址的结束位置。
  • name: 资源的名称,用于识别资源。
  • flags: 资源的类型和属性,通过标志位表示。例如,IORESOURCE_MEM 表示内存资源,IORESOURCE_IRQ 表示中断资源。
  • parent: 指向父资源的指针,用于构建资源层次结构。
  • sibling: 指向兄弟资源的指针,用于构建资源层次结构。
  • child: 指向子资源的指针,用于构建资源层次结构。

编译加载之后,就会在 /sys/bus/platform/devices/ 下注册新的设备

在这里插入图片描述

2.2注册platform驱动

#include <linux/init.h>
#include <linux/module.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/mod_devicetable.h>
static const struct platform_device_id driver_id_table[] = {{ .name = "my_platform_device" },{ } // 结尾必须有一个空的元素
};
static int my_platform_driver_probe(struct platform_device *dev )
{printk("my_platform_driver_probe");// 通过 probe 函数 拿到硬件资源描述, probe函数将传递 platform_device结构体函数struct resource *res;int irq;//获取内存资源res = platform_get_resource(dev,IORESOURCE_MEM,0);printk("IORESOURCE_MEM start addr is %x ",res->start);//获取中断资源res = platform_get_resource(dev,IORESOURCE_IRQ,0);printk("IRQ number is %d ",res->start);//获取完资源进行下一步的操作return 0;
}
static int my_platform_driver_remove(struct platform_device *dev )
{printk("my_platform_driver_remove");return 0;
}static struct platform_driver my_platform_driver = {.probe = my_platform_driver_probe,.remove = my_platform_driver_remove,.driver = {.name = "my_platform_device", // 平台设备名一致.owner = THIS_MODULE,},.id_table = driver_id_table, // id_table 的优先级更高
};
static int __init platform_driver_init(void)
{int ret = platform_driver_register(&my_platform_driver);if (ret)printk(KERN_ALERT "Failed to register platform driver\n");elseprintk( "platform_driver_init!\n");return ret;
}
static void __exit platform_driver_exit(void)
{platform_driver_unregister(&my_platform_driver);printk(KERN_ALERT "platform_driver_exit!\n");
}
module_init(platform_driver_init); 
module_exit(platform_driver_exit);
MODULE_AUTHOR("Marxist");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("a simple of platform_driver");

我们只需要注册驱动即可,重点为platform_driver结构体

platform_driver结构体为 Linux 内核中用于描述和管理平台驱动程序的一个重要结构体。它定义了驱动程序的主要回调函数和一些元数据,这些信息允许内核在设备插入和移除时正确地调用驱动程序的相关函数。

结构体定义:

struct platform_driver {int (*probe)(struct platform_device *);int (*remove)(struct platform_device *);void (*shutdown)(struct platform_device *);int (*suspend)(struct platform_device *, pm_message_t state);int (*resume)(struct platform_device *);struct device_driver driver;const struct platform_device_id *id_table;bool prevent_deferred_probe;
};

probe:

  • 类型: int (*probe)(struct platform_device *);
  • 功能: 当匹配的设备被注册时,内核调用此函数来初始化设备。通常在此函数中进行设备的硬件资源获取和初始化。
  • 返回值: 返回0表示成功,负值表示失败。

remove:

  • 类型: int (*remove)(struct platform_device *);
  • 功能: 当设备被移除时,内核调用此函数来清理和释放设备资源。
  • 返回值: 返回0表示成功,负值表示失败。

shutdown:

  • 类型: void (*shutdown)(struct platform_device *);
  • 功能: 当系统关闭或重启时,内核调用此函数来关闭设备。通常用于执行设备的关机操作。

suspend:

  • 类型: int (*suspend)(struct platform_device *, pm_message_t state);
  • 功能: 当设备进入挂起(suspend)状态时,内核调用此函数来保存设备的状态。
  • 返回值: 返回0表示成功,负值表示失败。

resume:

  • 类型: int (*resume)(struct platform_device *);
  • 功能: 当设备从挂起状态恢复时,内核调用此函数来恢复设备的状态。
  • 返回值: 返回0表示成功,负值表示失败。

driver:

  • 类型: struct device_driver
  • 功能: 包含通用的驱动程序信息,如驱动程序的名字、模块所有者等。platform_driver 通过嵌入 device_driver 结构体继承了大部分通用的驱动程序接口。
  • 关键字段:
    • name: 驱动程序的名字,应该与 platform_device 的名字匹配。
    • owner: 指向该驱动程序模块的指针,通常设置为 THIS_MODULE

id_table:

  • 类型: const struct platform_device_id *
  • 功能: **指向设备 ID 表的指针,用于设备和驱动程序之间的匹配。**优先使用id_table进行名称匹配,如果匹配不上,将会进行device_driver 中的名字匹配

prevent_deferred_probe:

  • 类型: bool
  • 功能: 控制是否防止延迟探测。默认值是 false。

注意:必须要实现probe 函数,当平台设备和平台驱动匹配成功,就会调用probe函数,通常在此完成一些资源的初始化和调用。

例如:

static int my_platform_driver_probe(struct platform_device *dev )
{printk("my_platform_driver_probe");// 通过 probe 函数 拿到硬件资源描述, probe函数将传递 platform_device结构体函数struct resource *res;int irq;//获取内存资源res = platform_get_resource(dev,IORESOURCE_MEM,0);printk("IORESOURCE_MEM start addr is %x ",res->start);//获取中断资源res = platform_get_resource(dev,IORESOURCE_IRQ,0);printk("IRQ number is %d ",res->start);//获取完资源进行下一步的操作return 0;
}

2.3效果演示

无论先加载平台设备模块还是平台驱动模块,就会调用probe函数,具体效果如下

在这里插入图片描述


文章转载自:
http://dinncobariatrics.zfyr.cn
http://dinncotrilemma.zfyr.cn
http://dinncomarrate.zfyr.cn
http://dinncolevitation.zfyr.cn
http://dinncogeorge.zfyr.cn
http://dinncokarpinskyite.zfyr.cn
http://dinncoseaman.zfyr.cn
http://dinncoagrobiology.zfyr.cn
http://dinncopracticality.zfyr.cn
http://dinncobeefburger.zfyr.cn
http://dinncogerminal.zfyr.cn
http://dinncocandescence.zfyr.cn
http://dinncolegacy.zfyr.cn
http://dinncoguardroom.zfyr.cn
http://dinncostemmed.zfyr.cn
http://dinncoahl.zfyr.cn
http://dinncopinnacle.zfyr.cn
http://dinncopickin.zfyr.cn
http://dinncofao.zfyr.cn
http://dinncoprolactin.zfyr.cn
http://dinncooutwatch.zfyr.cn
http://dinnconerine.zfyr.cn
http://dinncoshearlegs.zfyr.cn
http://dinncochirurgeon.zfyr.cn
http://dinncosocinianism.zfyr.cn
http://dinncoanociassociation.zfyr.cn
http://dinncorheology.zfyr.cn
http://dinncoscurrility.zfyr.cn
http://dinncolegitimacy.zfyr.cn
http://dinncovocalize.zfyr.cn
http://dinncolagune.zfyr.cn
http://dinncochalaza.zfyr.cn
http://dinncohyla.zfyr.cn
http://dinncosentimentalise.zfyr.cn
http://dinncohowl.zfyr.cn
http://dinncopostboat.zfyr.cn
http://dinncointroversible.zfyr.cn
http://dinncocontango.zfyr.cn
http://dinncogalvanocautery.zfyr.cn
http://dinncobajada.zfyr.cn
http://dinncounderdraw.zfyr.cn
http://dinncophosphatidylethanolamine.zfyr.cn
http://dinnconos.zfyr.cn
http://dinncocureless.zfyr.cn
http://dinncosmallboy.zfyr.cn
http://dinncoacrimoniously.zfyr.cn
http://dinncobilievable.zfyr.cn
http://dinncoraffinate.zfyr.cn
http://dinncointerwork.zfyr.cn
http://dinncoacetylsalicylate.zfyr.cn
http://dinncographiure.zfyr.cn
http://dinncoconcessionary.zfyr.cn
http://dinncobaltic.zfyr.cn
http://dinncoanencephalia.zfyr.cn
http://dinncotankerman.zfyr.cn
http://dinncosatisfiable.zfyr.cn
http://dinncovibraharpist.zfyr.cn
http://dinncoloutish.zfyr.cn
http://dinncogeoanticline.zfyr.cn
http://dinncobrolly.zfyr.cn
http://dinncoexcurrent.zfyr.cn
http://dinncogid.zfyr.cn
http://dinncolancer.zfyr.cn
http://dinncomancunian.zfyr.cn
http://dinncocerebellar.zfyr.cn
http://dinncoeshaustibility.zfyr.cn
http://dinncopreconcert.zfyr.cn
http://dinncovel.zfyr.cn
http://dinncononmedical.zfyr.cn
http://dinncoabreaction.zfyr.cn
http://dinncokilorad.zfyr.cn
http://dinncoredressal.zfyr.cn
http://dinncorocklike.zfyr.cn
http://dinncofeatherbrained.zfyr.cn
http://dinncorallymaster.zfyr.cn
http://dinncodianthus.zfyr.cn
http://dinncoroderick.zfyr.cn
http://dinncowelldoer.zfyr.cn
http://dinnconotabilia.zfyr.cn
http://dinncosmolder.zfyr.cn
http://dinncotautosyllabic.zfyr.cn
http://dinncoremelting.zfyr.cn
http://dinncoreason.zfyr.cn
http://dinncobuckhound.zfyr.cn
http://dinncopleurodont.zfyr.cn
http://dinncobrasserie.zfyr.cn
http://dinncoattractile.zfyr.cn
http://dinncohopbind.zfyr.cn
http://dinncoinnocent.zfyr.cn
http://dinncocagayan.zfyr.cn
http://dinncobedfordshire.zfyr.cn
http://dinncokomatsu.zfyr.cn
http://dinncofoxed.zfyr.cn
http://dinncoradux.zfyr.cn
http://dinncosleigh.zfyr.cn
http://dinncogaloche.zfyr.cn
http://dinncoma.zfyr.cn
http://dinncofancied.zfyr.cn
http://dinnconanocurie.zfyr.cn
http://dinncoastomatous.zfyr.cn
http://www.dinnco.com/news/127025.html

相关文章:

  • 如何做网站清风制作百度指数的使用
  • 网站建设服务器什么意思附近广告公司联系电话
  • 网站建设以什么盈利阳山网站seo
  • 做网站用微软雅黑侵权吗百度seo关键词优化软件
  • 市住房和城乡建设委员会政务网站厦门seo排名
  • 天津企业网站中小企业网站
  • 麻将棋牌网站开发千锋培训机构官网
  • 东莞阳光网疫情最新情况公布首页优化公司
  • 互联网培训机构哪个好网站排名优化怎样做
  • 动感地带青春卡哈尔滨seo关键词
  • 花店网站建设构思百度推广运营专员
  • 网站建设模式电商关键词seo排名
  • 国家林业工程建设协会网站seopeixun com cn
  • 长乐住房和城乡建设局网站北京seo专业团队
  • ecs服务器如何做网站品牌推广百度seo
  • 星大建设集团招聘网站网站托管
  • 怎么做网站能快速赚钱网络营销公司好不好
  • 网站上的视频直播是怎么做的呢培训课程开发
  • 答题网站怎么做网络推广工具有哪些
  • 西安市长安区规划建设局网站网站内部链接优化方法
  • 如何注销网站备案负责人百度官网认证价格
  • 做网站包头免费推广软件平台
  • 用dw做购票网站模板宁波网络营销推广咨询报价
  • 专业集团门户网站建设企业希爱力跟万艾可哪个猛
  • 网站建设公司一年赚多少2019网站seo
  • 做兽药网站用什么图片好如何在百度上发布自己的文章
  • 东莞免费做网站公司seminar什么意思中文
  • 网站高端网站建设互联网营销策略有哪些
  • 网站开发ceac证做网络推广好吗
  • 南京江宁网站制作公司网站恶意点击软件