前面我们已经完成了CCF子系统的分析,也说明了如何实现CCF驱动,本章为该专栏的最后一篇文章,

本章我们将实现一个虚拟的gpio clk gate驱动。本章大概分为如下几个章节:
一、 本次驱动开发涉及的知识点

二、clk provider driver的实现流程说明

三、gpio clk gate driver驱动设计

一、 本次驱动开发涉及的知识点

本次驱动实践主要涉及如下几个方面的知识点:

  1. Platform device、platform drvier
  2. Gpio 驱动使用
  3. Clk provider驱动开发流程

二、clk provider driver的实现流程说明

关于clk provider driver的开发流程,在上一篇文章中已经做了说明,此处再说明一下,主要实现

流程包括如下两步:

  1. 完成clk的注册,主要是调用clk_register接口,完成上述章节一所述的内容;
  2. 完成该clk provider的map,这种map机制可以理解为定义了clk consumer与clk_provider的映射关系,即该clk provider可以给哪些clk consumer提供时钟(如针对非设备树模式,则定义了clk consumer的设备名称、clk consumer的时钟使用名称),而clk provider的map存在两种方式:
    1. 若linux不支持设备树机制,则通过调用接口clk_register_clkdev,完成这种映射操作(即完成下图中“非设备树模式下clk_core的map”)。
    2. 若linux支持设备树机制,则通过调用接口of_clk_add_provider,完成map操作(即完成下图中“设备树模式下clk_core的map”)

三、gpio clk gate driver驱动设计

本次我们主要实现gpio clk gate driver,本次实现的平台为ubuntu16.04,我们使用之前模拟的gpio chip driver,提供gpio index,从而通过gpio 的值实现gpio clk gate driver。。另外针对clk gate,仅需要提供enable、disable、is_enabled接口即可。

相关数据结构

结构体struct virt_gpio_clk_gate作为本次gpio clk gate driver的数据结构,主要包含clk provier device、gpio index描述信息;

struct virt_gpio_clk_gate

{

struct gpio_desc *gpiod_clk_gate;

struct clk_hw hw;

};

而结构体gpio_clk_gate_platform_data主要用于传递platform device for clk provider的enable gpio index信息,因为此次我们使用ubuntu16.04进行验证,因此使用该模式传递gpio 信息,包含gpio index、是否低有效等信息。

struct gpio_clk_gate_platform_data

{

int enable_gpio_index;

int active_low;

};

gpio clk provider driver实现

Gpio clk provider driver的实现如下,主要完成clk provider device注册、clk_ops的实现(enable、disable、is_enabled)等。如下即为clk provider driver的probe接口,主要调用clk_register完成clk provider的注册、并调用of_clk_add_provider/clk_register_clkdev实现clk provider的map。

该gpio clk gate provider 的clk_ops操作接口定义如下:

gpio clk consumer driver实现

该consumer driver驱动主要用于验证gpio clk provider driver是否生效,我们在probe接口完成clk的enable操作;而在remove接口完成clk 的disable操作。接口实现如下:

Virt gpio chip driver

该驱动使用的是gpio driver子系统专栏中实现的虚拟gpio驱动,本处不再细述,想要了解的童鞋请参考之前的文章。

测试验证:

  • 加载virt gpio 驱动

    1. insmod virt_gpio_dev.ko;
    2. insmod virt_gpio.ko
  • 加载gpio clk gate 驱动

    1. insmod gpio_clk_platform.ko
    2. insmod gpio_clk_driver.ko
  • 加载clk consumer device驱动
    1. insmod gpio_comsumer_device.ko
  • 查看当前gpio的值:
  • 加载clk consumer driver驱动
    1. insmod gpio_comsumer_driver.ko
  • 查看当前gpio的值

此时gpio已经改变,clk已经使能;

  • 卸载clk consumer driver驱动
    1. insmod gpio_comsumer_driver.ko
  • 查看当前gpio的值

此时gpio已经修改为0,clk 已经关闭;

以上就是本章的主要内容,我们主要实现一个gpio clk gate provider driver,至此我们基本上已完成CCF子系统的学习,本章的驱动代码链接稍后给出。

