溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么根據(jù)設(shè)備樹文件初始化linux驅(qū)動

發(fā)布時間:2021-10-22 10:00:06 來源:億速云 閱讀:167 作者:柒染 欄目:互聯(lián)網(wǎng)科技

這篇文章將為大家詳細(xì)講解有關(guān)怎么根據(jù)設(shè)備樹文件初始化linux驅(qū)動,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

一、前提

新版基于ARM的Linux都會基于Device Tree去代替之前的device驅(qū)動。更加多的了解Device Tree可以訪問寶哥的Bolg:ARM Linux 3.x的設(shè)備樹(Device Tree)

這里只是舉例在arch/arm/boot/dts中添加dtsi文件并在驅(qū)動中讀取dtsi中節(jié)點(diǎn)信息,并將節(jié)點(diǎn)信息寫入sys文件系統(tǒng),至于怎么創(chuàng)建、讀寫sys文件可以參考: linux sysfs下創(chuàng)建文件

二、舉例

1、添加dtsi文件

添加的dtsi文件可以基于你所用的手機(jī)或者開發(fā)板確定放入什么位置。dts總目錄:arch/arm/boot/dts

例中dtsi所放位置位于: 
怎么根據(jù)設(shè)備樹文件初始化linux驅(qū)動

xm-test.dtsi:

/ {
	xm-test {
		compatible = "xiaomi,xm-test";
		xm_test_tip;
	};
};

其中xm-test、”xiaomi,xm-test”必須具有唯一性。

注:需要在audio.dtsi文件中添加#include “xm-test.dtsi”具體在哪個文件下添加include根據(jù)實際情況而定。

2、驅(qū)動

#include <linux/init.h>
#include <linux/module.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/sysfs.h>
#include <linux/slab.h> 
#include <linux/kernel.h>
#include <linux/kobject.h>
#include <linux/string.h>
#include <linux/of.h>

#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)
    {
        printk( "xiaomi_test: xm_test_probe failed, pdev is NULL\n");
        return 0;
    }

    if(NULL == pdev->dev.of_node)
    {
        printk( "xiaomi_test: xm_test_probe failed, of_node is NULL\n");
        return 0;
    }
	/* 存在 xm_test_tip 就會在手機(jī)/開發(fā)板啟動的時候打印出來 */
    if(of_property_read_bool(pdev->dev.of_node, HW_TEST))
    {
        printk( "xm_test: %s is existing\n", HW_TEST);
    }

	printk("============== hanshubo ================\n");

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

static struct platform_driver xm_test = {
	// device_driver
    .driver = {
        /* 這里的name不需要跟dtsi的節(jié)點(diǎn)xm-test一致 */
        .name  = "xm-test",
        .of_match_table = audio_info_match_table,
        .owner  = THIS_MODULE,
        .groups = groups,
    },

    .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");

3、檢驗sys文件系統(tǒng)中的是否寫入成功

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

# cat i2c_test
# xm_test, i2c_show

注:當(dāng)使用設(shè)備樹注冊設(shè)備時,設(shè)備節(jié)點(diǎn)名稱“xm-test”不必和platform_driver.driver.name 保持一致。

也就是說:總線不會通過此兩項,將設(shè)備和驅(qū)動進(jìn)行匹配

關(guān)于怎么根據(jù)設(shè)備樹文件初始化linux驅(qū)動就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI