【EMMC】MSM8953里时钟是如何分频的

article/2025/9/22 13:18:48

时钟源

MSM8953振荡频率为19.2 MHz的单晶振荡器(XO)。XO作为所有pll的源,也可以作为其他时钟的源。MSM8953没有单独的休眠晶体,使用586的除数从XO生成睡眠时钟32.768khz作为时钟信号源。
在这里插入图片描述

分析代码

在host中probe函数里有在初始化阶段获取clk信息

	/* Setup SDC MMC clock */msm_host->clk = devm_clk_get(&pdev->dev, "core_clk");if (IS_ERR(msm_host->clk)) {ret = PTR_ERR(msm_host->clk);goto bus_aggr_clk_disable;}

跳转到设备树获取设备树中时钟信息,以下分别是mmc和sd的。下面只示例mmc,sd同理。

	clocks = <&clock_gcc clk_gcc_sdcc1_ahb_clk>,<&clock_gcc clk_gcc_sdcc1_apps_clk>,<&clock_gcc clk_gcc_sdcc1_ice_core_clk>;clock-names = "iface_clk", "core_clk", "ice_core_clk";
------------------------------------------------------------------------clocks = <&clock_gcc clk_gcc_sdcc2_ahb_clk>,<&clock_gcc clk_gcc_sdcc2_apps_clk>;clock-names = "iface_clk", "core_clk";

查看clock-gcc-msm8953文件的probe函数,解析设备树资源

res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cc_base");if (!res) {dev_err(&pdev->dev, "Register base not defined\n");return -ENOMEM;}

获取寄存器基地址以及偏移量

