zoukankan      html  css  js  c++  java
  • 5.4.13、从驱动框架角度再来分析一下gpiolib

    5.4.13.2、从驱动框架角度再来分析一下gpiolib
    (1)之前的分析已经告一段落,截至目前我们已经搞清楚了gpiolib的建立工程。但是这只是整个gpiolib建立的一部分,是厂商驱动工程师负责的那一部分;还有另一部分是内核开发者提供的驱动框架的那一部分,就是我们后面要去分析的第2条主线。
    (2)drivers/gpio/gpiolib.c这个文件中所有的函数构成了我们第2部分,也就是内核开发者写的gpiolib框架部分。这个文件中提供的函数主要有以下部分:
    gpiochip_add: 是框架开出来的接口,给厂商驱动工程师用,用于向内核注册我们的gpiolib
    gpio_request: 是框架开出来的接口,给使用gpiolib来编写自己的驱动的驱动工程师用的,
    驱动中要想使用某一个gpio,就必须先调用gpio_request接口来向内核的gpiolib部分申请,得到允许后才可以去使用这个gpio。
    gpio_free: 对应gpio_request,用来释放申请后用完了的gpio
    gpio_request_one/gpio_request_array: 这两个是gpio_request的变种
    gpiochip_is_requested: 接口用来判断某一个gpio是否已经被申请了
    gpio_direction_input/gpio_direction_output: 接口用来设置GPIO为输入/输出模式,
    注意该函数内部实际并没有对硬件进行操作,只是通过chip结构体变量 函数指针调用了将来SoC厂商的驱动工程师写的真正的操作硬件实现gpio设置成输出模式的那个函数。

    以上的接口属于一类,这些都是给写其他驱动并且用到了gpiolib的人使用的

    剩下的还有另外一类函数,这类函数是gpiolib内部自己的一些功能实现的代码

    首先要了解一下linux内核工程师给我们开发的接口:
    文件:/drivers/gpio/gpiolib.c文件中提供所有的接口
    1:gpio_request:向内核申请gpio
    int gpio_request(unsigned gpio, const char *label)
    2:gpio_free对应gpio_request,是使用完gpio以后把gpio释放掉
    void gpio_free(unsigned gpio)
    3:gpiochip_add:向内核注册gpio
    int gpiochip_add(struct gpio_chip *chip)
    4:gpio_request_one 申请gpio
    int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
    5:gpio_request_one申请gpio
    int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
    6:gpiochip_is_requested:用来看gpio是否已经使用
    const char *gpiochip_is_requested(struct gpio_chip *chip, unsigned offset)
    7:gpio_direction_input :设置gpio输入
    int gpio_direction_input(unsigned gpio)
    8:gpio_direction_output:gpio输出
    int gpio_direction_output(unsigned gpio, int value)
    9:__gpio_get_value :获取寄存器的值 这里注意由于前面加了__是内核用的函数所以我们不能用这个函数
    在/arch/arm/mach-s5pv210/include/mach/gpio.h中定义了以下宏;所以我们使用的时候直接包含这个头文件使用gpio_get_value 函数即可

    define gpio_get_value __gpio_get_value

    define gpio_set_value __gpio_set_value

    define gpio_cansleep __gpio_cansleep

    define gpio_to_irq __gpio_to_irq

    int __gpio_get_value(unsigned gpio)
    10:__gpio_get_value :设置寄存器的值
    int __gpio_get_value(unsigned gpio)

  • 相关阅读:
    leetcode 第 44 场双周赛 1 1734. 解码异或后的排列 C
    leetcode 第 44 场双周赛 1 1732. 找到最高海拔 C
    2014浙江省赛 ZOJ
    2018沈阳区域赛现场赛 Gym
    山东省ACM多校联盟省赛个人训练第六场 poj 3335 D Rotating Scoreboard
    Minieye杯第十五届华中科技大学程序设计邀请赛现场同步赛 I Matrix Again
    计算机爱好者协会技术贴markdown第四期
    计算机爱好者协会技术贴markdown第三期
    摇骰子
    PAT 1003 dijkstra
  • 原文地址:https://www.cnblogs.com/Ocean-Star/p/9245160.html
Copyright © 2011-2022 走看看