OTG功能设备树配置
&pio { usb_default: default { /*默认配置可以什么都不写,但必须配置*/ }; gpio9_mode3_iddig: iddig_irq_init { pins_cmd_dat { pins = <PINMUX_GPIO9__FUNC_USB_IDDIG>; /*中断pin脚的模式*/ slew-rate = <0>; /*0:输入,1:输出*/ bias-pull-up = <00>; }; }; }; &usb0 { iddig_gpio = <9 3>; /*9号IO口的模式3*/ pinctrl-names = "default", "iddig_irq_init"; /*驱动中会使用这的名字来查询配置节点的地址,从而读出配置数据*/ pinctrl-0 = <&usb_default>; pinctrl-1 = <&gpio9_mode3_iddig>; /*绑定iddig_irq_init和gpio9_mode3_iddig*/ status = "okay"; };驱动代码读取和配置数据 /*driver中获取对应模式配置节点*/ pinctrl_drvvbus = pinctrl_lookup_state(pinctrl, "drvvbus_init"); if (IS_ERR(pinctrl_drvvbus)) { ret = PTR_ERR(pinctrl_drvvbus); dev_err(mtk_musb->controller, "Cannot find usb pinctrl drvvbus\n"); } //拿到节点 usb_node = of_find_compatible_node(NULL, NULL, "mediatek,mt6735-usb20"); //读取节点属性 of_property_read_u32_index(usb_node, "iddig_gpio", 0, &iddig_pin) /*通过pintctrl读取不同模式的GPIO看*/ pinctrl = devm_pinctrl_get(mtk_musb->controller); //读取中断pin的配置数据 pinctrl_iddig = pinctrl_lookup_state(pinctrl, "iddig_irq_init"); if (IS_ERR(pinctrl_iddig)) { ret = PTR_ERR(pinctrl_iddig); dev_err(mtk_musb->controller, "Cannot find usb pinctrl iddig_irq_init\n"); } //选择配置数据 pinctrl_select_state(pinctrl, pinctrl_iddig);