总体框图:

设备树iomuxc节点层次

  • iomuxc

    • function

      • grouc

        fsl,pins = <xxxxxx>;
        

      • group

    • function

层次关系说明

  • iomuxc:pinctrl子系统的设备树节点
  • function:芯片具有外设功能,一个功能对应一个或多个IO组配置信息
  • group:IO组中每个IO的配置信息
  • fsl,pins:imx6ull中,功能和IO组的标识属性

imx_pinctrl_probe_dt()函数

drivers/pinctrl/freescale/pinctrl-imx.c

static int imx_pinctrl_probe_dt(struct platform_device *pdev,struct imx_pinctrl *ipctl)
{//iomux节点struct device_node *np = pdev->dev.of_node;struct device_node *child;struct pinctrl_dev *pctl = ipctl->pctl;//获取iomux节点所对应的device_node指针//返回值为true 就是为1flat_funcs = imx_pinctrl_dt_is_flat_functions(np);if (flat_funcs) {nfuncs = 1; //一个芯片外设只使用到了一组引脚 在pinctl子系统里面,至少会有一个function来管理所有的group} else {nfuncs = of_get_child_count(np);if (nfuncs == 0) {dev_err(&pdev->dev, "no functions defined\n");return -EINVAL;}}//for (i = 0; i < nfuncs; i++) {struct function_desc *function;function = devm_kzalloc(&pdev->dev, sizeof(*function),GFP_KERNEL);if (!function)return -ENOMEM;mutex_lock(&ipctl->mutex);//把这个function_desc的指针插入到pin_function_tree上去radix_tree_insert(&pctl->pin_function_tree, i, function);mutex_unlock(&ipctl->mutex);}pctl->num_functions = nfuncs;ipctl->group_index = 0;if (flat_funcs) {pctl->num_groups = of_get_child_count(np);} else {pctl->num_groups = 0;for_each_child_of_node(np, child)pctl->num_groups += of_get_child_count(child);}if (flat_funcs) {imx_pinctrl_parse_functions(np, ipctl, 0);} else {i = 0;for_each_child_of_node(np, child)imx_pinctrl_parse_functions(child, ipctl, i++);}

imx_pinctrl_dt_is_flat_functions()函数

drivers/pinctrl/freescale/pinctrl-imx.c

static bool imx_pinctrl_dt_is_flat_functions(struct device_node *np)
{struct device_node *function_np;struct device_node *pinctrl_np;//遍历iomux节点下所有的子节点for_each_child_of_node(np, function_np) {//判断在子节点里有没有"fsl,pins"属性if (of_property_read_bool(function_np, "fsl,pins"))return true;for_each_child_of_node(function_np, pinctrl_np) {if (of_property_read_bool(pinctrl_np, "fsl,pins"))return false;}}return true;
}

imx_pinctrl_parse_functions()函数

drivers/pinctrl/freescale/pinctrl-imx.c

iomuxc节点的device_node结构体指针, ipctl, 0

参数:imx_pinctrl_parse_functions(np, ipctl, 0);

np–iomux里的device_node结构体指针,ipctl–imx_pinctrl,0

static int imx_pinctrl_parse_functions(struct device_node *np,struct imx_pinctrl *ipctl,u32 index)
{struct pinctrl_dev *pctl = ipctl->pctl;struct device_node *child;struct function_desc *func;struct group_desc *grp;u32 i = 0;//从基数树上把把之前保存的function指针重新提取出来func = pinmux_generic_get_function(pctl, index);...//相当于comptabilefunc->name = np->name;//获取iomux节点里的子节点数量(group)func->num_group_names = of_get_child_count(np);...func->group_names = devm_kcalloc(ipctl->dev, func->num_group_names,sizeof(char *), GFP_KERNEL);if (!func->group_names)return -ENOMEM;for_each_child_of_node(np, child) {//把子节点的名字记录到group_names数组中func->group_names[i] = child->name;grp = devm_kzalloc(ipctl->dev, sizeof(struct group_desc),GFP_KERNEL);if (!grp)return -ENOMEM;mutex_lock(&ipctl->mutex);radix_tree_insert(&pctl->pin_group_tree,ipctl->group_index++, grp);mutex_unlock(&ipctl->mutex);imx_pinctrl_parse_groups(child, grp, ipctl, i++);}return 0;
}

pinmux_generic_get_function()函数

drivers/pinctrl/pinmux.c

struct function_desc *pinmux_generic_get_function(struct pinctrl_dev *pctldev,unsigned int selector)
{struct function_desc *function;function = radix_tree_lookup(&pctldev->pin_function_tree,selector);if (!function)return NULL;return function;
}

imx_pinctrl_parse_groups()函数

static int imx_pinctrl_parse_groups(struct device_node *np,struct group_desc *grp,struct imx_pinctrl *ipctl,u32 index)
{const struct imx_pinctrl_soc_info *info = ipctl->info;int size, pin_size;const __be32 *list, **list_p;u32 config;int i;if (info->flags & IMX8_USE_SCU)pin_size = FSL_IMX8_PIN_SIZE;else if (info->flags & SHARE_MUX_CONF_REG)pin_size = FSL_PIN_SHARE_SIZE;elsepin_size = FSL_PIN_SIZE;//24grp->name = np->name;//获取节点属性 二维数组list = of_get_property(np, "fsl,pins", &size);...list_p = &list;.../*该组引脚的配置个数*/grp->num_pins = size / pin_size;grp->data = devm_kcalloc(ipctl->dev,grp->num_pins, sizeof(struct imx_pin),GFP_KERNEL);grp->pins = devm_kcalloc(ipctl->dev,grp->num_pins, sizeof(unsigned int),GFP_KERNEL);...//遍历组里每一个引脚for (i = 0; i < grp->num_pins; i++) {struct imx_pin *pin = &((struct imx_pin *)(grp->data))[i];if (info->flags & IMX8_USE_SCU)imx_pinctrl_parse_pin_scu(ipctl, &grp->pins[i],pin, list_p, config);elseimx_pinctrl_parse_pin_mem(ipctl, &grp->pins[i],pin, list_p, config);   //list_p引脚的配置值}return 0;
}

imx_pinctrl_parse_pin_mem()函数

drivers/pinctrl/freescale/pinctrl-memmap.c

参数:imx_pinctrl_parse_pin_mem(ipctl, &grp->pins[i],pin, list_p, config); //list_p引脚的配置值

int imx_pinctrl_parse_pin_mem(struct imx_pinctrl *ipctl,unsigned int *grp_pin_id, struct imx_pin *pin,const __be32 **list_p, u32 generic_config)
{struct imx_pin_memmap *pin_memmap = &pin->pin_conf.pin_memmap;const struct imx_pinctrl_soc_info *info = ipctl->info;//把二维数组里第一个引脚的配置信息给解析出来 保存到mux_reg上u32 mux_reg = be32_to_cpu(*((*list_p)++));u32 conf_reg;u32 config;unsigned int pin_id;struct imx_pin_reg *pin_reg;if (info->flags & SHARE_MUX_CONF_REG) {conf_reg = mux_reg;} else {conf_reg = be32_to_cpu(*((*list_p)++));if (!conf_reg)conf_reg = -1;}//获得芯片引脚的编号pin_id = (mux_reg != -1) ? mux_reg / 4 : conf_reg / 4;//找到数组元素pin_reg = &ipctl->pin_regs[pin_id];//把芯片引脚的编号记录在imx_pin结构体上的int pinpin->pin = pin_id;*grp_pin_id = pin_id;pin_reg->mux_reg = mux_reg;  //复用地址偏移值pin_reg->conf_reg = conf_reg; //属性pin_memmap->input_reg = be32_to_cpu(*((*list_p)++));pin_memmap->mux_mode = be32_to_cpu(*((*list_p)++));pin_memmap->input_val = be32_to_cpu((*(*list_p)++));...config = be32_to_cpu(*((*list_p)++));...if (config & IMX_PAD_SION)pin_memmap->mux_mode |= IOMUXC_CONFIG_SION;pin_memmap->config = config & ~IMX_PAD_SION;...return 0;
}

pin function和pin group:iomuxc节点解析始末相关推荐

  1. USB Type-C Configuration Channel (CC) pin function

    USB Type-C Configuration Channel (CC) pin function 转载2016-03-14 22:42:34 标签:信息技术 喜欢就扫码关注 USB Type-C ...

  2. Unity 之 ShaderGraph Utility节点解析汇总

    Unity 之 ShaderGraph Utility节点解析汇总 一,Logic 逻辑节点 1.1 All, Any 1.2 And, Nand, Or, Not 1.3 Branch 1.4 Co ...

  3. [JavaScript][兄弟节点] DOM节点解析

    下面是DOM解析中常用的属性及方法: //属性部分setAttribute(String key , String value) //给当前节点添加属性getAttribute(String name ...

  4. 转:mysql group by 用法解析(详细)

    group by 用法解析 group by语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表. SELECT子句中的列名必须为分组列或列函数.列函数对于GROUP BY子 ...

  5. Mybatis源码阅读(二):动态节点解析2.1 —— SqlSource和SqlNode

    *************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如 ...

  6. 输入引脚时钟约束_最强干货分享 | 时钟树例外(exclude pin、stop pin、non_stop pin、float pin)...

    <最强干货分享 时钟树例外(exclude pin.stop pin. non_stop pin.float pin)> 研究生毕业之前曾发过这篇推文,现在在原来的基础上进行了修正,又添加 ...

  7. AD原理图编译ERROR:GND contains Output Pin and Power Pin objects

    Altium designer ERROR系列: ERROR:GND contains Output Pin and Power Pin objects ERROR:Net GND countains ...

  8. Unity 之 ShaderGraph Input节点解析汇总

    Unity 之 ShaderGraph Input节点解析汇总 一,Input Basic 基础输入节点 1.1 Vector 1, 2, 3, 4 1.2 Boolean 1.3 Color 1.4 ...

  9. Unity 之 ShaderGraph Channel节点解析汇总

    Unity 之 ShaderGraph Channel节点解析汇总 一,Split 拆分节点 1.1 属性说明 1.2 示例演示 二,Combine 结合节点 2.1 属性说明 2.2 示例演示 三, ...

最新文章

  1. Android应用程序进程启动过程的源代码分析(1)
  2. python列表中包含元祖_python列表与元祖
  3. java 递归生成格雷码_格雷码的递归生成
  4. spark属性配置的优先级
  5. angularJS 上传multipart/form-data
  6. 2021抖音汽车生态报告
  7. linux服务器上文件编码格式转化shell
  8. 零基础入门Python数据分析,只需要看懂这一张图,附下载链接!
  9. CSS基础「二」复合选择器 / 元素显示模式 / 背景 / 三大特性
  10. java怎样输出闰年,Java 小日历格式输出 闰年计算
  11. strassen算法java_使用java写的矩阵乘法实例(Strassen算法)_Java_软件编程
  12. 【李宏毅2020 ML/DL】P81 Generative Adversarial Network | Intelligent Photo Editing
  13. K-Means算法的Java实现
  14. Java实现对文件的读与写
  15. VMware ESXi 7.0 U3e SLIC 2.6 Unlocker 集成 Intel NUC 网卡、USB 网卡和 NVMe 驱动 (2022.07 更新)
  16. 深挖AI价值与温度,AETA地震预测AI算法大赛开启
  17. 数字电子钟Multisim仿真(数电课设+实验报告)
  18. “理财管家”正式发布了!
  19. 实现labelme批量json_to_dataset方法(anaconda)
  20. Vue之点击收藏与取消收藏

热门文章

  1. ios 新版本 facebook SDK 分享方法
  2. Net Core Page 第一步:数据库连接设置的基本步骤
  3. 8大主流自媒体平台4大运营方法,教你正确开启自媒体运营之路
  4. Rhyme/Intellij idea 工作窗口切换快捷键,摆脱鼠标的束缚
  5. 大一MATLAB课程设计——空间曲线的切线与法平面
  6. 64gU盘格式化操作后,再次打开显示32g,恢复如下
  7. pygame模块参数汇总
  8. PowerBI基础——第二天 最强大的引擎calculate、筛选表calculatetable、高级筛选器filter
  9. 软件安全-UltraEdit恢复带毒文档
  10. rtmp 播放h265 (rtmp 播放hevc)