Linux时钟管理clk_get函数透彻分析
硬件资源越来越庞大和复杂,内核的另一个挑战就是要便捷的管理这些资源。同时,面对如此之多的平台不同的CPU
,管理机制需要统一适用,这就需要对资源的管理抽象到更加通用的层次。CPU中各个模块都需要时钟驱动,内核需
要一种机制能通用所有的平台,方便的管理CPU上所有的clk资源。这里分析Linux对clk的管理。
通常操作为以下几步:
1.定义struct clk *clk;
2.获取需要操作的clock结构体 clk=clk_get(&pdev->dev, "pclk"); /* 第一个参数一般取NULL */
3.设置频率 clk_set_rate(clk); /* 返回时钟频率 */
4.产生时钟 clk_enable(clk);
5.停止时钟clk_disable(clk);
我们下面重点分析clk_get这个函数。
struct clk定义如下:
分析clk_get这个函数:
clk_get函数定义在linux-3.4.2\drivers\clk\Clkdev.c 文件中,内容如下:
这个函数有两个参数,struct device *dev这个结构非常复杂,下面有它的具体定义,一般我们设置成NULL
,第二个人参数是我们需要设置硬件上的那部分时钟,比如adc,iis,dma等。
我们继续分析clk_get里面的调用关系,调用了clk_get_sys这个函数,第一个参数我们开始设置成NULL了,
第二个参数是我们需要设置硬件相关时钟的名字。
clk_get_sys里面通过clk_find函数;来查找我们传入的硬件名称,并返回clk_lookup类型的一个指针,
clk_find函数里面就是我们最终需要查看的内容。
list_for_each_entry函数从clocks的链表中的表头,它受clocks_lock保护,开始查找和我们传入的硬件名称相比较,
如果找到了就返回一个指向该硬件clk_lookup类型的指针。
clk_get函数到此为止分析完毕,这里补充一点,那就是第二个参数在哪里定义的呢,这里我的内核版本是
Linux-3.4.2定义在 linux-3.4.2\arch\arm\plat-samsung\Clock.c中,内容如下:
<span style="font-size:18px;">struct clk clk_xtal = {.name = "xtal",.rate = 0,.parent = NULL,.ctrlbit = 0,
};struct clk clk_ext = {.name = "ext",
};struct clk clk_epll = {.name = "epll",
};struct clk clk_mpll = {.name = "mpll",.ops = &clk_ops_def_setrate,
};struct clk clk_upll = {.name = "upll",.parent = NULL,.ctrlbit = 0,
};struct clk clk_f = {.name = "fclk",.rate = 0,.parent = &clk_mpll,.ctrlbit = 0,
};struct clk clk_h = {.name = "hclk",.rate = 0,.parent = NULL,.ctrlbit = 0,.ops = &clk_ops_def_setrate,
};struct clk clk_p = {.name = "pclk",.rate = 0,.parent = NULL,.ctrlbit = 0,.ops = &clk_ops_def_setrate,
};struct clk clk_usb_bus = {.name = "usb-bus",.rate = 0,.parent = &clk_upll,
};struct clk s3c24xx_uclk = {.name = "uclk",
};</span>
Linux时钟管理clk_get函数透彻分析相关推荐
- linux内核时钟管理,Linux时钟管理透彻分析
Linux时钟管理透彻分析.硬件资源越来越庞大和复杂,内核的另一个挑战就是要便捷的管理这些资源.同时,面对如此之多的平台不同的CPU,管理机制需要统一适用,这就需要对资源的管理抽象到更加通用的层次.C ...
- Linux时钟管理clk devm_clk_get clk_prepare_enable等学习
Linux时钟管理clk devm_clk_get clk_prepare_enable等学习 一.查看系统clk命令 cat d/clk/clk_summary 二.clock获取有关的API. s ...
- Linux 时钟管理
Linux 时钟管理 时钟管理是操作系统不可或缺的一个重要组成部分.无论是应用程序还是内核本身都在大量使用各种各样的timer.本文介绍了Linux操作系统曾经使用和现在正在使用的时钟管理机制,着重阐 ...
- 【转】Linux内存管理(最透彻的一篇)
摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存的使用方法.力求从外到内.水到渠成地引导网友分析Linux的内存管理与使用.在 ...
- 【纯干货】Linux内存管理(最透彻的一篇)
摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存的使用方法.力求从外到内.水到渠成地引导网友分析Linux的内存管理与使用.在 ...
- 转载 Linux内存管理(最透彻的一篇)
摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存的使用方法.力求从外到内.水到渠成地引导网友分析Linux的内存管理与使用.在 ...
- sys_brk分析 linux1.2.0版本,linux内存管理之sys_brk实现分析
分析完linux内存管理的基本概念与实现之后,就可以接着分析用户空间与内核空间的交互操作了.Brk系统调用属于那种常用但是"可见度"不高的操作,常用于用户空间堆的管理(请参阅本站的 ...
- Linux内存管理(最透彻的一篇)
摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存的使用方法.力求从外到内.水到渠成地引导网友分析Linux的内存管理与使用.在 ...
- linux 内核flush,armv8(aarch64)linux内核中flush_dcache_all函数详细分析
/* * __flush_dcache_all() * Flush the wholeD-cache. * Corrupted registers: x0-x7, x9-x11 */ ENTRY( ...
最新文章
- 关于Centos下Clamv反病毒软件包更新问题
- linux mysql cpu 高,Linux系统中关于Mysql数据库导致CPU很高的问题解决
- Struts2知识整理
- Apache httpd Server 配置正向代理
- HashMap 死循环
- 华南农业大学c语言期末试题,华南农业大学珠学院C语言期末试卷.doc
- 4个变量取最大值 c++_DNF:安徒恩上线服务器爆满,甲板上全是火山C,通关翻出4个金牌...
- 使用replace pioneer批量修改文件名
- Java反序列化json内存溢出_fastJson与一起堆内存溢出'血案'
- Android官方开发文档Training系列课程中文版:手势处理之滚动动画及Scroller
- ruby宝石区块链最新消息_Ruby宝石| Ruby工具
- mysql 表 类型_mysql表类型
- 程序打成jar包路径不对、找不到配置文件的解决
- TongWeb7本地部署(Windows)
- 甩开三星自己干,苹果第一块自研屏幕要来了?
- 电子合同是什么意思,电子合同怎么签才有效?
- 2016年书单和电影
- 织梦防html5,织梦dedecms预防网站里的广告被浏览器阻止的方法
- 第五章-批量数据处理(数组、字符串)代码实例(C++蓝豹子)
- 科软-实习招聘-笔试面试感悟(2019.03.24~2019.05.12)