Linux BSP 开发的基础就是和GPIO打交道, 下面总结下这几天对某家开发板的GPIO控制的知识。

  公司的开发板用的是 DTB  模式 ,首先,进入 dts,dtsi文件查看关于GPIO 的模块。

soc {
.
.
.
gpio0: gpio@****addr {
compatible = "**********";
reg = < 0x****addr 0x50>;
interrupts = <SPI IRQ_TYPE_LEVEL_HIGH>;
#gpio-cells = <>;
gpio-controller;
gpio-ranges = <&pfc >;
#interrupt-cells = <>;
interrupt-controller;
clocks = <&cpg CPG_MOD >;
power-domains = <*****>;
};
.
.
. };

  可以看到 GPIO 节点 挂在 SOC node 下 ,手上这块开发板 把GPIO分成了8个 bank  :  gpio0 - gpio7

    reg =<0 地址 0 长度>

#gpio-cells  =<2> 表示 要用2个cell描述一个 GPIO引脚

    如 I2C中定义 :  pwd-gpios  = <&gpio6 7 GPIO_ACTIVE_HIGH>;

    表示 bank 6 的gpio  用 2个cell 描述  :7,GPIO_ACTIVE_HIGH (7表示bank 6 下的第七个引脚一般是 GP 6_07表示  ;GPIO_ACTIVE_HIGH则为高电平有效)

    gpio-controller;  interrupt-controller; 表示 bank 0 下的引脚 既可以作为中断引脚 ,也可以作为 通用的GPIO引脚

gpio-ranges = <&pfc 0 0 16>;  表示 bank 0下有16个 GPIO引脚

  GPIO 使用 pinctrl 方式来驱动 ,pin control subsystem 会 :

    1. 枚举所有可用的pin 脚   ,于是每个引脚就有的唯一的 ID (num) ,这个ID 很关键,对于以后的操作。

    

enum {
PINMUX_RESERVED = , PINMUX_DATA_BEGIN,
GP_ALL(DATA), /* add GP_0_1_DATA ,GP_0_1_DATA..... */
PINMUX_DATA_END, #define F_(x, y) .....
}

    2.管理 这些Pin脚的, 由于pin 可以复用 比如 SPI 和GPIO 复用一个pin脚 如:  GP2_08 / MISO,于是引申出 pin group 和 pin functon 两个概念:

    i2c2_pins: i2c2 {
groups = "i2c2_a";
function = "i2c2";
};

    在dts 中如上所示 ,其中 i2c2_a 在 pinctl 源码中 如下所示,i2c的两根引脚使用 GP5_0 ,GP5_4.

static const unsigned int i2c2_a_pins[] = {
/* SDA, SCL */
GP_PIN(, ),GP_PIN(, ),
};

    function 如下 :

