linux 4.4设备树文件,根据设备树文件初始化linux驱动

一、前提

新版基于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所放位置位于:

31615200cf4b4eacaf2435928f8509ad.png

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)

{

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 就会在手机/开发板启动的时候打印出来 */

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的节点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文件系统中的是否写入成功

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

# cat i2c_test

# xm_test, i2c_show

OK,搞定了。

注:当使用设备树注册设备时,设备节点名称“xm-test”不必和platform_driver.driver.name 保持一致。

也就是说:总线不会通过此两项,将设备和驱动进行匹配

ICN6211是一款设备,它的驱动可以适配到Linux4.4内核中。适配驱动Linux内核主要需要以下步骤: 1. 确定设备的硬件规格:首先,我们需要了解ICN6211的硬件规格,包括设备的型号、厂商、硬件接口等信息。这些信息对于编写设备驱动非常重要。 2. 确定设备驱动的主要功能:根据设备的硬件规格和相关文档,确定设备驱动的主要功能和操作方式。比如,确定设备初始化过程、设备的寄存器操作等。 3. 编写设备驱动代码:根据设备的硬件规格和功能需求,编写相应的驱动代码。驱动代码需要处理设备初始化、数据读写、中断处理等操作。在编写过程中,需要使用Linux内核提供的相关API和数据结构。 4. 调试和测试:完成驱动代码的编写后,需要进行调试和测试。可以通过连接ICN6211设备Linux系统上进行测试,确保设备的功能正常并且驱动代码工作稳定。 5. 添加到Linux内核:完成驱动代码的开发和测试后,可以将驱动代码提交给Linux内核团队。他们会对驱动代码进行审核和测试,并决定是否将其纳入到Linux内核主线。如果驱动代码被接受,它将作为Linux内核的一部分,并随着内核版本的更新而进行维护和更新。 总之,适配ICN6211到Linux4.4内核驱动需要进行设备硬件规格分析、驱动代码编写、调试测试等步骤,并最终将驱动代码添加到Linux内核中。这样就可以在Linux4.4内核及之后的版本中使用ICN6211设备了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值