Linux驱动程序--设备树资源引用
文章摘要: 描述一下设备树里的资源引用方法,知道怎么用就行了。
硬件平台: 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);