Linux CommonClock Framework分析之四 gpio clk gate驅動實現

2020-08-29 jerry的編程路

前面我們已經完成了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分析之三 驅動開發流程說明
    本篇文章主要介紹CCF子系統下驅動程序的開發,本章涉及如下三個方面的內容:一、clk註冊與註銷接口說明 二、clk驅動開發流程 三、clk使用流程 四、依據clk provider用途封裝的註冊接口 一、clk註冊與註銷接口說明
  • LINUX CommonClock Framework子系統分析之一 系統概述
    本專欄主要介紹linux的ccf子系統,主要用於系統clock的管理等操作。本專欄我們大概分為如下幾章進行學習:一、CCF子系統概述二、CCF子系統數據結構分析及關聯說明三、CCF子系統的clk註冊與註銷接口實現分析四、虛擬的clk設備驅動實現 本章我們主要進行CCF子系統的概述。
  • Linux CommonClock Framework分析之二 CCF子系統內部實現簡述
    我們主要從如下幾點說明CCF子系統的內部設計流程:一、 CCF子系統內部數據結構的定義與關聯二、CCF子系統提供的接口一、 CCF子系統內部數據結構的定義與關聯在我們學習linux內核各子系統模塊時,通過其內部數據結構的定義及關聯,即可大致掌握其實現過程及所需要提供的接口等等
  • ZYNQ Linux作業系統移植四個部分說明文檔
    > ZYNQ上面移植Linux作業系統包括四個部分,uboot,devicetree,kernel,ramdisk.內核中已經集成了常見的驅動,驅動源碼位於drivers文件夾下。   3、NOR FLASH驅動 NOR FLAHS驅動主要實現文件系統的掛載,這裡不需要設置devicetree,只需要在內核中添加掛載文件系統的代碼
  • 嵌入式Linux設備驅動開發之:GPIO驅動程序實例
    在此主要以發光二極體(LED)和蜂鳴器為例,討論GPIO設備的驅動程序。它們的硬體驅動電路的原理圖如圖11.4所示。圖11.4LED(左)和蜂鳴器(右)的驅動電路原理圖在圖11.4中,可知使用S3C2410處理器的通用I/O口GPF4、GPF5、GPF6和GPF7分別直接驅動LEDD12、D11、D10以及D9,而使用GPB0埠驅動蜂鳴器。4個LED分別在對應埠(GPF4~GPF7)為低電平時發亮,而蜂鳴器在GPB0為高電平時發聲。
  • ARMLinux驅動Watch Dog Timer(看門狗)驅動分析
    2、驅動分析下面是自己的驅動分析,如有理解錯誤,請指正注,為了儘量是驅動容易理解,這個驅動暫時將有關電源管理的功能刪除了,等理解透徹再完善#include #include #include #include #include
  • 「正點原子FPGA連載」第九章Linux顯示設備的使用
    1)摘自【正點原子】領航者 ZYNQ 之Linux驅動開發指南2)實驗平臺:正點原子領航者ZYNQ開發板3)平臺購買地址:https://item.taobao.com/item.htm?本章我們講解如何使用Petalinux配置Linux內核和設備樹來驅動HDMI顯示器和LCD液晶屏。9.1準備工作HDMI的顯示首先需要硬體層面的支持,在《領航者ZYNQ之嵌入式開發指南》的《SD卡讀BMP圖片HDMI顯示實驗》中我們實現了裸機驅動HDMI的顯示,可見硬體層面是沒有問題的。
  • dm6441的gpio驅動
    由於硬體資源的原因,DM6441並不是GPIO管腳就是純粹的GPIO腳,GPIO管腳和其他一些標準接口復用相同的引腳,比如SPI和GPIO復用,I2C和GPIO復用等,到底是使用GPIO還是其他接口,在初始化的時候,都需要對PINMUX0和PINMUX1兩個寄存器進行設置(見DM6441的晶片p72),而軟體設置則在Montavista linux-2.6.18_pro500
  • S3C2440驅動篇—看門狗驅動分析
    後來想想,這裡還必須要「餵狗」一次,因為當上面我們判斷到寫入的數據是"V"時,看門狗定時器的當前操作狀態馬上被設置為關閉,再當驅動去調用看門狗設備驅動的關閉接口函數時,看門狗定時器中斷被禁止,無法再實現「餵狗」,所以這裡要手動「餵狗」一次,否則定時器溢出系統被復位*/s3c2410wdt_keepalive();}return len;}#define OPTIONS (WDIOF_SETTIMEOUT
  • I2C總線驅動程序
    #include "linux/kernel.h"#include "linux/module.h"#include "linux/i2c.h"#include "linux/init.h"#include "linux/time.h"#include "linux/interrupt.h"
  • 嵌入式Linux之我行——LED驅動在2440上的實例開發
    一、開發環境主機:VMWare--Fedora 9開發板:Mini2440--64MB Nand編譯器:arm-linux-gcc-4.3.2二、實現步驟
  • s3c2410上iis接口的uda341驅動的學習
    uda1341需要了解的東西就這麼多了,接下來就可以看實際的驅動了.網上找了個lfc修改過的uda1341驅動,不過仿佛是基於OSS的,先對它進行分析,了解下驅動本身的東西,後文貼的源碼我以注釋的形式增加了自己的一些理解.
  • PWM在ARM Linux中的原理和蜂鳴器驅動實例開發
    由原理圖可以得知,蜂鳴器是通過GPB0 IO口使用PWM信號驅動工作的,而GPB0口是一個復用的IO口,要使用它得先把他設置成TOUT0 PWM輸出模式。=clk_get(NULL,"pclk");pclk=clk_get_rate(clk_p);//從系統平臺時鐘隊列中獲取pclk的時鐘頻率,在include/linux/clk.h中定義tcnt=(pclk/50/16)/cmd;//計算定時器0的輸出時鐘頻率(pclk/{prescaler0 + 1}/divider value)__raw_writel(tcnt
  • 基於Linux系統實現DragonBoard 410c GPIO的控制
    通過晶片的GPIO口輸出電平去控制外部設備,如繼電器、LED或者觸發某些模塊進行工作是嵌入式控制系統常用的功能,也是實現許多複雜控制系統的基礎,本文將教大家基於DragonBoard 410c GPIO開發板在linux的環境下完成對DragonBoard 410c GPIO的控制,並且通過控制按鍵和點亮LED等進行實例測試以熟悉整個GPIO操作過程。
  • 「正點原子FPGA連載」第二十七章gpio子系統下的驅動實驗
    1)摘自【正點原子】領航者 ZYNQ 之linux驅動開發指南2)實驗平臺:正點原子領航者ZYNQ開發板3)平臺購買地址:https://item.taobao.com/item.htm?在上一章當中已經給大家介紹了linux的gpio子系統,那本章我們就來編寫一個基於gpio子系統API的led驅動程序,本章將在第二十五章實驗的基礎上進行修改完成。
  • 「正點原子Linux連載」第五十六章Linux自帶的LED燈驅動實驗
    56.2 Linux內核自帶LED驅動簡介56.2.1 LED燈驅動框架分析LED燈驅動文件為/drivers/leds/leds-gpio.c,大家可以打開/drivers/leds/Makefile這個文件,找到如下所示內容:示例代碼56.2.1.1
  • 「正點原子Linux連載」第六十一章Linux I2C驅動實驗
    61.1 Linux I2C驅動框架簡介回想一下我們在裸機篇中是怎麼編寫AP3216C驅動的,我們編寫了四個文件:bsp_i2c.c、bsp_i2c.h、bsp_ap3216c.c和bsp_ap3216c.h。其中前兩個是I.MX6U的IIC接口驅動,後兩個文件是AP3216C這個I2C設備驅動文件。
  • ARM Linux下訪問GPIO埠
    對GPIO的控制是編寫驅動程序最常見和重要的一項工作內容。在Linux內核代碼中,已經提供了針對三星S3C2410/S3C2440等晶片GPIO的控制。版本中可能不一樣,2.6.30.4是按照上面的方式,下圖是2.6.22.6的實現方法 linux/include/asm-arm/arch-s3c2410/map.h#ifndef __ASSEMBLY__#define S3C2410_ADDR(x) ((void __iomem *)0xF0000000 + (x))#else
  • Linux regulator子系統分析之四 虛擬regulator device驅動實現
    在前面幾章,我們分析了regulator子系統框架,主要是從數據結構及數據結構間的關聯分析了regulator子系統。為了讓大家對regulator子系統有一個深入的認識,我們本章將實現一個虛擬的regulator device驅動,從而掌握對regulator子系統的開發流程。
  • 「正點原子FPGA連載」第二十二章Linux LED驅動開發
    1)摘自【正點原子】領航者 ZYNQ 之linux驅動開發指南2)實驗平臺:正點原子領航者ZYNQ開發板3)平臺購買地址:https://item.taobao.com/item.htm?本章我們就開始編寫第一個真正的Linux字符設備驅動。在領航者開發板上有6個LED燈,在《領航者ZYNQ之嵌入式開發指南》中已經編寫過LED燈的裸機驅動,本章我們就來學習一下如何編寫Linux下的LED燈驅動程序,本章我們只驅動底板上的PS_LED0燈。22.1Linux下LED燈驅動原理Linux下的任何外設驅動,最終都是要配置相應的硬體寄存器。