for_each_matching_node的展开分析

for_each_matching_node(np, matches)

892 #define for_each_matching_node(dn, matches)
893 for (dn = of_find_matching_node(NULL, matches); dn;
894 dn = of_find_matching_node(dn, matches))

for (np = of_find_matching_node(NULL, matches); np; np = of_find_matching_node(np, matches))

of_find_matching_node

static inline struct device_node *of_find_matching_node(
struct device_node *from,
const struct of_device_id *matches)
{
return of_find_matching_node_and_match(from, matches, NULL);
}

/**

  • of_find_matching_node_and_match - Find a node based on an of_device_id

  •                match table.
    
  • @from: The node to start searching from or NULL, the node

  •      you pass will not be searched, only the next one
    
  •      will; typically, you pass what the previous call
    
  •      returned. of_node_put() will be called on it
    
  • @matches: array of of device match structures to search in

  • @match Updated to point at the matches entry which matched

  • Returns a node pointer with refcount incremented, use

  • of_node_put() on it when done.
    */
    struct device_node *of_find_matching_node_and_match(struct device_node *from,
    const struct of_device_id *matches,
    const struct of_device_id **match)
    {
    struct device_node *np;
    const struct of_device_id *m;
    unsigned long flags;

    if (match)
    *match = NULL;

    raw_spin_lock_irqsave(&devtree_lock, flags);
    for_each_of_allnodes_from(from, np) {// 从from开始遍历设备树节点,此循环会遍历所有设备树节点,但是一旦当前结点找到了匹配的matches,那就直接退出循环了
    m = __of_match_node(matches, np);
    if (m && of_node_get(np)) {
    if (match)
    *match = m;
    break;
    }
    }
    of_node_put(from);
    raw_spin_unlock_irqrestore(&devtree_lock, flags);
    return np;
    }
    EXPORT_SYMBOL(of_find_matching_node_and_match);

// 就是从from开始遍历设备树节点
#define for_each_of_allnodes_from(from, dn)
for (dn = __of_find_all_nodes(from); dn; dn = __of_find_all_nodes(dn))

大概看了一下逻辑,就是遍历设备树节点
struct device_node *__of_find_all_nodes(struct device_node *prev)
{
struct device_node np;
if (!prev) {
np = of_root; //第一个自然是根结点
} else if (prev->child) {
np = prev->child;//有子节点优先返回子节点
} else {
/
Walk back up looking for a sibling, or the end of the structure /
np = prev;
while (np->parent && !np->sibling)
np = np->parent;
np = np->sibling; /
Might be null at the end of the tree */ //返回兄弟结点
}
return np;
}

of_root哪里来的?
drivers/of/pdt.c:234: of_root = of_pdt_create_node(root_node, NULL);
他日有缘再细分析

// 传入一个node设备树节点,让它与给定的一组的matches匹配,返回其中最合适的matches
static const struct of_device_id *__of_match_node(const struct of_device_id *matches,
const struct device_node *node)
{
const struct of_device_id *best_match = NULL;
int score, best_score = 0;

if (!matches)
    return NULL;
// 遍历matches,返回与节点node最匹配的那个matches
for (; matches->name[0] || matches->type[0] || matches->compatible[0]; matches++) {
    score = __of_device_is_compatible(node, matches->compatible,
                      matches->type, matches->name);
    if (score > best_score) {
        best_match = matches;
        best_score = score;
    }
}

return best_match;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
INSTALL_FAILED_NO_MATCHING_ABIS是一个安装错误,在尝试安装一个包含本地库的应用程序时出现,而该应用程序没有适用于你的CPU架构的本地库。例如,如果你编译了一个适用于armv7架构的应用程序,然后尝试在使用Intel架构的模拟器上安装它,那么它将无法工作。 这个错误通常是因为手机上已经安装了相应的应用程序,但是在某些情况下,第一次安装应用程序时也可能会出现这个错误。解决这个问题的一种方法是卸载当前已安装的应用程序,然后再次尝试安装。 如果你在电脑的Android模拟器中安装应用程序时遇到了INSTALL_FAILED_NO_MATCHING_ABIS错误,可以尝试以下解决方案: 1. 确保你的模拟器使用的是与应用程序兼容的CPU架构。 2. 检查应用程序的构建配置,确保它包含适用于你的模拟器的本地库。 3. 如果可能的话,尝试使用其他模拟器或真机进行安装,看是否仍然出现相同的错误。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [安装app时报INSTALL_FAILED_NO_MATCHING_ABIS错误解决方式](https://blog.csdn.net/lnn368/article/details/51213424)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Android模拟器安装APP出现INSTALL_FAILED_NO_MATCHING_ABIS错误解决方案](https://download.csdn.net/download/weixin_38629873/14025144)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值