做的网站电脑上跟手机上不一样,家具设计用什么软件最好,深圳设计培训学校排行,顺德龙江做网站总结
pinctrl作为驱动 iomuxc节点在设备树里面 存储全部所需的引脚配置信息
iomux节点匹配pinctrl子系统
控制硬件外设的时候 要知道有哪些gpio 再看gpio有哪些服用寄存器 接着在程序配置gpio相关寄存器 这样搞效率很低 所以用iomux节点保存所有的引脚组 pinctrl驱动起来的时…总结
pinctrl作为驱动 iomuxc节点在设备树里面 存储全部所需的引脚配置信息
iomux节点匹配pinctrl子系统
控制硬件外设的时候 要知道有哪些gpio 再看gpio有哪些服用寄存器 接着在程序配置gpio相关寄存器 这样搞效率很低 所以用iomux节点保存所有的引脚组 pinctrl驱动起来的时候获得所有引脚信息 保存在内存
pinctrl子系统预先确定引脚的数量和名字
为每个引脚的配置信息分配内存pinctrl子系统统一管理每个引脚的使用状态 -iomux节点存放了各种引脚属性,pinctrl驱动解析iomux节点,存放引脚信息进入内存
iomux节点里如何填写
//iomuxc节点
//imx6ull.dtsi
iomuxc: iomuxc20e0000 {compatible fsl,imx6ul-iomuxc;reg 0x20e0000 0x4000;};
//继续扩展 引用iomux节点 **imx6ull-seeed-npi.dts**
iomuxc {pinctrl-names defaultinit,sleep; //选定引脚状态pinctrl-0 pinctrl_uart1; //一个状态就是一组引脚,比如对应下面pinctrl-1 xxx;pinctrl-2 yyy;
...pinctrl_uart1: uart1grp {fsl,pins MX6UL_PAD_UART1_TX_DATA__UART1_DCE_TX 0x1b0b1MX6UL_PAD_UART1_RX_DATA__UART1_DCE_RX 0x1b0b1;};...
}上面 引脚里面的宏是什么意思
MX6UL_PAD_UART1_TX_DATA__UART1_DCE_TX
#define MX6UL_PAD_UART1_TX_DATA__UART1_DCE_TX 0x0084 0x0310 0x0000 0 0mux_reg conf_reg input_reg mux_mode input_val 0x0084 0x0310 0x0000 0x0 0x0mux_reg引脚复用设置寄存器 基地址mux_reg 就是 PIN 的复用寄存器地址。 conf_reg : 设置这个引脚的电气属性的寄存器地址 基地址conf_reg 设置pin的电气属性地址 input_reg引脚输入设置寄存器 有些外设有 input_reg 寄存器 引脚需要输入功能时设置 mux_mode复用寄存器设置值 设置引脚复用 input_val输入寄存器设置值 设置引脚输入特性
宏的最后跟随了一串数字 用来设置PIN的电气属性值 比如IO 的上/下拉、驱动能力和速度等
引脚状态初始化
在设备树里面节点 会变成plantform_dev 会执行probe进行匹配驱动 但是执行probe和drv配对之前 先回执行really_porbe() 这个函数和下面的引脚状态关系很大 用来初始化引脚值
//iomuxc节点
//imx6ull.dtsi
iomuxc: iomuxc20e0000 {compatible fsl,imx6ul-iomuxc;reg 0x20e0000 0x4000;};
//继续扩展 引用iomux节点 **imx6ull-seeed-npi.dts**
iomuxc {pinctrl-names defaultinit,sleep; //选定引脚状态pinctrl-0 pinctrl_uart1; //一个状态就是一组引脚,比如对应下面pinctrl-1 xxx;pinctrl-2 yyy;
...pinctrl_uart1: uart1grp {fsl,pins MX6UL_PAD_UART1_TX_DATA__UART1_DCE_TX 0x1b0b1MX6UL_PAD_UART1_RX_DATA__UART1_DCE_RX 0x1b0b1;};...
}还是用上一个设备树举例 看了下面的例子 就知道驱动的引脚其实在 probe之前就已经初始化好了电气属性了
drivers/base/dd.c
static int really_probe(struct device *dev, struct device_driver *drv)
{int ret -EPROBE_DEFER;
...
re_probe:dev-driver drv;ret pinctrl_bind_pins(dev); //这里根据iomux节点的 几个引脚状态来初始化引脚组
...if (dev-bus-probe) {ret dev-bus-probe(dev);if (ret)goto probe_failed;} else if (drv-probe) {ret drv-probe(dev); //这个是熟悉的probeif (ret)goto probe_failed;}...}
int pinctrl_bind_pins(struct device *dev)dev-pins-default_state pinctrl_lookup_state(dev-pins-p,PINCTRL_STATE_DEFAULT);//从设备节点状态找到指定状态//本次是default状态dev-pins-init_state pinctrl_lookup_state(dev-pins-p,PINCTRL_STATE_INIT); /这次找init状态if (IS_ERR(dev-pins-init_state))pinctrl_select_state(dev-pins-p,dev-pins-default_state);//没有init状态变成default状态elseret pinctrl_select_state(dev-pins-p, dev-pins-init_state);//有的话引脚变成init状态