zoukankan      html  css  js  c++  java
  • GPIO驱动概述

    一、在kernel代码中操作gpio

    在代码中有两种方式操作gpio:一种是一次申请单个gpio,通过设备树,成功后操纵该gpio。另一种是使用pinctrl子系统,通过设备树设置,一次操作多个gpio。

    1.直接操作GPIO

    因为GPIO一般都是平台设备驱动,所以一般设备树挂载的节点都在&soc下:

    device_node {
        ...
        gpio_name = <&msm_gpio 99 0>; //gpio_99
        ...
    }

    驱动代码:

    int gpio_99 = of_get_named_gpio_flags(dev->of_node, "gpio_name", 0, NULL); //从设备树节点获取gpio号
    gpio_request(gpio_99, "gpio_name"); //通过gpio号申请gpio
    gpio_direction_output(gpio_99, 1);  //设置gpio_99输出,初始值为1
    gpio_set_value(gpio_99, 0);         //设置gpio_99值为0
    gpio_free(gpio_99);                 //gpio_99不再使用后应当释放

    gpio的申请和设置都可能会出现失败的情况,应该做好异常处理。

    2. pinctrl子系统设备树:

      Pin Control Subsystem是Linux内核抽象出的一套用于控制硬件引脚的一套子系统。比上面的方式多了许多配置GPIO的方式,例如配置电流(可以用于睡眠唤醒的功能),管理pin脚的复用,接口规格等功能;蜗窝科技的大牛们就有几篇写的很好:

    linux内核中的GPIO系统之(1):软件框架 http://www.wowotech.net/gpio_subsystem/io-port-control.html

    linux内核中的GPIO系统之(2):pin control subsystem http://www.wowotech.net/gpio_subsystem/pin-control-subsystem.html

    Linux内核中的GPIO系统之(3):pin controller driver代码分析 http://www.wowotech.net/gpio_subsystem/pin-controller-driver.html

    linux内核中的GPIO系统之(4):pinctrl驱动的理解和总结 http://www.wowotech.net/gpio_subsystem/pinctrl-driver-summary.html

    linux内核中的GPIO系统之(5):gpio subsysem和pinctrl subsystem之间的耦合 http://www.wowotech.net/gpio_subsystem/pinctrl-and-gpio.html

    设备树:

    device_node {
        ...
        pinctrl-names = "gpio_active", "gpio_sleep"; //分别对应pinctrl-0和pinctrl-1
        pinctrl-0 = <&gpio_active>; //引用
        pinctrl-1 = <&gpio_sleep>;  //引用
        ...
    };

    驱动代码:

    struct pinctrl *pinctrl = devm_pinctrl_get(device); //获取device对应节点下的pinctrl
    struct pinctrl_state *pinstate= pinctrl_lookup_state(pinctrl, "gpio_active"); //通过pinctrl名获取pinctrl对应状态
    pinctrl_select_state(pinctrl, pinstate); //设置pinctrl的状态为'gpio_active
    devm_pinctrl_put(pinctrl); //使用完了释放资源
  • 相关阅读:
    171. Excel Sheet Column Number (Easy)
    349. Intersection of Two Arrays (Easy)
    453. Minimum Moves to Equal Array Elements (Easy)
    657. Judge Route Circle (Easy)
    CSS笔记
    保存页面状态
    UI开发总结
    ubuntu 下配置munin
    反向代理配置
    JavaScript 高级程序设计第二版
  • 原文地址:https://www.cnblogs.com/hellokitty2/p/12339891.html
Copyright © 2011-2022 走看看