I2C驱动实例解析

简单的说,i2c驱动也就三步吧,注册i2c设备,注册i2c设备驱动,创建sysfs文件供上层调用。

1. 注册i2c设备。

先定义一个i2c_board_info

static struct i2c_board_info __initdata xxxx_i2c_info[] = {    

        {
        I2C_BOARD_INFO("XXXX", 0x1D),
        .platform_data = &xxxx_platform_data,
        },
}; 

再注册,一般会注册一个client。

 i2c_register_board_info()

强烈建议有兴趣的可以看看这个函数的源码,可以学到很多。

2. 注册i2c设备driver

定义再注册

static struct i2c_driver xxx_i2c_driver = {
	.id_table = xxx_i2c_id,
	.probe  = xxx_i2c_probe,
	.remove = __exit_p(xxx_i2c_remove),
	.driver = {
		.name = "xxx",
	},
};

注册函数

i2c_add_driver(&xxx_i2c_driver);

注册过程中,主要是调用probe函数,如何跑到probe函数里同样需要跟代码。这里不详述。讲讲probe函数里主要干什么。

static int xxx_i2c_probe(struct i2c_client *client,
		const struct i2c_device_id *id)
{
	int rc = 0;
	printk("%s called!\n", __func__);

	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
		printk("i2c_check_functionality failed\n");
		goto probe_failure;
	}

	xxx_sensorw = kzalloc(sizeof(struct xxx_work_t), GFP_KERNEL);
	if (!xxx_sensorw) {
		printk("kzalloc failed.\n");
		rc = -ENOMEM;
		goto probe_failure;
	}

	i2c_set_clientdata(client, xxx_sensorw);
	xxx_init_client(client);
	xxx_client = client;

	msleep(50);

	printk("%s successed! rc = %d\n", __func__, rc);
	return 0;

probe_failure:
	printk("%s failed! rc = %d\n", __func__, rc);
	return rc;
}

probe函数主要是获取client,而后便可以通过client中adapter的方法来传输数据:

static int xxx_i2c_txdata(const uint16_t saddr,
		uint8_t *txdata, const uint16_t length)
{
	struct i2c_msg msg[] = {
		{
			.addr = saddr,
			.flags = 0,
			.len = length,
			.buf = txdata,
		},
	};
	if (i2c_transfer(xxx_client->adapter, msg, 1) < 0) {
		printk("xxx_i2c_txdata faild 0x%x\n", saddr);
		return -EIO;
	}

	return 0;
}

3. 创建sysfs供上层调用

可以通过函数

sysfs_create_group(&(pdev->dev.kobj), &xxx_attribute_group);

来创建。

以上就是简要说说,主要还是要看源码才能更深的理解这些流程。

I2C驱动实例解析

时间: 2024-08-28 17:11:11

I2C驱动实例解析的相关文章

Linux 设备驱动开发 —— platform设备驱动应用实例解析

前面我们已经学习了platform设备的理论知识Linux 设备驱动开发 -- platform 设备驱动 ,下面将通过一个实例来深入我们的学习. 一.platform 驱动的工作过程 platform模型驱动编程,platform 驱动只是在字符设备驱动外套一层platform_driver 的外壳. 在一般情况下,2.6内核中已经初始化并挂载了一条platform总线在sysfs文件系统中.那么我们编写platform模型驱动时,需要完成两个工作: a -- 实现platform驱动 架构就

TQ2440学习笔记——Linux上I2C驱动的两种实现方法(1)

作者:彭东林 邮箱:[email protected] 内核版本:Linux-3.14 u-boot版本:U-Boot 2015.04 硬件:TQ2440 (NorFlash:2M   NandFlash:256M  内存:64M) 摘要 这里并不深入分析Linux下I2C驱动的实现,只是以TQ2440硬件平台为例分析I2C驱动的两种方法. 第一种方法: 使用S3C2440自带的I2C控制器实现,这个kernel已经支持,我们只需要配置即可. 第二种方法: 使用GPIO模拟,这个在kernel中

基于Android2.3.5系统:JNI与HAL实例解析[一]

*************************************************************************************************************************** 作者:EasyWave                                                                                                           时间:2015.

Linux I2C驱动编写要点

继续上一篇博文没讲完的内容“针对 RepStart 型i2c设备的驱动模型”,其中涉及的内容有:i2c_client 的注册.i2c_driver 的注册.驱动程序的编写. 一.i2c 设备的注册分析:在新版本内核的i2c驱动模型中,支持多种方式来注册 i2c 设备,在Documentation/i2c/instantiating-devices文件中有讲到,在内核中对应的抽象数据结构就是 struct i2c_client. (1)Declare the I2C devices by bus

I2C驱动框架之probe方式

基于Linux的I2C驱动,采用probe方式.按照如下这个框架可以写出任何支持I2C总线的器件的Linux驱动. I2C器件连接至cpu的特定的i2c的接口,也就是挂载在cpu的i2c适配器上,i2c器件要和cpu进行信息交换必须要通过cpu操作适配器来交互.cpu上有1个或多个适配器,每个适配器上可以挂载256个设备地址不一样的i2c器件,通过i2c驱动就可以让cpu和适配器上的多个不一样的i2c器件通信而不会产生冲突. 驱动包括两个文件,dev.c和drive.c,其中dev.c是构建I2

I2C驱动框架(四)

参考:I2C子系统之platform_driver初始化--I2C_adap_s3c_init() 在完成platform_device的添加之后,i2c子系统将进行platform_driver的注册过程.platform_driver的注册通过调用初始化函数i2c_adapter_s3c_init函数来完成. static struct platform_device_id s3c24xx_driver_ids[] = { { .name = "s3c2410-i2c", .dri

搭建NFS文件共享--实例解析

1 NFS简介 NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公 司开发,于1984年向外公布.功能是通过网络让不同的机器.不同的操作系统能够彼此分享个别的数据, 让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是实现磁盘文件共享的一种方法. NFS 的基本原则是"容许不同的客户端及服务端通过一组RPC分享相同的文件系统",它是独立于操作 系统,容许不同硬件及操作系统的系统共同进行文件的分享. 2 NFS服务器的配

第7章 Android HAL实例解析

第7章 Android HAL实例解析 通过本章介绍Android的HAL知道HAL是为了一些硬件提供商提出的保护专利的驱动程序而产生的,是为了避开Linux的GPL束缚.HAL主要的存储目录有:1.libhardware_legany  2.libhardware:3.ril   4.msm7k.主要包含以下一些模块:Gps.Vibrator.Wifi.Copybit.Audio.Camera.Lights.Ril.Overlay等.大概了解了Android  HAL. 第1中方法 直接调用s

20150503 imx257下实现I2C驱动的四种方法

20150503 imx257下实现I2C驱动的四种方法 2015-05-3 Lover雪儿 时间过得好快,转眼间五一假期就即将结束了,假期期间,大家都潇洒的去玩了,徒留辛辛苦苦的程序员还是窝在宿舍乖乖的敲着代码... 好啦,开开玩笑,辛酸史每家都有一大本,还是要积极的面对生活!!! 今天我们的任务是简单的入门linux内核下i2c设备驱动分离的四种写法. 一.一个简单的i2c驱动 和以前的驱动程序不同,i2c驱动分为drv驱动和dev设备驱动两个文件,不懂的可以参考我以前写的<20150313