美文网首页
Linux内核pinctrl

Linux内核pinctrl

作者: 小田BSP | 来源:发表于2022-06-04 21:11 被阅读0次

    本文基于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
    

    注:转载请标明出处。

    相关文章

      网友评论

          本文标题:Linux内核pinctrl

          本文链接:https://www.haomeiwen.com/subject/nddlmrtx.html