linux i2c驱动开发之最简单入门:设备树与驱动的匹配

1在设备树中声明我们的模拟I2C设备:

i2c的设备加入是必须放在某个i2c的总线下面的,我们这里是放在 i2c7下面。
可以直接在设备树搜索&i2c7,然后把status 修改为okay,然后再加入设备信息.

&i2c7 {
	status = "okay";
	 myi2c-dev {
		status = "okay";
		compatible ="myi2c-dev";
		reg = <0x70>;
	};
};

这里我们指定和驱动匹配的字符串是 myi2c-dev,在bus segment 上分配的地址是 0x70 。
当然这个地址是我们随便写的,我们只是模拟而已,不会和真正的设备交互。

然后编译,烧录系统。

2 驱动代码:

#include <linux/uaccess.h>
#include <linux/fs.h>
#include <linux/stat.h>
#include <linux/cdev.h>
#include <linux/io.h>
#include <linux/gpio.h>
#include <linux/slab.h>
#include <linux/irq.h>
#include <linux/mutex.h>
#include <linux/interrupt.h>
#include <linux/bug.h>			/* For BUG_ON.  */
#include <linux/cpu.h>
#include <linux/init.h> /* Needed for the macros */
#include <linux/kernel.h> /* Needed for pr_info() */
#include <linux/module.h> /* Needed by all modules */
#include <linux/delay.h>
#include <linux/smp.h>
#include <linux/kernel_stat.h>
#include <linux/sched.h>
#include <linux/percpu-defs.h>
#include <linux/wait.h>
#include <linux/gpio/driver.h>
#include <linux/atomic.h>
#include <linux/platform_device.h>
#include <linux/poll.h>
#include <linux/kfifo.h>
#include <linux/timer.h>
#include <linux/gpio/consumer.h>
#include <linux/module.h>
#include <linux/i2c.h>
#include <linux/acpi.h>
#include <linux/regmap.h>
#include <linux/iio/iio.h>
#include <linux/iio/sysfs.h>

/**

dts:

&i2c7 {
	status = "okay";

	 myi2c-dev@77 {
		status = "okay";
		compatible ="myi2c-dev";
		reg = <0x77>;
	};

};


 */

static const struct i2c_device_id my_i2c_id[] = { { "myi2c-dev", 0 }, { }, };

int my__probe(struct i2c_client *client, const struct i2c_device_id *id) {
	pr_info("my_probe\n");
	return 0;
}

int my_remove(struct i2c_client *client) {
	pr_info("remove\n");
	return 0;
}

static struct i2c_driver my_i2c_driver = {
		.driver =
		{ .name = "my_i2c_driver", },
		.probe = my__probe,
		.id_table = my_i2c_id,
		.remove = my_remove, };

module_i2c_driver( my_i2c_driver);

MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("Andy");
MODULE_DESCRIPTION("andy one-key driver");
MODULE_ALIAS("one-key");

id_table 指定和哪个设备匹配。

编译模块,然后insmod,就可以在dmesg中看到打印的信息:my_probe
说明驱动和设备成功匹配.

同时我们可以执行:

tree   /sys/bus/i2c/drivers/my_i2c_driver

来查看此驱动是否有匹配的设备。

会有以下输出:

/sys/bus/i2c/drivers/my_i2c_driver
├── 7-0077 -> ../../../../devices/platform/ff160000.i2c/i2c-7/7-0077
├── bind
├── module -> ../../../../module/a2
├── uevent
└── unbind

其中../../../../devices/platform/ff160000.i2c/i2c-7/7-0077 表示匹配的设备。

欢迎各位评论。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值