设备树与驱动的关系_Linux CommonClock Framework分析之四 gpio clk gate驱动实现相关推荐

  1. 设备树与驱动的关系_Linux I2C驱动竟然如此简单?手把手教你写i2c驱动

    Linux中I2C驱动框架分析 I2C核心(i2c_core) I2C核心维护了i2c_bus结构体,提供了I2C总线驱动和设备驱动的注册.注销方法,维护了I2C总线的驱动.设备链表,实现了设备.驱动 ...

  2. 设备树学习(二十二、番外篇-中断子系统之驱动申请API)

    本文继续参照蜗窝大神的文档,采用4.19内核的代码学习,同时会有自己的一些举例和部分代码分析 http://www.wowotech.net/sort/irq_subsystem 一.前言 本文主要的 ...

  3. 设备树学习(二十三、aliases节点分析)

    在设备树中有一个叫做aliases的节点: / {#address-cells = <1>;#size-cells = <1>;aliases {csis0 = &cs ...

  4. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之设备树模型

    文章目录 前言 1.设备树的作用 2.设备树的语法 2.1.设备树的逻辑图和dts文件.dtb文件 2.1.1.1Devicetree格式 1DTS文件的格式 node的格式 properties的格 ...

  5. Android 驱动(12)---Linux DTS(Device Tree Source)设备树详解

    Linux DTS(Device Tree Source)设备树详解 Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇) Linux DTS(Device Tr ...

  6. 【正点原子MP157连载】第二十三章 Linux设备树-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  7. 【正点原子Linux连载】第四十三章 Linux设备树 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  8. linux spidev 应用_嵌入式Linux设备树语法总结

    1 设备树的说明 在写完嵌入式驱动总结后,对于设备树相关的语法和使用一直都想进行系统的描述,但是因为最近比较忙碌,所以一直拖到现在才完成初版,对于整个嵌入式Linux驱动开发中,设备树语法和构建是其中 ...

  9. 认识设备树(二)——设备树文件的格式

    目录 前言 1 DTS文件的格式 1.1 DTS文件的总体布局 1.2 memory reservations的格式 1.3 属性的格式 1.3.1 有关属性名 1.3.2 有关属性值 1.4 节点的 ...

最新文章

  1. 8 ServletContext
  2. 转行学python后悔了-转行学Python可以吗?
  3. 【BZOJ3314】 [Usaco2013 Nov]Crowded Cows 单调队列
  4. joda jar日期处理类的学习
  5. 商品领域ddd_DDD领域驱动实战 - 限界上下文(bounded context)
  6. jboss启动之奇葩问题
  7. 避免将项目名称用作映射类型名称
  8. LeetCode 110平衡二叉树-简单
  9. python正则表达式数字开头_Python正则表达式总结
  10. Win8 Metro(C#)数字图像处理--2.40二值图像轮廓提取算法
  11. 【推荐实践】智能推荐算法在直播场景中的应用
  12. 地统计学之变异函数深入理解与分析
  13. Scratch3.0 保存缩略图
  14. java实现word(docx)在线编辑(word转html,html转word)——代码实现
  15. 龙芯2f笔记本安装debian错误--bzcat
  16. 利用接口和继承实现  求三角形 圆形面积 和以圆形为底的圆锥形的体积
  17. 2022 年最新博客专家申请流程
  18. Spring学习笔记(一):眼见为实,先上一个简单例子
  19. html5鼠标悬停图片放大的原理,jQuery当鼠标悬停时放大图片的效果实例
  20. HTML区块元素(讲解及示例)

热门文章

  1. 查看关于yum的配置
  2. Python脚本如何生成Windows可执行文件.exe
  3. C语言32个关键字与C++62个关键字详解
  4. [云炬创业学笔记]第一章创业是什么测试12
  5. USTC English Club Note20171019(2)
  6. 荣耀X8碎屏2020-05-14
  7. 燃烧学往年精选真题解析 2018-01-01
  8. 图像处理实战 多张曲线同图共舞
  9. tkFileDialog报错,模块未找到出错:没有名字叫做 tkFileDialog 的模块
  10. pythonurllib微博登录怎么删_Python骚操作之删微博还需用手动吗?Python去做就好了!...