2. 通常会碰到的实际问题
到此,问题出现了:
1. 当写一个按键驱动,应该如何在*.dts或者*.dtsi中操作?
2. 当在串口driver中需要使用到某个pin脚作为普通输出IO,该如何操作?
3. 当在串口driver中需要使用某个muxpin脚作为ADC或者其他服用功能该如何操作?
4. 当在串口driver中有可能想使能某个功能而不想写定在driver代码中,该如何操作?
5. 当想向driver中传入一个常数如做delay延时操作等等,该如何操作?
解答:
1. 当写一个按键驱动,应该如何在*.dts或者*.dtsi中操作?
1 gpio-keys { 2 compatible = "gpio-keys"; 3 pinctrl-names = "default"; 4 pinctrl-0 = <&pinctrl_gpio_keys>; 5 6 volume-up { 7 label = "Volume Up"; 8 gpios = <&gpio1 18 GPIO_ACTIVE_LOW>; 9 linux,code = <KEY_VOLUMEUP>; 10 }; 11 12 volume-down { 13 label = "Volume Down"; 14 gpios = <&gpio1 19 GPIO_ACTIVE_LOW>; 15 linux,code = <KEY_VOLUMEDOWN>; 16 }; 17 };
1 pinctrl_gpio_keys: gpio_keysgrp { 2 fsl,pins = < 3 MX6SX_PAD_CSI_DATA04__GPIO1_IO_18 0x17059 4 MX6SX_PAD_CSI_DATA05__GPIO1_IO_19 0x17059 5 >; 6 };
2. 当在串口driver中需要使用到某个pin脚作为普通输出IO,该如何操作?
1 sii902x_reset: sii902x-reset { 2 compatible = "gpio-reset"; 3 reset-gpios = <&gpio3 27 1>; 4 reset-delay-us = <100000>; 5 #reset-cells = <0>; 6 status = "disabled"; 7 };
最简单的不需要pinctrl来进行pin脚的设置,为什么???
3. 当在串口driver中需要使用某个muxpin脚作为ADC或者其他服用功能该如何操作?
这个问题其实上面有提到,就像上述的多个pin-names和多个pinctrl在后面的pinctrl中配置这个复用的管脚即可。
4. 当在串口driver中有可能想使能某个功能而不想写定在driver代码中,该如何操作?
1 &uart5 { 2 pinctrl-names = "default"; 3 pinctrl-0 = <&pinctrl_uart5>; 4 fsl,uart-has-rtscts; 5 status = "okay"; 6 7 };
只需要在driver中使用of函数读取此属性,如果有此字段,可以使能某些操作;如果没有就失能某些操作。
5. 当想向driver中传入一个常数如做delay延时操作等等,该如何操作?
1 &usdhc3 { 2 pinctrl-names = "default", "state_100mhz", "state_200mhz"; 3 pinctrl-0 = <&pinctrl_usdhc3>; 4 pinctrl-1 = <&pinctrl_usdhc3_100mhz>; 5 pinctrl-2 = <&pinctrl_usdhc3_200mhz>; 6 bus-width = <8>; 7 cd-gpios = <&gpio2 10 GPIO_ACTIVE_HIGH>; 8 wp-gpios = <&gpio2 15 GPIO_ACTIVE_HIGH>; 9 keep-power-in-suspend; 10 enable-sdio-wakeup; 11 vmmc-supply = <&vcc_sd3>; 12 status = "okay"; 13 };
只需要在driver中读取bus-width字段的值,即可获取到8这个常量,注意在devicetree中命名字段更多使用"-"而非下划线"_".