迅为i.MX6ULL开发板I2C总线实现driver驱动

文章讲述了在Ubuntu环境下,于/i2c目录下创建driver.c文件来设计i2c驱动的driver部分,包括i2c_board_info结构体的使用、设备树匹配以及驱动的probe和remove函数。代码示例展示了如何初始化i2c_driver结构体并注册到内核。在加载驱动前需恢复设备树节点并重新编译。最后,通过查看/sys/bus/i2c/devices/目录确认I2C节点是否生成,并通过nfs共享目录加载驱动模块。
摘要由CSDN通过智能技术生成

上一章节我们写了 client.c,并且我们已经成功地把它加载到内核里面。i2c 用非设备树实现,我们需要

 

用 i2c_board_info 这个结构体来描述我们的 i2c 设备,如果我们用设备树的方法来实现,我们直接在设备树

的节点下面添加创建对应设备的节点就可以了。后面的实验我们都用设备树的,非设备树的方法了解一下

就可以了,本章节我们来设计 i2c 驱动的 driver 部分。

我们在 Ubuntu 的/home/topeet/driver/imx6ull/40i2c 目录下新建一个 driver.c 文件,拷贝前面实验的

Makefile,driver.c 文件的代码如下所示:

/*

* @Author: topeet

* @Description: i2c 总线实现 driver 驱动

*/

#include <linux/init.h>

#include <linux/module.h>

#include <linux/i2c.h>

//与设备树的 compatible 匹配

static const struct of_device_id ft5x06_id[] = {

{.compatible = "edt,edt-ft5306", 0},

{.compatible = "edt,edt-ft5x06", 0},

{.compatible = "edt,edt-ft5406", 0},

{}};

// 无设备树的时候匹配 ID 表

static const struct i2c_device_id ft5x06_id_ts[] = {

{"xxxxx", 0},

{}};

/* i2c 驱动的 remove 函数 */

int ft5x06_remove(struct i2c_client *i2c_client)

{

return 0;

}

/* i2c 驱动的 probe 函数 */

int ft5x06_probe(struct i2c_client *i2c_client, const struct i2c_device_id *id)

{

printk("This is ft5x06_probe\n");

return 0;

}

//定义一个 i2c_driver 的结构体

static struct i2c_driver ft5x06_driver = {

.driver = {

.owner = THIS_MODULE,

.name = "ft5x06_test",

// 采用设备树的时候驱动使用的匹配表

.of_match_table = ft5x06_id,

},

.probe = ft5x06_probe,

.remove = ft5x06_remove,

.id_table = ft5x06_id_ts};

/* 驱动入口函数 */

static int ft5x06_driver_init(void)

{

int ret;

// 注册 i2c_driver

ret = i2c_add_driver(&ft5x06_driver);

if (ret < 0)

{

printk(" i2c_add_driver is error \n");

return ret;

}

printk("This is ft5x06_driver_init\n");

return 0;

}

/* 驱动出口函数 */

static void ft5x06_driver_exit(void)

{

// 将前面注册的 i2c_driver 也从 Linux 内核中注销掉

i2c_del_driver(&ft5x06_driver);

printk("This is ft5x06_driver_exit\n");

}

module_init(ft5x06_driver_init);

module_exit(ft5x06_driver_exit);

MODULE_LICENSE("GPL");

我们参考第三十九章 Linux 内核模块将刚刚编写的驱动代码编译为驱动模块,编译完如下图所示:

在加载驱动之前,我们要恢复设备树文件中我们之前章节注释掉的节点,重新编译设备树内核,然后再烧写镜像。

开发板启动后,我们进入到/sys/bus/i2c/devices/目录下查看是否有生成 I2C 节点,如下图所示:

我们进入共享目录并且加载驱动模块,共享目录的搭建请参考第三十七章 37.2.3 搭建 nfs 共享目录,

如下图所示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值