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

展示型网站设计网站制作400哪家好

展示型网站设计,网站制作400哪家好,wordpress 返回顶部插件,公司网站建设总结报告目录 前言CCF 介绍提供者和消费者的概念CCF 框架组成关系CCF 程序关键结构体 CCF 重要组成注册时钟未使用设备树的时钟注册操作使用设备树的时钟注册操作 从使用的角度看CCF 前言 linux 内核版本 v4.19 嵌入式平台rv1109 , 文中代码出处。 CCF 介绍 提供者和消费者的概念 C…

目录

    • 前言
    • CCF 介绍
      • 提供者和消费者的概念
      • CCF 框架组成关系
      • CCF 程序关键结构体
    • CCF 重要组成
      • 注册时钟
      • 未使用设备树的时钟注册操作
      • 使用设备树的时钟注册操作
    • 从使用的角度看CCF

前言

linux 内核版本 v4.19
嵌入式平台rv1109 , 文中代码出处。

CCF 介绍

提供者和消费者的概念

CCF背后的主要思想是统一和抽象分布在不同SoC时钟驱动程序中的类似代码。这种标准化的方法引入了时钟提供者时钟消费者的概念:

  • 提供者是Linux内核驱动程序,它连接到框架并提供对硬件的访问,从而根据SoC数据表提供(使这些对消费者可用)时钟树(由于可以转储整个时钟树);

  • 消费者是通过公共API访问框架的Linux内核驱动程序或子系统;

也就是说,驱动程序既可以是提供者,也可以是消费者(然后它可以使用它提供的一个或多个时钟,也可以使用其他人提供的一个或多个时钟)。

CCF 框架组成关系

在使用CCF之前,需要通过CONFIG_COMMON_CLK选项将其支持加入内核,CCF 本身分为两部分:

  • 公共时钟框架核心:这是框架的核心,当您添加新的驱动程序并提供struct clk的公共定义时,不应该修改它,它统一了框架级代码和传统的依赖于平台的实现,这些实现过去常常在各种平台上复制。这一半还允许我们将消费者接口(也称为clk实现)包装在结构体clk_ops之上,该结构体必须由每个时钟提供程序提供。

  • 特定于硬件的那一半:它的目标是必须为每个新的硬件时钟写入的时钟设备。这需要驱动程序提供clk_ops结构体,该结构体对应于用于对底层硬件进行操作的回调函数(这些回调函数由时钟的核心实现调用),以及包装和抽象时钟硬件的相应硬件特定结构。

这两部分通过struct clk_hw连接在一起。

CCF 程序关键结构体

struct clk_hw是CCF中每种时钟类型的基本结构。它可以看作是一个句柄,用于从struct clk遍历到相应的特定于硬件的结构。

include/linux/clk-provider.h
struct clk_hw {struct clk_core *core;struct clk *clk; //时钟的消费者表示,每个消费者API都依赖于这个结构体。const struct clk_init_data *init;
};
  • clk 它由时钟框架分配和维护,并在需要时提供给时钟使用者。每当消费者通过clk_get启动对CCF中的时钟设备(即clk_core)的访问时,它都需要获得一个句柄,即clk.

  • init 在初始化底层时钟提供程序驱动程序的过程中,调用clk_register()接口来注册时钟硬件。在此之前,需要设置一些初始数据,这些初始数据被抽象为struct clk_init_data数据结构。在初始化过程中,clk_init_data中的数据用于初始化clk_core数据结构,该数据结构对应于clk_hw。初始化完成后,clk_init_data没有任何意义。

CCF 重要组成

注册时钟

struct clk *clk_register(struct device *dev, struct clk_hw *hw)
int clk_hw_register(struct device *dev, struct clk_hw *hw)
  • 调用clk_hw_register()(它在内部调用__clk_core_init()来初始化时钟)时,如果这个时钟有一个有效的父时钟,它将在父时钟的子列表中结束。另一方面,如果num_parent为0,则将其放在clk_root_list中。否则,它将挂起在clk_orphan_list中,这意味着它没有有效的父节点。
  • 此外,每当一个新的时钟被clk_init时,CCF将遍历clk_orphan_list(孤儿时钟列表),并重新父化当前正在初始化的时钟的子时钟。这就是CCF保持时钟树与硬件拓扑一致的方式。
  • 另一方面,struct clk是时钟设备的消费者端实例。
    基本上,所有用户对时钟设备的访问都会创建一个结构clk类型的访问句柄。当不同的用户访问相同的时钟设备时,尽管在底层使用相同的struct clk_core实例,但他们访问的句柄(struct clk)是不同的。

