• 【总结】设备树语法及常用API函数【转】


    本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/74352188

    一、DTS编写语法

     

    二、常用函数

    设备树函数思路是:
    uboot启动时将设备树地址传给内核,内核解析设备树,并创建设备,初始化相关属性,驱动中通过of_get_XXX函数去获取设备树加载时创建的设备。想要知道of函数做了什么,就去追踪这个函数最后调用了什么,同时也就知道了内核解析设备树的时候为我们创建了什么。
     
    (1)of_get_named_gpio
    /**
     * include/of_gpio.h
     * of_get_named_gpio - 从设备树中提取gpio口
     * @np - 设备节点指针
     * @propname - 属性名
     * @index - gpio口引脚标号 
     * 成功:得到GPIO口编号;失败:负数,绝对值是错误码
     */
    int of_get_named_gpio(struct device_node *np, const char *propname, int index);

    (2)gpio_to_irq
    /**
     * include/gpio.h
     * PIN值转换为相应的IRQ值,中断编号可以传给request_irq()和free_irq()
     * @gpio - gpio口引脚标号 
     * 成功:得到GPIO口编号
     */
    static inline int gpio_to_irq(unsigned gpio)

    (3)devm_request_any_context_irq
    /**
     * 注册中断
     */
    devm_request_any_context_irq

    (4)of_match_ptr
    /**
     * 匹配设备树上的参数,将设备int_demo_dt_ids与驱动int_demo_driver联系起来
     * 系统会根据设备树种定义的compatible参数比较驱动中的int_demo_dt_ids中定义的 .compatible 参数
     */
    of_match_ptr(int_demo_dt_ids)
    例子:
    static const struct of_device_id int_demo_dt_ids[] = {  
        { .compatible = "tiny4412,interrupt_demo", },  
        {},  
    };  
      
    MODULE_DEVICE_TABLE(of, int_demo_dt_ids);  
      
    static struct platform_driver int_demo_driver = {  
        .driver        = {  
            .name      = "interrupt_demo",  
            .of_match_table    = of_match_ptr(int_demo_dt_ids),  
        },  
        .probe         = int_demo_probe,  
        .remove        = int_demo_remove,  
    };  
     
    (5)of_get_property
    /*
     */drivers/of/base.c
     * Find a property with a given name for a given node
     * and return the value.
     * 通过给定的设备节点和属性名字得到value。
     */
    const void *of_get_property(const struct device_node *np, const char *name,
    int *lenp)
    {
    struct property *pp = of_find_property(np, name, lenp);


    return pp ? pp->value : NULL;
    }
     
    (6)devm_pinctrl_get
    获取一个pinctrl句柄,参数是dev是包含这个pin的device结构体即xxx这个设备的device
    获取设备操作句柄(设备模型中的struct device)的pin control state holder(struct pinctrl)
    /** 
     * struct devm_pinctrl_get() - Resource managed pinctrl_get() 
     * @dev: the device to obtain the handle for 
     * 
     * If there is a need to explicitly destroy the returned struct pinctrl, 
     * devm_pinctrl_put() should be used, rather than plain pinctrl_put(). 
     */  
    struct pinctrl *devm_pinctrl_get(struct device *dev)  

    (7)pinctrl_lookup_state
    获取这个pin对应pin_state(引脚状态-turnon_tes/turnoff_tes)
    /** 
     * pinctrl_lookup_state() - retrieves a state handle from a pinctrl handle 
     * @p: the pinctrl handle to retrieve the state from 
     * @name: the state name to retrieve 
     */  
    struct pinctrl_state *pinctrl_lookup_state(struct pinctrl *p, const char *name)  

    (8)pinctrl_select_state
    设置引脚为为某个stata -- turnon_tes/turnoff_tes
    /** 
     * pinctrl_select_state() - select/activate/program a pinctrl state to HW 
     * @p: the pinctrl handle for the device that requests configuration 
     * @state: the state handle to select/activate/program 
     */  
    int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *state)  

    (9)of_get_named_gpio
    得到GPIO的编号
    ./**
     * include/of_gpio.h
     * of_get_named_gpio - 从设备树中提取gpio口
     * @np - 设备节点指针
     * @propname - 属性名
     * @index - gpio口引脚标号 
     * 成功:得到GPIO口编号int型;失败:负数,绝对值是错误码
     */
    int of_get_named_gpio(struct device_node *np, const char *propname, int index);
    of_get_named_gpio:此函数是解析设备树的函数,我们通过这个函数去解析设备树,tiny4412,int_gpio1 = <&gpx3 2 GPIO_ACTIVE_HIGH>; 
    跟踪下去会发现这个函数掉用了list = of_get_property(np, "tiny4412,int_gpio2", &size);设备树解析是创界了设备节点,现在通过这个函数去获取属性。

    (10)devm_gpio_request_one
    获取一个GPIO并初始化属性
    /**
     * devm_gpio_request_one - request a single GPIO with initial setup
     * @dev:   device to request for
     * @gpio:  the GPIO number
     * @flags:  GPIO configuration as specified by GPIOF_*
     * @label:  a literal description string of this GPIO
     */
    int devm_gpio_request_one(struct device *dev, unsigned gpio,
     unsigned long flags, const char *label)
  • 相关阅读:
    python中list添加元素的方法append()、extend()和insert()
    Python中的短路计算
    Python文件的读写
    Python匿名函数
    Python中的引用传参
    持续学习大纲
    【Mysql】Datetime和Timestamp区别,及mysql中各种时间的使用
    【JDK源码】 ☞ HashMap源码分析及面试汇总
    算法复杂度实例 -- O(1) O(n) O(logN) O(NlogN)
    Solr使用总结
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/7249969.html
Copyright © 2020-2023  润新知