clock_gcc_gfx: qcom,gcc-gfx@1800000 {compatible = "qcom,gcc-gfx-8953";reg = <0x1800000 0x80000>;reg-names = "cc_base";vdd_gfx-supply = <&gfx_vreg_corner>;clocks = <&clock_gcc clk_xo_clk_src>;clock-names = "xo";qcom,gcc_oxili_gfx3d_clk-opp-handle = <&msm_gpu>;qcom,gfxfreq-corner =<         0   0 >,< 133330000   1 >,  /* Min SVS   */< 216000000   2 >,  /* Low SVS   */< 320000000   3 >,  /* SVS       */< 400000000   4 >,  /* SVS Plus  */< 510000000   5 >,  /* NOM       */< 560000000   6 >,  /* Nom Plus  */< 650000000   7 >;  /* Turbo     */#clock-cells = <1>;};

寄存器基地址映射

virt_bases[GCC_BASE] = devm_ioremap(&pdev->dev, res->start,resource_size(res));

获取时钟源table

static struct clk_freq_tbl ftbl_sdcc1_apps_clk_src[] = {F(    144000,              xo,   16,    3,    25),F(    400000,              xo,   12,    1,     4),F(  20000000, gpll0_main_div2,    5,    1,     4),F(  25000000, gpll0_main_div2,   16,    0,     0),F(  50000000,           gpll0,   16,    0,     0),F( 100000000,           gpll0,    8,    0,     0),F( 177770000,           gpll0,  4.5,    0,     0),F( 192000000,           gpll4,    6,    0,     0),F( 384000000,           gpll4,    3,    0,     0),F_END
};static struct rcg_clk sdcc1_apps_clk_src = {.cmd_rcgr_reg = SDCC1_APPS_CMD_RCGR,.set_rate = set_rate_mnd,.freq_tbl = ftbl_sdcc1_apps_clk_src,.current_freq = &rcg_dummy_freq,.base = &virt_bases[GCC_BASE],.c = {.dbg_name = "sdcc1_apps_clk_src",.ops = &clk_ops_rcg_mnd,VDD_DIG_FMAX_MAP3(LOW_SVS, 25000000, SVS, 100000000, NOM,400000000),CLK_INIT(sdcc1_apps_clk_src.c),},
};

这里的table值是有对应的计算公式,可以根据相应spec分析。

F(f, s, d, m, n)
f = Frequency
s = PLL
d = SRC_DIV
m = Multiplier
n = Divisor

举个例子:

F(100000000, gpll0, 8, 0, 0),
f = 800 MHz *1/8 = 100000000 Hz
m、n和d的规则如下:
0>=m<=2
0>=n<=255
0>=d<=15, 其中d的值可以有0.5,例如0.51.01.52.0等。
注:
若m和n不存在,它们等于0。
因此,要添加100MHz作为频率,必须将其作为上表中的函数添加,然后可以将100MHz添加到设备树中,以便驱动程序可以选择此频率。

接着分析,这些值是如何写到寄存器中的。上面的src中有个set_rate_mnd函数。
这里要提一下spec中的寄存器。分别代表上面公式的mnd寄存器。
在这里插入图片描述在这里插入图片描述SDCC1_APPS_CMD_RCGR寄存器
在这里插入图片描述
将mnd的值写到上述的寄存器中

void set_rate_mnd(struct rcg_clk *rcg, struct clk_freq_tbl *nf)
{unsigned long flags;spin_lock_irqsave(&local_clock_reg_lock, flags);__set_rate_mnd(rcg, nf);spin_unlock_irqrestore(&local_clock_reg_lock, flags);
}
static void __set_rate_mnd(struct rcg_clk *rcg, struct clk_freq_tbl *nf)
{u32 cfg_regval;cfg_regval = readl_relaxed(CFG_RCGR_REG(rcg));writel_relaxed(nf->m_val, M_REG(rcg));writel_relaxed(nf->n_val, N_REG(rcg));writel_relaxed(nf->d_val, D_REG(rcg));cfg_regval = readl_relaxed(CFG_RCGR_REG(rcg));cfg_regval &= ~(CFG_RCGR_DIV_MASK | CFG_RCGR_SRC_SEL_MASK);cfg_regval |= nf->div_src_val;/* Activate or disable the M/N:D divider as necessary */cfg_regval &= ~MND_MODE_MASK;if (nf->n_val != 0)cfg_regval |= MND_DUAL_EDGE_MODE_BVAL;writel_relaxed(cfg_regval, CFG_RCGR_REG(rcg));rcg_update_config(rcg);
}

http://chatgpt.dhexx.cn/article/MFRSlUxL.shtml

相关文章

高通625系列-MSM8953 (Cortex-A53架构)

核心板特性 A53架构 8核&#xff08;8*2.2GHz(A53)&#xff09; 产品尺寸小&#xff0c;便于客户集成&#xff0c;减少产品体积&#xff1b;支持4G LTE超高速上网&#xff0c;单板兼容移动/联通/电信2G/3G/4G&#xff1b;支持4128存储器,SD3.0支持128G&#xff1b;尺寸小、集成…

如何收集 小番茄的种子

1.把西红柿切成两半&#xff0c;注意要从果柄处对切。 2.打开西红柿&#xff0c;你应该可以看到西红柿基本上分成四个均匀的部分&#xff0c;每个部分之间有种子和凝胶。 3.找一个小勺子挖出种子&#xff0c;你也可以直接用挤出的方法把种子挤出来&#xff0c;放在小碗里&#…

IOS破解软件,比较全的网站。

转载于:https://blog.51cto.com/14259888/2369621

2023最新仿第八区APP分发平台源码

**> 支持APK,IPA分发 &#xff0c;在线本机ios签名&#xff0c;安卓ios应用封装****> 需要看演示站可以联系https://jq.qq.com/?_wv1027&kjZBe9aHx**

iApp对接hybbs社区APP源码

介绍&#xff1a; 首先得搭建一个HYBBS论坛程序 服务器或者主机不能带有任何cc&#xff0c;防火墙策略&#xff01; 否则软件提交参数会被拦截&#xff0c;则null mian.iyu载入事件填自己的hybbs论坛网址 http打头 /结尾 论坛模板使用官方默认&#xff0c;移动端设置电脑端模板…

苹果应用商店app_切勿更新!IOS最新观影APP上架苹果商店

苹果软件管家 每个果粉都应该关注的一个公众号 原本前天想给大家推送一款影视APP 结果管家刚写完APP就被下架了 相信今天应该不会出现这个问题了 相信果粉们都知道大象影视这款APP 很早之前就下载体验过 但是效果真的一般&#xff0c;广告很多 本次大象影视换壳上架苹果应用商店…

梦幻星球社区APP源码 HYBBS的iApp社区源码

介绍&#xff1a; 极其好用的对接HYBBS的iApp社区源码 BUG修复&#xff1a; 修复评论无法显示 修复无法发送评论 修复头像显示 修复板块图片 … 更新&#xff1a; 新增功能页面 优化回复评论 优化帖子、帖子列表 优化我的、个人主页页面 优化注册、登录页面 增加背景设置 网盘…

iOS应用跳转(包括iPhone原有应用跳转和第三方应用跳转)

文章目录 iOS应用间跳转简介应用间跳转应用场景应用间跳转实现步骤跳转到本地或第三方应用的一些URL Schemes iOS应用间跳转简介 在开发的过程中&#xff0c;我们经常会遇到需要从一个应用程序跳转到另一个应用程序的场景。这就需要我们掌握iOS应用程序之间的相互跳转知识。 …

iOS开发~社区分享

1、概要 随着iOS平台逐渐成熟&#xff0c;连最初让人恼火的社区分享功能现在都变的几行代码就可以搞定&#xff0c;下面分享下“分享”功能原生实现。 2、实现 iOS6之前使用TWTweetComposeViewController实现分享功能&#xff0c;但iOS6之后改用SLComposeViewController实现&…

番茄助手 VS2015

转载地址&#xff1a; https://www.cnblogs.com/DswCnblog/p/5625893.html 首先在官网下载原版&#xff1a; VA_X_Setup2270_0.exe VA_X官方下载链接&#xff1a;http://www.wholetomato.com/downloads/default.asp 安装官版。 下载补丁 。 下载链接: http://pan.baidu.c…

linux安装番茄时钟,Tomato Pie番茄钟

Tomato Pie插件简介 Tomato Pie 是一款开源的Chrome 新标签页扩展&#xff0c;适用于番茄工作法&#xff0c;直观&#xff0c;简单&#xff0c;拥有马赛克统计图、浏览器通知、扩展栏图标倒计时等功能。我们之前介绍过一款just Focus - 番茄钟免费应用软件(Mac、iOS)。 番茄钟是…

番茄学习--番茄工具推荐

首先,这个工具是青峰推荐的,自己觉得用的很顺手,就推荐给大家。 这是一个在线的番茄学习工具--番茄土豆。他的网址是:https://pomotodo.com/ 下面我来说说这个工具的特点吧: 首先,在开始番茄之前,你什么都不用想,只需要点击“开始一个番茄”按钮即可。这样你就开始了一…

番茄助手 VS2015

转载地址&#xff1a; https://www.cnblogs.com/DswCnblog/p/5625893.html 1. 首先在官网下载原版&#xff1a; VA_X_Setup2270_0.exe VA_X官方下载链接&#xff1a;http://www.wholetomato.com/downloads/default.asp 2. 安装官版。 3. 下载补丁 。 下载链接: http:/…

短视频平台-小说推文(番茄小说)推广任务详情

字节旗下平台:番茄小说 今日头条&#xff0c;抖音故事&#xff0c;抖音漫画官方每周只出一次数据!!!!! 预计每周二出上周四之前的数据&#xff0c;有时官方回传数据较晚&#xff0c;会延迟到周三出! 请达人知悉! 注意: 再次强调!番茄拉新规则! 是以设备第一次下载番茄小说后搜…

找不到或无法加载主类

springboot项目时不时的就会出现这个错误&#xff0c; 错误: 找不到或无法加载主类 com.ruoyi.RuoYiApplication 解决方案&#xff1a; 自己在maven clean之后&#xff0c;会把target里边的清理表&#xff0c;项目就需要重新进行编译&#xff0c;这时候如果运行的话就会出现以上…

运行mvn -v时报错:找不到或无法加载主类 org.codehaus.plexus.classworlds.launcher.Launcher

运行 mvn -v 时候出现报错 找不到或无法加载主类 org.codehaus.plexus.classworlds.launcher.Launcher 其中的可能原因为下载maven时下载了这个版本的maven&#xff08;src&#xff09; 应该下载这个版本maven&#xff08;bin&#xff09;

关于无法加载localhost/9/Login的问题以及解决办法(小白的我,大佬略过)

关于无法加载localhost&#xff1a;8088/9/Login的问题以及解决办法&#xff08;小白的我&#xff0c;大佬略过&#xff09; **这是我出现的问题。**那么如何解决呢&#xff1f;请看下面的图 其实就是正常的代码问题&#xff0c;我认为这个是我之前的习惯造成的&#xff01; 正…

错误: 找不到或无法加载主类 org.codehaus.plexus.classworlds.launcher.Launcher

起因&#xff1a;由于在做两个java项目&#xff0c;使用的jdk和maven都不一致&#xff0c;所以导致环境变量有些混乱 看来是maven出问题了 cmd mvn -v 果然&#xff0c;报错如下 The JAVA_HOME environment variable is not defined correctly This environment variable is …

找不到主类或无法加载

问题描述&#xff1a; 1、用Notepad编写了一个例子&#xff0c;在cmd模式下运行提示&#xff1a;找不到主类或无法加载。 2、打开cmd,输入java&#xff0c;java -version没有问题&#xff0c;但是javac提示不是内部命令。 问题排查&#xff1a; 1、找到java安装下的bin目录…

由于无法加载editlog导致namenode无法启动问题处理

版本:hadoop3.2.1 namenode数量:5 1. 问题描述 hadoop-nn01节点的namenode服务无法启动,报错如下Exiting with status 1: org.apache.hadoop.hdfs.server.namenode.EditLogInputException: Error replaying edit log at offset 0. Expected transaction ID was 4095226791 N…