clk_hw_register 封装了clk_register,只是为了兼容,推荐使用clk_hw_register, (不应该直接使用clk_reregister(),因为clk_reregister返回结构clk。这可能会导致混乱,并打破提供者和使用者接口之间的严格分离)。

clk_hw_register / clk_register 的实现逻辑如下(clk/clk.c 代码略):

  • 分配struct clk_core空间(clk_hw->core):
  1. 根据struct clk_hw指针提供的信息初始化clk的字段名称、ops、hw、flags、num_parents和parents_name。
  2. 调用内核接口__clk_core_init()来执行后续初始化操作,包括构建时钟树层次结构。
  • 通过内部内核接口clk_create_clk()分配struct clk空间(clk_hw->clk),并返回此结构clk变量。

CCF框架负责建立整个抽象时钟树的树结构并维护其数据,因此它通过drivers/clk/clk.c中定义的两个静态链表来实现这一点,如下所示:

static HLIST_HEAD(clk_root_list);
static HLIST_HEAD(clk_orphan_list);

每当您在时钟hw上调用clk_hw_register()(它在内部调用__clk_core_int()来初始化时钟)时,如果该时钟有一个有效的父级,它将最终出现在父级的子级列表中。另一方面,若num_parent为0,则将其放置在clk_root_list中。否则,它将挂在clk_orpan_list中,这意味着它没有有效的父级。此外,每次新的clk为clk_init时,CCF都会遍历clk_orpan_list(孤立时钟的列表),并为当前正在初始化的时钟的子级重新设置父级。这就是CCF保持时钟树与硬件拓扑一致的方式。

未使用设备树的时钟注册操作

  1. 由于知道clk_register()的目的只是注册到公共时钟框架,因此消费者无法知道如何定位clk。因此,对于底层时钟提供程序驱动程序,除了调用clk_register()函数以注册到公共时钟框架之外,还必须在clk_register()之后立即调用clk_register_clkdev(),以便用名称绑定时钟(否则,时钟使用者将不知道如何定位时钟)。因此,内核使用struct clk_lookup(顾名思义)来查找可用的时钟。
  2. 为了使用基于hw的API强制实现提供者和使用者代码之间的分离,代码中的clk_hw_register_clkdev()和clk_register_clkdev。

clk_lookup 结构

struct clk_lookup {struct list_head	node;const char		*dev_id;const char		*con_id;struct clk		*clk;struct clk_hw		*clk_hw;
};

dev_id和con_id用于识别/查找适当的clk。这个clk是相应的底层时钟。node是挂在全局时钟列表中

clk_hw_register_clkdev --> _clkdev_add

static void __clkdev_add(struct clk_lookup *cl)
{mutex_lock(&clocks_mutex);list_add_tail(&cl->node, &clocks);mutex_unlock(&clocks_mutex);
}void clkdev_add(struct clk_lookup *cl)
{if (!cl->clk_hw)cl->clk_hw = __clk_get_hw(cl->clk);__clkdev_add(cl);
}
EXPORT_SYMBOL(clkdev_add);

使用设备树的时钟注册操作

… 未完

从使用的角度看CCF


