驱动开发时钟API的使用

时钟api的使用对于一般的驱动开发(非clock驱动),我们只需要在dts中配置时钟,然后在驱动调用通用的时钟api接口即可。
1、设备树中配置时钟
mmc0:mmc0@0x12345678{ compatible = xx,xx-mmc0; ...... clocks = ;//指定mmc0的时钟来自peri_mci0,peri_mci0的父时钟是peri clocks-names = mmc0; //时钟名,调用devm_clk_get获取时钟时,可以传入该名字 ...... };以mmc的设备节点为例,上述mmc0指定了时钟来自peri_mci0,peri_mci0的父时钟是peri,并将所指定的时钟给它命名为mmc0。
2、驱动中使用api接口
简单的使用:
/* 1、获取时钟 */host- >clk = devm_clk_get(&pdev- >dev, null); //或者devm_clk_get(&pdev- >dev, mmc0) if (is_err(host- >clk)) { dev_err(dev, failed to find clock sourcen); ret = ptr_err(host- >clk); goto probe_out_free_dev; }/* 2、使能时钟 */ret = clk_prepare_enable(host- >clk);if (ret) { dev_err(dev, failed to enable clock source.n); goto probe_out_free_dev;}probe_out_free_dev: kfree(host);在驱动中操作时钟,第一步需要获取struct clk指针句柄,后续都通过该指针进行操作,例如:设置频率:
ret = clk_set_rate(host- >clk, 300000);获得频率:
ret = clk_get_rate(host- >clk);注意:devm_clk_get()的两个参数是二选一,可以都传入,也可以只传入一个参数。
像i2c、mmc等这些外设驱动,通常只需要使能门控即可,因为这些外设并不是时钟源,它们只有开关。如果直接调用clk_ser_rate函数设置频率,clk_set_rate会向上传递,即设置它的父时钟频率。例如在该例子中直接调用clk_set_rate函数,最终设置的是时钟源peri的频率。

无菌操作及愈伤组织诱导技术
蓝牙 Mesh会是最好的物联网协议吗?
美军THAAD系统发展动向分析
德州仪器推出免费套装软件,以简化数字视频产品开发
芯片内部与外部测试的深层采样储存技术
驱动开发时钟API的使用
基于MAX5922的PSE系统电路的应用设计与实现
全新高性能、超值型APM32F465系列工业级MCU
剖析三元材料专利分布及技术走向 为我国专利申请人在该领域的专利布局提供参考
核电厂能够运营80多年才能真正的存活下来?
基于Arduino的机器学习开发
什么是汽车的智能钥匙/智能空调
蓄电池的寿命和性能与放电制度和使用条件是息息相关的
自制个人电子名片,简单实用
加速嵌入式视觉和推理的开放标准:行业概述
盘点新能源汽车补贴政策调整状况
广西敢为计划投资10亿元打造FPC生产基地
大族激光动力电池盖板组件的激光焊接应用流水线介绍
ONT是什么?
BICV车载视觉控制器全面满足L3级以下的视觉类感知需求