基于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>;

        };


使能MT7620的第二个SPI接口(cs1)——兼谈pinmux与pinctrl驱动

前言 根据MT7620的数据手册,该芯片支持两个独立的spi接口,由于驱动不完善等种种原因,一直没能顺利的使用第二个spi接口.近日对mt7620的spi好好研究了一下,终于使能了第二个spi接口,...
  • manfeel
  • manfeel
  • 2015年02月08日 10:40
  • 12369

Linux内核中的pinctrl子系统应用实例

Linux内核中的pinctrl子系统应用实例     由于近期在做一个项目用到了pinctrl子系统,但是对pinctrl子系统了解又不是很多,所以遇到了麻烦,但是找度娘发现很少有同行对pinctr...

pinctrl_select_state函数使用示例

在驱动中,芯片休眠后,为了节省电流,需要设置引脚的状态,可参考如下的例子。 在引脚控制文件中,添加如下定义如kernel/arch/arm/boot/dts/qcom/msm8996-pinctrl...

gpio子系统和pinctrl子系统(一)

转自http://blog.rongpmcu.com/gpiozi-xi-tong-he-pinctrlzi-xi-tong/ 前言   随着内核的发展,linux驱动框架在不断的...

gpio子系统和pinctrl子系统(三)

转自http://blog.rongpmcu.com/gpiozi-xi-tong-he-pinctrlzi-xi-tong-xia/ 情景分析 打算从两个角度来情景分析,先从bs...

gpio子系统和pinctrl子系统(上)

随着内核的发展,linux驱动框架在不断的变化。很早很早以前,出现了gpio子系统,后来又出现了pinctrl子系统。在网上很难看到一篇讲解这类子系统的文章。...

device tree 内 default pinctrl 和 probe的先后顺序

注册 driver时,default pinctrl是在 driver probe之前的。 1,xref: /kernel-3.18/include/linux/platform_device.h...

使用pinctrl子系统实现引脚功能动态切换

使用pinctrl子系统实现动态切换引脚功能   设备dts (msm8909-pinctrl.dtsi) &soc {          tlmm_pinmux:pinctrl@100000...

msm平台GPIO相关的device tree设置

转http://www.ithao123.cn/content-8794703.html msm平台GPIO相关的device tree设置 [摘要:GPIO相干的dvice tree...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于pinctrl 和 devcice tree的SOC GPIO 使用
举报原因:
原因补充:

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