文档章节

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

宁宁爸
 宁宁爸
发布于 2016/02/15 17:02
字数 577
阅读 343
收藏 3

一、前提

新版基于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 <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 就会在手机/开发板启动的时候打印出来 */
    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 保持一致。

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



© 著作权归作者所有

宁宁爸
粉丝 82
博文 58
码字总数 26478
作品 0
高级程序员
私信 提问
Framebuffer 驱动学习总结(一) ---- 总体架构及关键结构体

一、Framebuffer 设备驱动总体架构 帧缓冲设备为标准的字符型设备,在Linux中主设备号29,定义在/include/linux/major.h中的FBMAJOR,次设备号定义帧缓冲的个数,最大允许有32个FrameBuffer...

天王盖地虎626
06/06
14
0
Debian6 FlashCache使用

Flashcache是Facebook技术团队开发的一个内核模块,通过在文件系统(VFS)和设备驱动之间新增一次缓存层,可以用SSD作为介质的缓存,通过将传统硬盘上的热门数据缓存到SSD上,加速服务器磁盘...

China_OS
2013/03/19
525
0
深入探究Linux/VxWorks设备树视频教程-宋宝华-专题视频课程

深入探究Linux/VxWorks设备树视频教程—5116人已学习 课程介绍 很多人看了很Linux多设备树的资料后,还是不会用设备树。该Linux设备树视频课程假设一个全新的电路板,上面有4个ARM核,一片中...

21cnbao
2017/08/16
0
0
01@ V4L2框架分析学习一

1、概述. Video4Linux2是Linux内核中关于视频设备的内核驱动框架,为上层的访问底层的视频设备提供了统一的接口。 凡是内核中的子系统都有抽象底层硬件的差异,为上层提供统一的接口和提取出...

singledevil0
2018/04/17
0
0
RK3288开发板PopMetal上的GPIO驱动实例

楼主在这边给大家介绍下如何使用PopMetal的GPIO。先讲过程,再讲原理吧, 该驱动需要涉及到的知识点:1,DTS设备树的作用,2,platform虚拟总线驱动的编写。 第一步,添加DTS节点 在/kernel...

穿prada的008
2015/08/03
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot 403 问题

添加WebAppConfigurer 配置 @Configuration@EnableAutoConfigurationpublic class WebAppConfigurer extends WebMvcConfigurerAdapter { public WebAppConfigurer() { } ......

布袋和尚_爱吃鱼
17分钟前
3
0
Python自动更换壁纸爬虫与tkinter结合

直接上代码 import ctypesimport timeimport requestsimport osfrom threading import Threadfrom tkinter import Tk, Label, Button,Entry,StringVar,messagebox# '放到AppData\Roami......

物种起源-达尔文
17分钟前
2
0
Postgresql Study 笔记

Postgresql 安装 Windows, MAC Install Postgresql 下载地址: https://www.enterprisedb.com/downloads/postgres-postgresql-downloads Linux Install sudo apt-get update sudo apt-get in......

slagga
19分钟前
3
0
layer.open 打开新页面传参问题

如图所示,点击出售,把A页面的数据传到弹框上面,因为弹框比较复杂,所以使用引入一个新页面。 A.html a.js B.html b.js 1、第一种方案 sellInte: function (){ var obj = document.g...

木九天
22分钟前
3
0
沙龙报名 | 区块链数据服务技术应用实践

京东云是国内首家提供区块链数据在线分析服务产品的公司,也是行业内首家对区块链数据服务进行开源的公司。 本次沙龙是京东云BDS开源后,首次在深圳举办线下沙龙,我们将邀请京东云BDS团队核...

京东云技术新知
23分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部