davinci 达芬奇 时钟驱动分析 dm365/dm368 struct clk

【linux kernel】一文总结linux的clk框架 本文浅析linux的clk框架 阅读详情

【blog.youkuaiyun.com/lanmanck】

本文纯属啰嗦帖子,没有很高的技术含量,仅供参考。

以dm365的spi为例说明之:

1、先在dm365.c里定义几个宏:

定义PLL1/2的属性:static struct pll_data pll1_data{定义寄存器基址灯}

定义参考时钟:static struct clk ref_clk={定义晶振时钟}

定义PLL1的时钟:static struct clk pll1_clk={定义parent(父类)为ref_clk,data(属性)为pll1_data}

  定义PLL1输出的时钟源,例如static struct clk pll1_sysclk6={定义parent(父类)为pll1_clk,}

定义PLL2的时钟:static struct clk pll2_clk={定义parent(父类)为ref_clk,data(属性)为pll2_data}

  定义PLL2输出的时钟源,例如static struct clk pll2_sysclk3={定义parent(父类)为pll2_clk,}

2、定义外设使用的PLL输出源:

static struct clk vpss_dac_clk={定义parent为pll1_sysclk3,LPSC=DM365_LPSC_DAC_CLK}

static struct clk spi2_clk={定义parent为pll1_sysclk4,LPSC=DM365_LPSC_SPI2}


3、定义参考时钟、pll时钟、pll输出源的查找表:

static struct clk_lookup dm365_clks[]={例如CLK("spi_davinci.2",NULL,&spi2_clk)}

4、查找表赋值给struct davinci_soc_info davinci_soc_info_dm365.cpu_clks

5、系统注册时调用davinci_common_init(struct davinci_soc_info *a),此函数会判断.cpu_clks是否有效,

如果有效,则调用davinci_clk_init进行clock初始化,看看davinci_clk_init()都干了些啥


6、davinci_clk_init() 挨个遍历查找表的clk(最后一位成员)

如果查找表中定义的clk->recalc为0(一般都为0),则赋值重计算的api。

例如找到pll1_clk,发现pll_data为pll1_data,则赋值为clk->recalc = clk_pllclk_recalc。

又如,找到标志位clk->flags & CLK_PLL,表示这个clk是PLL输出源,则赋值为clk->recalc = clk_sysclk_recalc。

又如,找到clk有父类clk->parent,表示这个是个PSC时钟,赋值为clk_recalc = clk_leafclk_recalc

因为这几个if有优先级,所以基本上顺序为:PLL、PLL输出源、外设时钟


接着,如果这个clk是PLL,则ioremap这个PLL的寄存器基址,用来后面的配置


现在,调用clk->recalc()来获得当前clk的实际时钟:clk->rate = clk->recalc(clk);

如果时钟管理有效(clk->lpsc),则把标志位置上clk->flags |= CLK_PSC;


调用clk_register(clk)注册该时钟到内核中进行管理


最后如果标志位flags有ALWAYS_ENABLED,则使能该clk:clk_enable(clk);


7、实例:SPI2就是调用clk_leafclk_recalc()来得到自己的bus clock,实际上该函数返回的就是parent的clock,

我们看到spi2_clk定义时parent=pll1_sysclk4,相当于spi2的bus时钟就是pll1_sysclk4,而这个时钟是通过

clk_sysclk_recalc()算出来的。


OK, 就这么多!


【信息科学与工程学】【产品体系】计算机科学与自动化——第一百八十九篇 操作系统内核(微内核/宏内核)函数与算法02 宏内核(Linux)更多典型内核函数/算法,从编号271开始,覆盖中断管理、热插拔、PCI、ACPI、固件、崩溃转储、kexec、休眠、watchdog、RTC、hwmon、LED、backlight、input子系统、remoteproc等更多领域。编号类型领域内核类型内核中的函数/算法/模块/模组模块的调用关系模块/函数/算法逐步推理思考的数学表达式及参数列表及参数数值设计模块的C/C++/其他代码关联知识271中断管理中断描述符宏内核 / (中断子系统核心)驱动申请中断 → → → 分配irq_ 阅读详情

相关推荐

DM368 NAND FLASH启动解密

DM368 NAND FLASH启动解密,讲述了从RBL->UBL->U-BOOT>kernel 启动的详细过程,对了解整体的一个框架,具有非常好的指导作用,不可多得的好资料。

