Linux内核pinctrl

本文基于RockPI 4A单板介绍Linux内核pinctrl的相关知识点。

Linux内核pinctrl部分主要包括 :IOMUX,驱动强度,上下拉配置等。

一、IOMUX

SOC芯片上有很多引脚,每个引脚对应特定的功能。为了使SOC的多个功能共用一个引脚,从而提高引脚的功能,降低引脚的数量。引入了IOMUX的概念。IOMUX(Input-Output Multiplexer):IO多路复用器。

以RK3399 EMMC接口为例,RK3399 EMMC接口的emmc_pwren引脚需要设置IOMUX功能,具体如下:

图1:RK3399 EMMC引脚

注:在Linux系统中,使用功能复用的引脚前,必须先配置该引脚对应的功能。一般在dtsi中配置,也有的SOC在RCW(如NXP LX1046A)或其它文件中配置。如果引脚功能配置不正确,会导致功能无法使用。

二、PINCTRL

RK3399 Linux内核pinctrl配置文件: arch/arm64/boot/dts/rockchip/rk3399.dtsi

    pinctrl: pinctrl {
        compatible = "rockchip,rk3399-pinctrl";
        rockchip,grf = <&grf>;
        rockchip,pmu = <&pmugrf>;
        #address-cells = <2>;
        #size-cells = <2>;
        ranges;

        ## 1、配置GPIO0功能,RK3399可配置GPIO0 - GPIO4,共5组引脚。
        gpio0: gpio0@ff720000 {
            compatible = "rockchip,gpio-bank";
            reg = <0x0 0xff720000 0x0 0x100>;
            clocks = <&pmucru PCLK_GPIO0_PMU>;
            interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH 0>;

            gpio-controller;
            #gpio-cells = <0x2>;

            interrupt-controller;
            #interrupt-cells = <0x2>;
        };
        ...

        ## 2、配置芯片引脚内部上下拉功能
        pcfg_pull_up: pcfg-pull-up {
            bias-pull-up;
        };

        pcfg_pull_down: pcfg-pull-down {
            bias-pull-down;
        };
        ...

        ## 3、配置引脚驱动强度,即配置对应的驱动强度电流值
        pcfg_pull_up_20ma: pcfg-pull-up-20ma {
            bias-pull-up;
            drive-strength = <20>;
        };
        ...

        ## 4、配置输出电平
        pcfg_output_high: pcfg-output-high {
            output-high;
        };
        ...

        ## 5、配置引脚指定功能,如emmc_pwren。
        emmc {
            # 引脚名称:IO_EMMCpwren_PMUdebug3_PMU18gpio0a5
            emmc_pwr: emmc-pwr {
                rockchip,pins =
                    ## 0 5:表示引脚索引,对应GPIO0A5,见图1
                    ## RK_FUNC_1:配置功能1,即emmc_pwren,见图2
                    ## pcfg_pull_up:引脚上拉
                    <0 5 RK_FUNC_1 &pcfg_pull_up>;  
            };
        };
        ...
    };

RK_FUNC_*定义文件: include/dt-bindings/pinctrl/rockchip.h

## 对应IOMUX寄存器中引脚的某个功能
#define RK_FUNC_GPIO    0
#define RK_FUNC_1       1
#define RK_FUNC_2       2
#define RK_FUNC_3       3
#define RK_FUNC_4       4
#define RK_FUNC_5       5
#define RK_FUNC_6       6
#define RK_FUNC_7       7
图2 RK3399 EMMC_PWREN引脚配置

驱动文件: drivers/pinctrl/pinctrl-rockchip.c

## RK3399 GRF寄存器包括:
## 1、GRF, used for general non-secure system,
## 2、PMUGRF, used for always on sysyem
static struct rockchip_pin_ctrl rk3399_pin_ctrl = {
        .pin_banks      = rk3399_pin_banks,
        .nr_banks       = ARRAY_SIZE(rk3399_pin_banks),
        .label          = "RK3399-GPIO",
        .type           = RK3399,
        .grf_mux_offset     = 0xe000, ## GRF MUX寄存器偏移地址,配置IOMUX
        .pmu_mux_offset     = 0x0,    ## PMUGRF MUX寄存器偏移地址,配置IOMUX
        .grf_drv_offset     = 0xe100, ## GRF DRV寄存器偏移地址,配置驱动强度
        .pmu_drv_offset     = 0x80,   ## PMUGRF DRV寄存器偏移地址,配置驱动强度
        .iomux_routes       = rk3399_mux_route_data,
        .niomux_routes      = ARRAY_SIZE(rk3399_mux_route_data),
        .pull_calc_reg      = rk3399_calc_pull_reg_and_bit, ## 上下拉配置实现函数
        .drv_calc_reg       = rk3399_calc_drv_reg_and_bit,  ## 驱动强度实现函数
};

三、内核调试

在Linux系统启动后,可以查看引脚功能,如:

## 1、通过pingroups查看引脚配置功能
root@linaro-alip:/sys/kernel/debug/pinctrl/pinctrl# cat pingroups
registered pin groups:
group: emmc-pwr    ## GPIO0A5配置为emmc_pwren功能
pin 5 (gpio0-5) 

group: rgmii-pins
pin 113 (gpio3-17)
pin 110 (gpio3-14)
...

## 2、通过寄存器值查看
## 0xff320000是PMU GRF寄存器的基地址,PMUGRF_GPIO0A_IOMUX偏移地址是0
## PMUGRF_GPIO0A_IOMUX的值为0x5400,即bit11:10为01,表示配置为emmc_pwren
## 寄存器的值见图2
root@linaro-alip:/# io -4 -l 16 -r 0xff320000
ff320000:  00005400 00000000 00000000 00000000

注:转载请标明出处。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,635评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,543评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,083评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,640评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,640评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,262评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,833评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,736评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,280评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,369评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,503评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,870评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,340评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,460评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,909评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,512评论 2 359

推荐阅读更多精彩内容