设备树 之pinctrl

三个重要概念

 

bank :

gpa0, gpa1, gpa31等

group:

以功能划分,比如uart的tx和rx

state:

设备的某种状态,比如"default", "idle","sleep",也可以是其他自定义的状态, 比如串口的“flow_ctrl”状态

 

 

例如:

bank:

&pinctrl_0 {
    
  /*
  * pin banks
  */  
  
  /*
  * flags : 0 active high, 1 active low
  */
  gpa :gpa {      
    gpio-controller;          // 必须的属性,表示bank
    #gpio-cells = <2>;        // [pin_number, flags],用于识别引脚
  };
};

group:pin-ctrl的子节点

uart0_data : uart0_data {
  samsung,pins = "gph-0","gph-1";      // 表示哪几个引脚
  samsung,pin-function = <2>;          // 查看手册,服用功能时reg里面的值,对于uart,gphcon对应gph0,   gph1 =2时表示串口, =0时表示输入
};

state:

uart0_data : uart0_data {
  samsung,pins = "gph-0","gph-1";      // 表示哪几个引脚
  
  /*
  * 在GPHCON寄存器里面, GPH0,GPH1可以设置:
  * 0 ---输入功能
  * 1 ---输出功能
  * 2 ---串口功能
  */
  samsung,pin-function = <2>;         
};

uart0_sleep : uart0_sleep {
  samsung,pins = "gph-0","gph-1";      // 表示哪几个引脚
   /*
  * 在GPHCON寄存器里面, GPH0,GPH1可以设置:
  * 0 ---输入功能
  * 1 ---输出功能
  * 2 ---串口功能
  */
  samsung,pin-function = <0>;          
};

以上定义了两个group

 

serial@50000000 {
    
  ...
  pinctrl-names = "default","sleep";        # 既是名字,也是state
  pinctrl-0 = <&uart0_data>;
  pinctrl-1 = <&uart0_sleep>;
};

pinctrl-names定义了两种state : default 和 sleep

default : 对应的引脚是pinctrl-0 ,他指定了group是uart0_data

sleep : 对应的引脚是pinctrl-1,他指定的group是uart0_sleep

 

内核里面pinctrl的使用

  1. platform_device,platform_driver匹配时,最终调用了really_probe

  2. really_probe
    	pinctrl_bind_pins	
    		pinctrl_lookup_state #获取default状态的pinctrl
    		pinctrl_select_state

     

  3. 手动获取状态的api:

    devm_pinctrl_get_select_default使用default状态的引脚
    pinctrl_get_select根据name选取某种状态的引脚
    pinctrl_put不再使用退出时调用
  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
瑞芯微设备树中的pinctrl节点配置主要包括以下内容: 1. 定义pinmux功能: 首先需要定义pinmux功能,即将一个pin口配置成特定功能的过程。例如将一个GPIO口配置成UART功能。 2. 定义pin配置: 然后需要定义每个pin的配置,包括引脚的电气特性(如上拉、下拉等)、信号类型(如输入、输出等)等。 3. 定义pinctrl-group: 将一组pin配置成一个pinctrl-group,表示这组pin可以同时被配置为某种功能。 4. 定义pinctrl-state: 定义pinctrl-state表示一种特定的pinctrl-group的配置状态。 在瑞芯微设备树中,pinctrl节点的具体配置方法如下: 1. 定义pinmux功能: ``` pinctrl@10002000 { compatible = "rockchip,rk3399-pinctrl"; reg = <0x0 0x10002000 0x0 0x1000>; #address-cells = <1>; #size-cells = <0>; uart0grp: uart0grp { rockchip,pins = <1 2>; rockchip,function = <RK_FUNC_UART>; }; }; ``` 在上述代码中,定义了一个pinctrl节点,表示的是瑞芯微rk3399芯片的pinctrl模块。其中,uart0grp是一个pinctrl-group,表示将pin1和pin2配置为UART功能。rockchip,function = <RK_FUNC_UART>表示这个pinctrl-group的功能为UART。 2. 定义pin配置: ``` &gpio0 { status = "okay"; uart0_cts_pin: uart0-cts-pin { rockchip,pins = <3 RK_PA3 RK_FUNC_GPIO &pcfg_pull_up>; }; uart0_rts_pin: uart0-rts-pin { rockchip,pins = <4 RK_PA4 RK_FUNC_GPIO &pcfg_pull_up>; }; }; ``` 在上述代码中,定义了GPIO0口的配置。其中,uart0_cts_pin表示将GPIO0.3配置成UART0的CTS引脚,rockchip,pins = <3 RK_PA3 RK_FUNC_GPIO &pcfg_pull_up>表示将pin3配置成GPIO口,并开启上拉电阻。uart0_rts_pin同理,表示将GPIO0.4配置成UART0的RTS引脚。 3. 定义pinctrl-group: ``` uart0grp: uart0grp { rockchip,pins = <1 2>; rockchip,function = <RK_FUNC_UART>; }; ``` 在上述代码中,定义了一个pinctrl-group,表示将pin1和pin2配置为UART功能。 4. 定义pinctrl-state: ``` &uart0 { pinctrl-names = "default"; pinctrl-0 = <&uart0grp>; }; ``` 在上述代码中,定义了一个pinctrl-state,表示将UART0口配置成uart0grp这个pinctrl-group的状态。pinctrl-names = "default"表示默认使用该状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值