[AUTOSAR】-Davinci配置CAN和MCU出现时钟频率问题

配置CAN和MCU模块的注意事项: 如果此时数值填的超过了8,比如9,那么会报错,情况如下:

lsy1649909501的博客 631

Android投屏开发实战:手把手教你用Miracast实现Sink端功能(附完整代码)

本文是一份Android投屏Sink端开发的实战指南,详细讲解了如何利用Miracast协议和Wi-Fi P2P技术,从零构建一个功能完整的屏幕接收器。内容涵盖环境搭建、通过反射启用WFD Sink模式、RTSP协议协商、RTP流接收与解析,以及最终使用IjkPlayer进行音视频解码播放的全过程,并附有核心代码示例。

cherry的博客 878

linux内核时钟管理,Linux时钟管理透彻分析

Linux时钟管理透彻分析。硬件资源越来越庞大和复杂,内核的另一个挑战就是要便捷的管理这些资源。同时,面对如此之多的平台不同的CPU,管理机制需要统一适用,这就需要对资源的管理抽象到更加通用的层次。CPU中各个模块都需要时钟驱动,内核需要一种机制能通用所有的平台,方便的管理CPU上所有的clk资源。这里分析Linux对clk的管理。通常操作为以下几步:1.定义struct clk *clk;2.获...

weixin_42363510的博客 1212

Habitat-v0.1.7安装全网最详细教程(解决habitat-sim下载时网络问题)

Habitat-v0.1.7安装全网最详细教程(解决habitat-sim下载时网络问题)

shannanshouyin的博客 1326

手把手教你用STM32CubeMX和HAL库驱动DW3000:从SPI配置到第一个测距Demo

本文详细介绍了如何使用STM32CubeMX和HAL库驱动DW3000 UWB定位通信模块,从SPI配置到实现厘米级测距Demo的全过程。涵盖硬件连接、SPI通信调试、驱动移植及双向测距(TWR)算法实现,帮助开发者快速掌握UWB高精度定位技术,适用于仓储物流、智能家居等场景。

weixin_27038245的博客 485

linux clk

涉及的主要文件有

luckywang1103的专栏 3680

图机器学习(2)——图的可视化

图结构可通过图形化方式直观呈现。节点通常用圆形表示,边则用连接线表示。然而当节点和边数量增加时,绘制清晰的图形表示可能会变得相当困难,这主要源于节点在二维坐标系中的布局问题。对于包含数百个节点的图,手动指定每个节点的坐标显然不切实际。在本节中,我们将介绍如何在不指定每个节点坐标的情况下绘制图形。我们将利用两种不同的解决方案:networkx 和 Gephi。

盼小辉丶的博客 8713

Linux common clock framework(3)_实现逻辑分析

和fixed rate类似,不再一一说明。

weixin_41028159的博客 610

OceanBase数据库LSM-Tree存储引擎深度解析:合并写入与压缩优化策略

OceanBase数据库采用创新的LSM-Tree架构设计,通过"基线-增量"分离存储实现高性能。内存中的MemTable处理写入,磁盘上的SSTable存储有序数据,利用多级缓存加速读取。写入时先写日志再更新内存,合并操作将增量数据整合为基线数据以优化查询性能。相比传统B+树引擎,OceanBase在写入吞吐、压缩效率和存储成本方面优势显著,特别适合写入密集型场景。合并操作作为核心机制,通过多种触发方式和执行策略平衡性能与资源消耗。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1339

代数拓扑与AI架构:AI应用架构师深入探索数学研究如何分析复杂系统的结构特性

随着人工智能技术的飞速发展,AI系统变得越来越复杂。AI应用架构师需要有效的工具和方法来理解、设计和优化这些复杂系统。代数拓扑作为数学的一个分支,提供了独特的视角和技术来分析复杂系统的结构特性。本文旨在帮助AI应用架构师深入了解代数拓扑,以及如何将其应用于AI架构设计中,提升对复杂系统的分析能力。首先,我们会介绍代数拓扑和AI架构相关的核心概念及其联系,通过有趣的故事引入主题,让读者轻松理解复杂概念。接着,深入探讨代数拓扑的核心算法原理,结合具体的编程语言代码示例详细阐述。

大模型应用工坊 669

linux clk框架,01-linux common clk framework

博客:fireaxe.blog.chinaunix.net根据蜗窝科技相关文档整理1. clock硬件结构如今,可运行Linux的主流处理器平台,都有非常复杂的clock tree,我们随便拿一个处理器的spec,查看clock相关的章节,一定会有一个非常庞大和复杂的树状图,这个图由clock相关的器件,以及这些器件输出的clock组成。下图是一个示例:clock相关的器件包括:用于产生clock...

weixin_35261213的博客 548

【软考高级架构】案例题考前突击6——大数据架构

前一类的数据主要由流量方以接口的方式提供(比如对接的腾讯广点通平台),后一类则是某网特有的数据,通过买家的浏览、下单、付款日志算出来。1. 在数据层面只维护一张包含所有指标的MySQL表,表中的stday字段作为索引,stday=当天的保存实时数据,stday<当天的保存离线数据。典型的大数据架构,除了Lambda架构之外,还有kappa架构,这两个架构的区别如下标所示,请补充表中空(1)-(4)第二,实时数据只对接了内部的kafka消息,没有实时的获取第三方的曝光、点击、浏览数据。

qq837993702的博客 66

clk子系统 - 驱动框架

clk子系统负责为整个系统硬件提供时钟信号,这个要和linux的时钟系统区别开来;现在的ASoC上包含许多clk模块,比如晶振,pll,divider等,那么clk子系统就把这些模块抽象出来,并形成一个驱动框架,这样对于其他驱动开发人员来说,只需要调用通用的接口就能操作各自设备的clk,没必要从上到下重新配置clk 1.驱动框架 clk驱动框架如上图,API层是提供操作clk的通用...

多媒体开发者 3644

1分钟吃透一篇文献,借助AI辅助各部分精读,效率提升10倍(附AI提示词)

你现在是一名【研究领域】的资深博士,非常擅长阅读与分析长篇论文,那么接下来我会给你上传一篇论文,请你按照我的要求辅助我阅读。

qq_64378896的博客 635

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Linux 内核clk框架描述

clk 描述

星空探索 1437

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

struct clk *clk_get(struct device *dev, const char *id)

(1)  对应外设时钟的开启 struct clk=clk_get(NULL,"adc"); clk.enable(); 之后adc对应的时钟位就能时能。 struct clk *clk_get(struct device *dev, const char *id) {     ..........     list_for_each_entry(p, &clocks, list

lyuncxw 1612

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Linux 内核clk相关数据结构描述

drivers/clk/clk.c struct clk {  struct clk_core *core;  const char *dev_id;  const char *con_id;  unsigned long min_rate;  unsigned long max_rate;  struct hlist_node clks_node; }; /***priva

星空探索 1671

struct clk clk-get() clk_enable();

struct clk;  之ARM struct clk {     struct list_head      list;     struct module        *owner;     struct clk           *parent;     const char           *name;     int              id;     

u012385733的专栏 1617

【深入Linux内核驱动】通用时钟框架驱动 Common Clk Framework(CCF)【转】

在一个 SoC 中,晶振、 PLL 、驱动和门等会形成一个时钟树形结构,在 Linux 2.6 中,也存有、、、等通用 API ,但是这些 API 由每个 SoC 单独实现,而且各个 SoC 供应商在实现方面的差异很大,于是内核增加了一个新的通用时钟框架以解决这个碎片化问题。

Tschome的博客 1639

Linux时钟管理透彻分析

转自http://blog.youkuaiyun.com/qq_21792169/article/details/51085111 硬件资源越来越庞大和复杂,内核的另一个挑战就是要便捷的管理这些资源。同时,面对如此之多的平台不同的CPU ,管理机制需要统一适用,这就需要对资源的管理抽象到更加通用的层次。CPU中各个模块都需要时钟驱动,内核需 要一种机制能通用所有的平台,方便的管理CPU上所有的clk

qingkongyeyue的博客 2443

基于RK3399分析Linux系统下的CPU时钟管理 - 第2篇

SoC时钟系统提供的功能包括:使能控制、倍频、分频、复用等。因此,在软件代码中按照SoC时钟系统提供的功能来组织Clock provider的结构,方便用户使用。 1. Clock provider数据结构 CCF是common clock framework的缩写,意为通用时钟框架。在内核中通过宏定义CONFIG_COMMON_CLK打开CCF,打开相关宏开启CFG框架的通用功能,具体如下: CONFIG_COMMON_CLK=y CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CL

多年芯片设计领域从业经验,负责芯片bringup以及kernel驱动开发。 1274

Davinci DM6446 Linux 内核分析—— clock.c

http://www.61ic.com/Article/DaVinci/DM644X/201201/40303.html   /* 该文件中到程序实现了各模块PSC的管理,时钟的初始化、注册、获取以及使能等 */   /**************************************************************************   * Includ

zhanjianshinian的专栏 1542

时钟子系统的问题

clock

weixin_39296862的博客 388
上一篇: 软件实现PWM信号,LED闪烁
下一篇: stm32 编程用到的文档
#Page#
博客等级 码龄23年 1691粉丝 360原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值