linux-2.6 IIC驱动框架分析(一)

开发板:Tiny6410

内核版本:linux-2.6.38

一、框架概述

       在linux-2.6内核中,IIC的驱动程序可以大概分为三部分:

       (1)IIC核心代码:/drivers/i2c/i2c-core.c

                IIC核心提供了IIC总线驱动和设备驱动的注册、注销方法和IIC通信方法。i2c-core.c提供了一组不依赖硬件平台的接口函数,IIC总线驱动和IIC设备驱动之间以i2c-core.c为纽带。

                 注册、注销适配器函数

                          i2c_add_adapter(struct i2c_adapter *adapter);

                          i2c_del_adapter(struct i2c_adapter *adapter);

                 注册、注销IIC设备驱动

                          i2c_register_drive(struct module *owner ,struct i2c_driver *driver);

                          i2c_del_driver(struct i2c_driver *driver);

                  IIC抽象的传输、发送和接收函数

                          i2c_transfer(struct i2c_adapter *adapter,struct i2c_msg *msg,int num);

                          i2c_master_send(struct i2c_client *client,const char *buf,int count);

                          i2c_master_recv(struct i2c_client *client , char * buf , int count);

                         (此处的数据传输并不是直接操作硬件,它只是寻找到与i2c_adapter对应的i2c_algorithm,并使用master_xfer() 函数真正驱动硬件。)

       (2)IIC总线驱动相关代码或者说是IIC适配器(控制器)驱动相关代码:/drivers/i2c/busses/i2c-s3c2410.c

                IIC总线驱动是对IIC控制器的操作。他主要包含i2c_adapter 和i2c_algorithm等数据结构和IIC适配器产生的通用信号的函数。

       (3)IIC设备相关代码,如具体的EEPROM等IIC设备,linux2-6-38用 /drivers/i2c/i2c-dev.c 实现了一个通用的设备驱动程序,当然我们还可以自己实现IIC的设备驱动程序。

                IIC设备驱动是对IIC硬件体系结构中设备端的实现,设备一般是挂载在CPU控制的IIC适配器上,通过IIC适配器与CPU交换数据。IIC设备驱动主要包含i2c_driver和i2c_client等数据结构。

二、IIC总线驱动代码详解

      IIC总线控制器通常是在内存上的,连接在platform总线上,所以需要通过platform_driver和platform_device的匹配。我想大概根据总线设备驱动模型的分层思想,将一个驱动程序分为device和driver两层,将IIC总线驱动程序也分成platform_deviceplatform_driver这两个部分来介绍。在platform_device中提供底层的硬件资源,在platform_driver中取出这些资源进行使用。可能有些不恰当,但是明确分成两部分后更容易理解

     2.1 platform_device层进行的操作

           相关的数据结构(资源、名称id、参数相关的结构体)的定义在dev-i2c0.c这个文件中         

static struct resource s3c_i2c_resource[] = {
	[0] = {
		.start = S3C_PA_IIC,
		.end   = S3C_PA_IIC + SZ_4K - 1,
		.flags = IORESOURCE_MEM,
	},
	[1] = {
		.start = IRQ_IIC,
		.end   = IRQ_IIC,
		.flags = IORESOURCE_IRQ,
	},
};

struct platform_device s3c_device_i2c0 = {
	.name		  = "s3c2410-i2c",
#ifdef CONFIG_S3C_DEV_I2C1
	.id		  = 0,
#else
	.id		  = -1,
#endif
	.num_resources	  = ARRAY_SIZE(s3c_i2c_resource),
	.resource	  = s3c_i2c_resource,
};

static struct s3c2410_platform_i2c default_i2c_data0 __initdata = {
	.flags		= 0,
	.slave_addr	= 0x10,
	.frequency	= 100*1000,
	.sda_dela
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值