文章摘要: 描述一下设备树里的资源引用方法,知道怎么用就行了。

硬件平台: am335x
内核版本: linux-3.8.13


设备示例:

spiuart@0 {
    status = "okay";
    compatible = "hnsw,uart";
     
    spi-max-frequency=<24000000>;   // 最大频率
    reg = <1>;                      // 指的是标准的nCS引脚
        
    // 定义了3个片选引脚
    gpios-ncs = <&gpio3 14 1>,  
                <&gpio3 15 1>,  
                <&gpio3 16 1>; 

    // 定义了3个复位引脚                                          
    gpios-rst = <&gpio1 26 1>,  
                <&gpio2 28 1>,      
                <&gpio2 29 1>;
    
    /*
     * 定义了3个中断引脚,
     * 对于GPIO中断,不直接取中断向量定义  
     * 而是通过GPIO来定义  
     */  
    gpios-irq = <&gpio4 18 1>,
                <&gpio4 19 1>,      
                <&gpio4 21 1>;
};

GPIO示例:

/*
 * 通过compatible属性找到结点
 * 参数1:父结点(NULL表示根结点)
 * 参数2:设备类型
 * 参数3:compatible的属性值
 */
struct device_node *node = of_find_compatible_node(NULL, NULL,"hnsw,uart");
    
if(!node) {
    pr_err("can not find node.\r\n");
    return -1;      
}

// 获取gpios-ncs的数量,并获取端口编号
cnt = of_gpio_named_count(node, "gpios-ncs");

for(i = 0; i < cnt; i++)
{        
    spi_ncs[i] = of_get_named_gpio(node,"gpios-ncs",i); 
}

// 获取复位引脚端口    
cnt = of_gpio_named_count(node, "gpios-rst");
    
for(i = 0; i < cnt; i++)
{        
    spi_ncs[i] = of_get_named_gpio(node,"gpios-rst",i); 
}
    

中断示例

/*
 * 参数1 :结点指针
 * 参数2 :资源序号
 * 参数3 :资源结构(传出)
 * 返回值:中断号(0表示失败,用于判断结束)
 */

irq_num0 = of_irq_to_resource(node, 0, NULL);
irq_num1 = of_irq_to_resource(node, 1, r);

// of_irq_count函数实际上是通过of_irq_to_resource函数来计算
// 看起来比较鸡肋,所以没什么用

获取结点的几种方法:

// 通过路径获取结点
dev_node = of_find_node_by_path(spi->dev.of_node->full_name);