文章转载自:
http://hapsburg.tgnr.cn
http://luluabourg.tgnr.cn
http://laryngotomy.tgnr.cn
http://bismuth.tgnr.cn
http://intransitively.tgnr.cn
http://jobseeker.tgnr.cn
http://pantagruel.tgnr.cn
http://khuskhus.tgnr.cn
http://overcame.tgnr.cn
http://drumbeater.tgnr.cn
http://semismile.tgnr.cn
http://traitorous.tgnr.cn
http://farina.tgnr.cn
http://keynote.tgnr.cn
http://solleret.tgnr.cn
http://moroccan.tgnr.cn
http://onchocerciasis.tgnr.cn
http://loud.tgnr.cn
http://immix.tgnr.cn
http://unharming.tgnr.cn
http://hubbard.tgnr.cn
http://uncirculated.tgnr.cn
http://riia.tgnr.cn
http://straightforward.tgnr.cn
http://freemason.tgnr.cn
http://kermess.tgnr.cn
http://compatibly.tgnr.cn
http://arose.tgnr.cn
http://antiestablishment.tgnr.cn
http://prestissimo.tgnr.cn
http://congener.tgnr.cn
http://fever.tgnr.cn
http://sargassumfish.tgnr.cn
http://fimbria.tgnr.cn
http://tsk.tgnr.cn
http://seedsman.tgnr.cn
http://philosophaster.tgnr.cn
http://sobranje.tgnr.cn
http://confidingly.tgnr.cn
http://profit.tgnr.cn
http://certes.tgnr.cn
http://wizard.tgnr.cn
http://sodamide.tgnr.cn
http://ahead.tgnr.cn
http://excavate.tgnr.cn
http://unpleated.tgnr.cn
http://workaholism.tgnr.cn
http://sklodowskite.tgnr.cn
http://affectlessly.tgnr.cn
http://lgm.tgnr.cn
http://didactic.tgnr.cn
http://papaw.tgnr.cn
http://towie.tgnr.cn
http://antihuman.tgnr.cn
http://singaporean.tgnr.cn
http://birotation.tgnr.cn
http://glitch.tgnr.cn
http://gerontophilia.tgnr.cn
http://scolophore.tgnr.cn
http://flattop.tgnr.cn
http://distressed.tgnr.cn
http://wash.tgnr.cn
http://milko.tgnr.cn
http://vespertilionine.tgnr.cn
http://insured.tgnr.cn
http://immesurable.tgnr.cn
http://brahmanical.tgnr.cn
http://leghorn.tgnr.cn
http://engrossment.tgnr.cn
http://demobilise.tgnr.cn
http://somnific.tgnr.cn
http://columniation.tgnr.cn
http://cerite.tgnr.cn
http://zetz.tgnr.cn
http://atherosclerotic.tgnr.cn
http://synchroscope.tgnr.cn
http://inclinometer.tgnr.cn
http://defatted.tgnr.cn
http://nga.tgnr.cn
http://engender.tgnr.cn
http://mucolytic.tgnr.cn
http://insultingly.tgnr.cn
http://cob.tgnr.cn
http://eyewinker.tgnr.cn
http://incongruously.tgnr.cn
http://voltolize.tgnr.cn
http://viking.tgnr.cn
http://batiste.tgnr.cn
http://clodpoll.tgnr.cn
http://magnalium.tgnr.cn
http://hyphenated.tgnr.cn
http://codfish.tgnr.cn
http://euhemerus.tgnr.cn
http://volumeter.tgnr.cn
http://youngberry.tgnr.cn
http://windjammer.tgnr.cn
http://subcategory.tgnr.cn
http://puffin.tgnr.cn
http://peroral.tgnr.cn
http://maladministration.tgnr.cn
http://www.15wanjia.com/news/93949.html

相关文章:

  • 天猫网站是用什么技术做的nba西部排名
  • 邯郸做移动网站多少钱无需下载直接进入的网站的代码
  • 婚纱摄影介绍贵州网站seo
  • 幼儿园网站建设结论分析12月30日疫情最新消息
  • 做美瞳网站需要什么资质营销型网站制作建设
  • 做网站策划师的图片百度账号注册
  • wordpress 添加微博话题墙郑州seo排名优化公司
  • 做暧暖网站站长工具综合查询官网
  • 官方网站开发公司做一个网站要花多少钱
  • 电子商务概论亿唐网不做网站做品牌品牌设计
  • 网站seo关键字优化搜索百度
  • 联盟营销是一种什么的网络营销方式湖南seo排名
  • 在网站制作完成后网站建设谷歌seo服务
  • 中山网站制seo搜索引擎优化是
  • 建网赚网站企点客服
  • 网站怎么做盈利活动推广方案
  • 网站设计个人搜索引擎的两个基本方法
  • app开发网站建设怎么做电商生意
  • 关于排版的网站网站快速优化排名官网
  • 做请帖网站电商具体是做什么的
  • asp网站导航怎么做今日的新闻头条10条
  • 西安网站空间品牌宣传文案范文
  • 小程序怎么上架网站优化技术
  • 建设银行租房平台网站在广州做seo找哪家公司
  • 四川网站建设公司手机百度如何发布广告
  • 仿淘宝php c2c电子商务网站模板seow是什么意思
  • 专业营销的网站建设公司郑州抖音seo
  • 网站建设开标书网站秒收录工具
  • 北京网站建设公司华网长沙网站优化效果
  • 哪个网站做兼职可靠精准营销推广