个人网站需要多大空间,建设网站公司是什么,redis 在网站开发中怎么用,天津建设厅 注册中心网站上次文章中 我以DS18b20为例#xff0c;在设备树中定义了ds18b20的资源#xff08;device#xff09;#xff0c;当时是依葫芦画瓢#xff0c;没有深入探究#xff0c;本文主要探讨下pin在设备树中的描述
参考文章#xff1a;Linux内核中的GPIO系统之#xff08;3在设备树中定义了ds18b20的资源device当时是依葫芦画瓢没有深入探究本文主要探讨下pin在设备树中的描述
参考文章Linux内核中的GPIO系统之3pin controller driver代码分析 、fsl,imx6q-pinctrl.txt、fsl,imx-pinctrl.txt
先看我上一篇文章对ds18b20的描述 my-ds18b20 {compatible ds18b20;gpios gpio2 3 1; //有更改以这里为准};
其实这是不完整的描述因为我们仅仅指定了哪个引脚而作为GPIO是这个引脚的功能之一也许他还可以作为UART1_TX_DATA等等。那为何我们这个驱动可以成功呢因为这个引脚在其他地方进行了初始化配置为了普通GPIO。
所以完整的描述应该这样 //myimx6ek314-iomux.dtsipinctrl_nandf_pad: nandfpadgrp {fsl,pins /* All in U14 */MX6QDL_PAD_NANDF_CS0__GPIO6_IO11 0x80000000MX6QDL_PAD_NANDF_CS3__GPIO6_IO16 0x80000000MX6QDL_PAD_NANDF_WP_B__GPIO6_IO09 0x80000000MX6QDL_PAD_NANDF_D0__GPIO2_IO00 0x80000000MX6QDL_PAD_NANDF_D2__GPIO2_IO02 0x80000000MX6QDL_PAD_NANDF_D3__GPIO2_IO03 0x40000000MX6QDL_PAD_NANDF_D4__GPIO2_IO04 0x80000000MX6QDL_PAD_NANDF_D5__GPIO2_IO05 0x80000000MX6QDL_PAD_NANDF_D6__GPIO2_IO06 0x80000000MX6QDL_PAD_NANDF_D7__GPIO2_IO07 0x80000000;};//myimx6ek314.dtsimy-ds18b20 {compatible ds18b20; pinctrl-names default;pinctrl-0 pinctrl_nandf_pad;gpios gpio2 3 1; status okay;};
gpios gpio2 3 1; 对应了MX6QDL_PAD_NANDF_D3__GPIO2_IO03 宏定义 的pin configuration我们具体来看看这个宏定arch\arm\boot\dts\imx6dl-pinfunc.h //mux_reg conf_reg input_reg mux_mode input_val
#define MX6QDL_PAD_NANDF_D3__GPIO2_IO03 0x290 0x678 0x000 0x5 0x0
这个宏定义由5个数组成我们主要关心第四个mux_mode 0x5这决定了这个引脚配置为什么功能我们现在查询下芯片手册在芯片手册中搜索关键词“GPIO2_IO03” 我们配置他为GPIO模式不开启SION那么后应该配置为0101 0x5与我们宏定义相对应其实从从这个宏定义的名字我们也能看出来他配置为了GPIO模式MX6QDL_PAD_NANDF_D3__GPIO2_IO03 这个引脚原本功能为nand的data3引脚我们复用为了GPIO2_3我们在看看这个宏定义的源文件 这里可以看出NANDF_D3 还可以复用为SD1_DATA7、NAND_DATA3。
我们再来说说pinctrl-names 和pinctrl-x。以下两段摘自WOWO科技
1pinctrl-names定义了一个state列表。那么什么是state呢具体说应该是pin state对于一个client device它使用了一组pin这一组pin应该同时处于某种状态毕竟这些pin是属于一个具体的设备功能。state的定义和电源管理关系比较紧密例如当设备active的时候我们需要pin controller将相关的一组pin设定为具体的设备功能而当设备进入sleep状态的时候需要pin controller将相关的一组pin设定为普通GPIO并精确的控制GPIO状态以便节省系统的功耗。state有两种标识一种就是pinctrl-names定义的字符串列表另外一种就是ID。ID从0开始依次加一。根据例子中的定义state ID等于0名字是active的state对应pinctrl-0属性state ID等于1名字是idle的state对应pinctrl-1属性。具体设备state的定义和各个设备相关具体参考在自己的device bind。
2pinctrl-x的定义。pinctrl-x是一个句柄phandle列表每个句柄指向一个pin configuration。有时候一个state对应多个pin configure。例如在active的时候I2C功能有两种配置一种是从pin ID{7,8}引出另外一个是从pin ID{69,103}引出。
下面我再给一段供大家分析练手 //myimx6ek314-iomux.dtsi pinctrl_nandf_keys: nandfkeysgrp {fsl,pins MX6QDL_PAD_NANDF_CS2__GPIO6_IO15 0x80000000 /* KEY_VOLUMEUP */MX6QDL_PAD_NANDF_RB0__GPIO6_IO10 0x80000000 /* KEY_VOLUMEDOWN */;}; pinctrl_gpio_keys: gpiokeysgrp {fsl,pins MX6QDL_PAD_GPIO_4__GPIO1_IO04 0x80000000 /* KEY_POWER */;};//myimx6ek314.dtsigpio-keys {compatible gpio-keys;pinctrl-names default;pinctrl-0 pinctrl_nandf_keys pinctrl_gpio_keys; //配置pin 为gpiopower {label Power Button;gpios gpio1 4 1;gpio-key,wakeup;linux,code KEY_POWER;};volume-up {label Volume Up;gpios gpio6 15 1;gpio-key,wakeup;linux,code KEY_VOLUMEUP;};volume-down {label Volume Down;gpios gpio6 10 1;gpio-key,wakeup;linux,code KEY_VOLUMEDOWN;};};
2017-11-09