struct sh_pfc_function {
const char *name;
const char * const *groups;
unsigned int nr_groups;
};
#define SH_PFC_FUNCTION(n = i2c2) \
{ \
.name = #n, \
.groups = n##_groups, \
.nr_groups = ARRAY_SIZE(n##_groups), \
}

好了 ,基本概念就先写这么多  。

内核层配置 GPIO

在 写内核驱动的时候 如果希望配置某个GPIO引脚 , 可以在dts中 添加:  pwd-gpios  = <&gpio0 7 GPIO_ACTIVE_HIGH>;

在 driver 代码中 ,  需要包含 #include <linux/gpio.h>使用 :

    gpio_id = of_get_named_gpio(your_driver->dev->of_node,"pwd-gpios", 0);

获取 GP0_07的 ID号 ,然后申请 一个GPIO 操作对象。

    if (gpio_is_valid(gpio_id))  //判断一个IO是否合法

      devm_gpio_request_one(&platform_device->dev, gpio_id,GPIOF_OUT_INIT_LOW, name);

设置GPIO的方向,如果是输出同时设置电平:
    /* set as input or output, returning 0 or negative errno */
    int gpio_direction_input(unsigned gpio);
    int gpio_direction_output(unsigned gpio, int value);

获取输入引脚的电平:
    /* GPIO INPUT: return zero or nonzero */
    int gpio_get_value(unsigned gpio);

设置输出: 
    void gpio_set_value(unsigned gpio, int value);

释放申请的GPIO对象 

       void gpio_free(unsigned gpio);

将GPIO映射为IRQ中断:
    /* map GPIO numbers to IRQ numbers */
    int gpio_to_irq(unsigned gpio);

    /* map IRQ numbers to GPIO numbers (avoid using this) */
    int irq_to_gpio(unsigned irq);

设置GPIO IRQ中断类型:

    set_irq_type(gpio_to_irq( gpio), IRQ_TYPE_EDGE_FALLING);

用户层配置 GPIO

需要确认  内核  menuconfig  中 Device Drivers -》  GPIO Support  设 y .

在 /sys/class/gpio  目录下如下所示 :

root@salvator-x:/sys/class/gpio# ls
export gpiochip361 gpiochip419 gpiochip453 gpiochip496
gpiochip357 gpiochip393 gpiochip437 gpiochip468 unexport

gpiochip 后面的数字 是每个bank 的基地址  也就是  GP0 对应 gpiochip468

那么  GP0_07 的 ID 就是  468 + 7 ;(可能不同的内核版本,或者 开发板不一样 )通过 :

root@salvator-x:/sys/class/gpio# echo  > export

会对应生成 gpio475 目录

root@salvator-x:/sys/class/gpio/gpio475# ls
active_low device direction edge power subsystem uevent value

通过

root@salvator-x:/sys/class/gpio/gpio475# echo  >value
root@salvator-x:/sys/class/gpio/gpio475# echo >value
root@salvator-x:/sys/class/gpio/gpio475# echo "in" > direction
root@salvator-x:/sys/class/gpio/gpio475# echo "out" > direction

来控制输出输入  ,电平高低 。

最后,关于 Pinctrl 的内容还有太多要写,就先写到这把。。。。。

来不及写 参考文档了,具体是 结合 wowotech 和 公司的设备,要下班了。。。

ADD :..........................................................................

获取GPIO不同组 基地址的 bash 命令 :

for i in gpiochip* ; do echo `cat $i/label`: `cat $i/base` ; done

Linux 内核层和 用户层 配置 GPIO 引脚的更多相关文章

  1. 【windows 操作系统】【CPU】用户模式和内核模式(用户层和内核层)

    所有的现代操作系统中,CPU是在两种不同的模式下运行的: 注意以下内容来自微软: windows用户模式和内核模式 运行 Windows 的计算机中的处理器有两个不同模式:用户模式 和内核模式 . 用 ...

  2. linux内核空间与用户空间信息交互方法

    linux内核空间与用户空间信息交互方法     本文作者: 康华:计算机硕士,主要从事Linux操作系统内核.Linux技术标准.计算机安全.软件测试等领域的研究与开发工作,现就职于信息产业部软件与 ...

  3. linux内核态和用户态的信号量

    在Linux的内核态和用户态都有信号量,使用也不同,简单记录一下. 1> 内核信号量,由内核控制路径使用.内核信号量是struct semaphore类型的对象,它在中定义struct sema ...

  4. Linux内核态和用户态

    两张图说明Linux内核态和用户态之间的关系

  5. 向Windows内核驱动传递用户层定义的事件Event,并响应内核层的通知

    完整的程序在下载:http://download.csdn.net/detail/dijkstar/7913249 用户层创建的事件Event是一个Handle句柄,和内核中的创建的内核模式下的KEV ...

  6. Linux内核驱动学习(八)GPIO驱动模拟输出PWM

    文章目录 前言 原理图 IO模拟输出PWM 设备树 驱动端 调试信息 实验结果 附录 前言 上一篇的学习中介绍了如何在用户空间直接操作GPIO,并写了一个脚本可以产生PWM.本篇的学习会将写一个驱动操 ...

  7. enc28j60网卡驱动模块添加进linux内核,Kconfig,Makefile配置过程

    这里是要把http://www.cnblogs.com/hackfun/p/6260396.html中的enc28j60网卡驱动模块,添加到2.6.22.6内核中,这个模块代码不需要任何修改.只需要在 ...

  8. Linux内核中断引入用户空间(异步通知机制)【转】

    转自:http://blog.csdn.net/kingdragonfly120/article/details/10858647 版权声明:本文为博主原创文章,未经博主允许不得转载. 当Linux内 ...

  9. Linux内核驱动学习(六)GPIO之概览

    文章目录 前言 功能 如何使用 设备树 API 总结 前言 GPIO(General Purpose Input/Output)通用输入/输出接口,是十分灵活软件可编程的接口,功能强大,十分常用,SO ...

随机推荐

  1. Content-type的几种常见类型

    一.是什么? 是Http的实体首部字段,用于说明请求或返回的消息主体是用何种方式编码,在request header和response header里都存在. 二.几个常用类型: 1.applicat ...

  2. 6.20校内考试整理——大美江湖&&腐草为萤&&锦鲤抄题解

    先安利一下题目作者:一扶苏一 先看第一题: 这道题就是一道简单的模拟题,只要不管一开始的位置,模拟移动与格子对应的触发事件就行了.话不多说,看代码: #include<iostream> ...

  3. 将HTML5封装成android应用APK文件若干方法(转)

          HTML5拥有很多让人期待已久的新特性.HTML5的优势之一在于能够实现跨平台游戏编码移植,现在已经有很多公司在移动设备上使用HTML5技术.随着HTML5跨平台支持的不断增强和智能手机的 ...

  4. Linux下JDK1.7升级1.8版本

    先下载 jdk-8u45-linux-x64.rpm 然后上传到  /usr/local/src  去.当然其他目录也可以.这里是默认位置 给所有用户添加可执行权限 #chmod +x jdk-8u4 ...

  5. 图论——图的邻接表实现——Java语言(完整demo)

    1.图的简单实现方法——邻接矩阵 表示图的一种简单的方法是使用一个一维数组和一个二维数组,称为领接矩阵(adjacent matrix)表示法. 对于每条边(u,v),置A[u,v]等于true:否则 ...

  6. P3373线段树2

    #include<bits/stdc++.h> using namespace std; typedef long long ll; ; ll sum[N<<],lazy1[N ...

  7. All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters

    ValueError: All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control character ...

  8. Jmeter之JDBC--Mysql

    一.添加JDBC Connection Configuration控件 界面显示如下: 配置说明: 1.名称:标识 2.注释:备注信息 3.Variable Name:定义的变量名,供后续调用: 4. ...

  9. 解决Delphi窗体缩放の疑难杂症

    http://anony3721.blog.163.com/blog/static/511974201082235754423/ 解决Delphi窗体缩放の疑难杂症 2010-09-22 15:57: ...

  10. It's strange. I felt less lonely when I didnt know you.

    feasible:adj. 可行的 bypass: v. 绕开,避开 eclipse: n. 月食 raw: adj. 生的 foresee:v. 预见 premier:n. 总理 ,adj: 首要的 ...