在Linux DeviceTree添加dtsi文件并在驱动中读取节点信息写入sys文件系统

一、前提

新版基于ARM的Linux都会基于Device Tree去代替之前的device驱动。更加多的了解Device Tree可以访问宝哥的Bolg:ARM Linux 3.x的设备树(Device Tree)

这里只是举例在arch/arm/boot/dts中添加dtsi文件并在驱动中读取dtsi中节点信息,并将节点信息写入sys文件系统,至于怎么创建、读写sys文件可以参考: linux sysfs下创建文件

二、举例

1、添加dtsi文件

添加的dtsi文件可以基于你所用的手机或者开发板确定放入什么位置。dts总目录:arch/arm/boot/dts

例中dtsi所放位置位于:
这里写图片描述

xm-test.dtsi:

/ {
    xm_test {
        compatible = "xiaomi,xm_test";
        xm_test_tip;
    };
};

其中xm_test、”xiaomi,xm_test”必须具有唯一性。

注:需要在audio.dtsi文件中添加#include “xm-test.dtsi”具体在哪个文件下添加include根据实际情况而定。

2、驱动

#include 
#include 
#include 
#include 
#include 
#include  
#include 
#include 
#include 
#include 

#define HW_TEST "xm_test_tip"
#define i2c_info "xm_test, i2c_show"

static ssize_t show(struct device_driver *driver, char *buf)
{
    if(NULL != buf)
    {
        /* Newline is not appended on purpose, for convenience of reader programs */
        snprintf(buf, PAGE_SIZE, "%s\n", i2c_info);
        return strlen(buf);
    }

    return 0;
}
DRIVER_ATTR(i2c_test, 0444, show, NULL);

static struct attribute *audio_attrs[] = {
    &driver_attr_i2c_test.attr,
    NULL,
};

static struct attribute_group audio_group = {
    .name ="xm_test",
    .attrs = audio_attrs,
}; 

static const struct attribute_group *groups[] = {
    &audio_group,
    NULL,
};

static int xm_test_probe(struct platform_device *pdev)
{
    if(NULL == pdev)
    {
        ad_loge( "xiaomi_test: xm_test_probe failed, pdev is NULL\n");
        return 0;
    }

    if(NULL == pdev->dev.of_node)
    {
        ad_loge( "xiaomi_test: xm_test_probe failed, of_node is NULL\n");
        return 0;
    }
/* 存在 xm_test_tip 就会在手机/开发板启动的时候打印出来 */
    if(of_property_read_bool(pdev->dev.of_node, XM_TEST))
    {
        ad_loge( "xm_test: %s is existing\n", XM_TEST);
    }

    return 0;
}
/* .compatible的信息要与dtsi中的compatible一致 */
static struct of_device_id audio_info_match_table[] = {
    { .compatible = "xiaomi,xm_test",},
    { },
};

static struct platform_driver xm_test = {
    .driver = {
        /* 当然这里的name也要跟dtsi的节点xm_test一致 */
        .name  = "xm_test",
        .owner  = THIS_MODULE,
        .groups = groups,
        .of_match_table = audio_info_match_table,
    },

    .probe = xm_test_probe,
    .remove = NULL,
};

static int __init audio_info_init(void)
{
    return platform_driver_register(&xm_test);
}

static void __exit audio_info_exit(void)
{
    platform_driver_unregister(&xm_test);
}

module_init(audio_info_init);
module_exit(audio_info_exit);
MODULE_LICENSE("GPL");

注:Makefile别忘了修改

3、检验sys文件系统中的是否写入成功

在sys/bus/platform/drivers/xm_test中会找到文件i2c_test文件:

# cat i2c_test
# xm_test, i2c_show

一切搞定@|@

你可能感兴趣的:(linux驱动,Android,Android,Audio)