基于pinctrl 和 devcice tree的SOC GPIO 使用

原创 2016年06月01日 11:02:45

在嵌入式系统开发中,我们不可避免的要跟SOC 的GPIO模块打交道。在单片机的开发中,我们一般使用的是下面的模式

void XXX_init()

{

//gpio fuction mux select


//peripheral regsiter configure


//other related software resourece init


}

其实在早期的linux系统中,外设的初始化也是一个类似的过程,只不过是要使用linux提供提供的一些接口而已,不像单片机可以随心所欲的写code


但是随着linux的发展 device tree已经慢慢统治了powerpc linux和arm linux。就使用来说,的确是简单了很多,但是linux引入了大量的框架来支持这些便利,要多了一些需要精读的代码,这里不分析代码实现的细节,只是从使用的角度来记录一下,方便以后的工作中,查询使用。

这里分三种情况来举例说明

1. 外围控制器的mux功能选择,以IPQ409的SPI控制器举例,这里主要用的是PINCTRL 的MUX 设定

要想把某组pin分配给SPI0控制器,需要在dts里做如下定义:

1).定义一个pn mux

spi_0_pins: spi_0_pinmux {
mux {
pins = "gpio12", "gpio13", "gpio14", "gpio15"; //pin列表,可以查看芯片手册获取这个group
function = "blsp_spi0";
bias-disable;
};

2).在spi的控制器节点引用之

spi_0: spi@78b5000 {

/* BLSP1 QUP1 */
pinctrl-0 = <&spi_0_pins>;
pinctrl-names = "default";
status = "ok";



m25p80@0 {
#address-cells = <1>;
#size-cells = <1>;
reg = <0>;
compatible = "n25q128a11";
linux,modalias = "m25p80", "n25q128a11";
spi-max-frequency = <24000000>;
use-default-sizes;
};
};

2. 定义pin为gpio,并设置默认的 输入输出属性已经上下拉配置以及驱动电流等

dts文件里在pinctrl节点下添加以下定义,可以定义若干pin group,或者只对某个pin做特殊的描述,

gpio可以配置的属性如下:


 bias-disable – disable any pin bias
 bias-pull-up – pull up the pin
 bias-pull-down – pull down the pin
 drive-strength – sink or source at most X mA
 input-enable – enable input on pin (no effect on output)
 input-disable – disable input on pin (no effect on output)
 output-low – set the pin to output mode with low-level
 output-high – set the pin to output mode with high-level

 pinctrl@0x01000000 {
            pinctrl-0 = <&example_gpio>;
            pinctrl-names = "default";


            ............
            example_gpio: hw_gpio{
                led{
                    pins = "gpio37","gpio42","gpio51","gpio52","gpio61","gpio68";
                    output-low;
                };
                gpio{
                    pins = "gpio49";
                    output-high;
                };
                gpio_i2c{
                    pins = "gpio21","gpio20";
                    drive-strength = <4>;
                };
            };
          .................

};

3. 在某个device node需要使用gpio,或者使用gpio作为中断输入

这里以一个GPIO模拟的I2C控制器举例

i2c_1 {
        compatible = "atmel,i2c-gpio";
        status = "ok";
        gpios = <&tlmm 21 0      &tlmm 20 0>; /*i2c pin */
        i2c-gpio,delay-us = <2>;
        i2c-gpio,scl-open-drain;
        #address-cells = <1>;
        #size-cells = <0>;

        isl28022@40 {
                /* power monitor */
                compatible = "isl,isl28022";
                reg = <0x40>;

              /*use gpio 43 as gpio interrupt,tlmm is the gpio controller defined in the example soc system*/

                interrupt-parent = <&tlmm>;
                interrupts = <43 0x8>;
                irq-gpio = <&tlmm 43 0>;

        };


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

[转]OpenGL Frame Buffer Object (FBO)

Related Topics:Pixel Buffer Object (PBO)Download:fbo.zip , fboDepth.zip , fboStencil.zipOverviewCr...

Source Insight背景颜色设置成保护色

Option->Perferences->Color->Window background 设置自定义背景色R(红)204  G(绿)232  L(蓝)207

linux驱动开发书籍(待续)

(mine) C Primer Plus(第五版) 高质量程序设计指南.C语言(第三版) 林锐 [C.C...Java.程序设计经典教程] Linux指令速查手册 Linux设备...

MIPI CSI-2规范一——概述及层级

CSI-2概述     CSI-2规范定义了发送者和接收者之间传输和控制接口的标准数据。数据传输接口(指CSI-2)是单向差分串行接口,传输数据和始终信号;接口的物理层说明文档参见《MIPIAl...

设计模式之五 --- 代理(Proxy)模式

【1】基本概念            代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。代理者可以作任何东西的接口:网络连接、内存中的大物件、档案或其它昂贵或无法复制的资源。 ...
  • cjjky
  • cjjky
  • 2012-03-07 22:34
  • 21127

Android显示系统框架原理介绍

1. android显示系统整体框架         最上面一层为应用程序,根据数据类型以及应用的不同可以分为几种。        第一种是最普通的应用,如 ...

Source Insight背景颜色设置成保护色

Option->Perferences->Color->Window background 设置自定义背景色R(红)204  G(绿)232  L(蓝)207

SurfaceFlinger简介

1. SurfaceFlinger背景知识         SurfaceFlinger 是一个独立的Service, 它接收所有Window的Surface作为输入,根据ZOrder, 透明度,大小...

全志H3平台CLOCK简析

1 概要 时钟管理模块是linux系统为统一管理各硬件的时钟而实现管理框架,负责所有模块的时钟调节和电源管理。 1.1 模块功能介绍 时钟管理模块主要负责处理各硬件模块的工作频率调节及电源切换管...
  • dlijun
  • dlijun
  • 2016-06-30 18:39
  • 3688
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)