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 =
;
10 };
11
12 volume-down {
13 label = "Volume Down";
14 gpios = <&gpio1 19 GPIO_ACTIVE_LOW>;
15 linux,code = ;
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中命名字段更多使用"-"而非下划线"_".