开发板 :mini2440
内核版本:linux2.6.32.2
驱动程序参考:韦东山老师毕业班i2c
内容概括:
1、adapter
client 简介 2、adapter 驱动框架 2.1 设备侧 2.2 驱动侧 2.2.1 probe 函数 2.2.1.1 注册adapter new_device
del_device board_info i2c_detect i2c_new_device 3、i2c 设备驱动框架 3.1 i2c_bus_type 3.2 i2c_driver 3.3 i2c_device
4、写设备驱动程序
5、写adapter驱动程序
1、adapter client 简介 在内核里,i2c 驱动框架大概分为两层,adapter 驱动 和 设备驱动,adapter 英文翻译过来为 “适配器”,适配器并不恰当,根据我的理解,adapter 指的是我们 mcu 里的 i2c 控制模块,就是那堆寄存器,因为一个 mcu 里的i2c控制模块是固定的(寄存器参数、以及收发数据的方法),因此大多数情况下,它们都有芯片厂商写好了,然而我们学习的过程中自己动手写一写也并不困难。对于s3c2440仅仅有一个i2c_adapter,但是别的Mcu可能有多个。至于Client,它对应于muc外围的I2c设备,每一个i2c设备都由一个唯一的client来描述。
-
struct i2c_adapter {
-
struct module *owner;
-
unsigned int id;
-
unsigned int class;
-
const struct i2c_algorithm *algo;
-
void *algo_data;
-
-
-
u8 level;
-
struct mutex bus_lock;
-
-
int timeout;
-
int retries;
-
struct device dev;
-
-
int nr;
-
char name[48];
-
struct completion dev_released;
-
};
简单扫一眼,i2c_adapter 封装了 struct device ,因此它是作为一个设备注册到内核中去的(稍后我们会知道,它是注册到i2c_bus_type里),此外非常重要的一个成员struct i2c_algorithm *algo ,这就是我们上边提到的 i2c
控制器收发数据的方法。
-
struct i2c_algorithm {
-
-
int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs,
-
int num);
-
int (*smbus_xfer) (struct i2c_adapter *adap, u16 addr,
-
unsigned short flags, char read_write,
-
u8 command, int size, union i2c_smbus_data *data);
-
-
-
u32 (*functionality) (struct i2c_adapter *);
-
};
master_xfer 对应于i2c协议子集 smbus ,有些设备只支持这个协议
smbus_xfer 对应于普通的 i2c 传输协议
functionality 用来描述,adapter 所具有的功能,比如是否支持 smbus
-
struct i2c_client {
-
unsigned short flags;
-
unsigned short addr;
-
-
-
char name[I2C_NAME_SIZE];
-
struct i2c_adapter *adapter;
-
struct i2c_driver *driver;
-
struct device dev;
-
int irq;
-
struct list_head detected;
-
};
i2c_client 本质上是一个 i2c_"dev", 它包含了与它配对的 driver ,以及它所在的 adapter(i2c设备在物理连接上,连接到了哪个adapter),后面分析时会看到,它也是作为设备注册到i2c_bus_type
2、adapter 驱动框架
在我所使用的这个内核里,2440的i2c_adapter框架是基于 platform_bus_type 的,关于 platform_bus_type 别的文章已经分析过了,这里不做赘述,只简单提一下,当设备或驱动注册到 platform_bus_type 时,首先会查找驱动是否有id_table,如果有根据id_table进行匹配(就是看id_table里有无设备的名字),否则匹配设备名字和驱动名字。匹配成功则调用驱动里的probe函数。
2.1 设备侧 根据设备总线驱动模型的分层思想,将一个驱动程序分为 device 和 driver 两层,那么 device 里提供底层的硬件资源,在 driver 中取出这些资源进行使用。那么我们就可以猜测到 i2c_adapter 驱动的设备侧 至少应该含有哪些资源?
1、存器地址必须有吧,因为我们要使用这些寄存器,不然怎么传输。 2、中断必须有吧,i2c传输过程中可是离不开中断的。 下面,我们就开详细的看一看,i2c_adapter 驱动的设备侧提供了哪些设备资源。 mach-smdk2410.c (arch\arm\mach-s3c2410) 中定义了个指针数组,这里面有我们想要的 s3c_device_i2c0
-
static struct platform_device *smdk2410_devices[] __initdata = {
-
&s3c_device_usb,
-
&s3c_device_lcd,
-
&s3c_device_wdt,
-
&s3c_device_i2c0,
-
&s3c_device_iis,
-
};
-
dev-i2c0.c (arch\arm\plat-s3c)
-
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 resource s3c_i2c_resource[] = {
-
[0] = {
-
.start = S3C_PA_IIC1,
-
.end = S3C_PA_IIC1 + SZ_4K - 1,
-
.flags = IORESOURCE_MEM,
-
},
-
-
六六分期app的软件客服如何联系?不知道吗?加qq群【895510560】即可!标题:六六分期
阅读:19222|2023-10-27
-
今天小编告诉大家如何处理win10系统火狐flash插件总是崩溃的问题,可能很多用户都不知
阅读:9996|2022-11-06
-
今天小编告诉大家如何对win10系统删除桌面回收站图标进行设置,可能很多用户都不知道
阅读:8331|2022-11-06
-
今天小编告诉大家如何对win10系统电脑设置节能降温的设置方法,想必大家都遇到过需要
阅读:8700|2022-11-06
-
我们在使用xp系统的过程中,经常需要对xp系统无线网络安装向导设置进行设置,可能很多
阅读:8644|2022-11-06
-
今天小编告诉大家如何处理win7系统玩cf老是与主机连接不稳定的问题,可能很多用户都不
阅读:9666|2022-11-06
-
电脑对日常生活的重要性小编就不多说了,可是一旦碰到win7系统设置cf烟雾头的问题,很
阅读:8630|2022-11-06
-
我们在日常使用电脑的时候,有的小伙伴们可能在打开应用的时候会遇见提示应用程序无法
阅读:8004|2022-11-06
-
今天小编告诉大家如何对win7系统打开vcf文件进行设置,可能很多用户都不知道怎么对win
阅读:8664|2022-11-06
-
今天小编告诉大家如何对win10系统s4开启USB调试模式进行设置,可能很多用户都不知道怎
阅读:7539|2022-11-06
|
请发表评论