基于Linux操作系统的ARM/DSP多机I2C通信设计方案
线读数据帧格式
2.1.2 Linux下I2C总线驱动程序概述
Linux系统的I2C总线驱动采用体系化结构设计,包括I2C总线适配器驱动和I2C总线设备驱动。总线驱动实现对I2C总线适配器(S3C2440的I2C总线模块)的控制,设备驱动实现对具体设备(F28015的I2C总线模块)的读写控制。图5为总体驱动框架,可以分为三个层次:
① I2C框架。内核中i2c.h和i2ccore.c为I2C总线框架的主体,提供了核心数据结构的定义、I2C总线适配器驱动和设备驱动的注册、注销管理、I2C总线通信方法上层的、与具体适配器无关的代码、检测设备地址的上层代码等。i2cdev.c用于创建I2C总线适配器的设备节点,提供I2C总线设备访问方法等。
② I2C总线适配器驱动。定义描述具体I2C总线适配器的数据结构,实现在具体I2C总线适配器上的I2C总线通信方法。
③ I2C总线设备驱动。定义描述具体设备的数据结构,借助I2C总线框架的相关函数实现设备的注册,并为用户提供上层应用程序编程接口。
图5 总体驱动框架
Linux的I2C总线驱动框架中的主要数据结构包括: i2c_driver、i2c_client、i2c_adapter和 i2c_algorithm,它们被定义在内核中的i2c. h头文件中。i2c_adapter对应于物理上的一个适配器,而i2c_algorithm对应一套通信方法,用来为适配器提供通信函数。i2c_algorithm中的关键函数master_xfer()用于产生I2C总线访问周期需要的信号,以i2c_msg(即I2C总线消息)为单位。该结构体原型如下:
struct i2c_msg{
_ _u16 addr;/*设备地址*/
_ _u16 flags;/*标志*/
_ _u16 len;/*消息长度*/
_ _u8 *buf;/*消息数据*/
};
i2c_driver对应一套驱动方法,是用于辅助作用的数据结构。i2c_client对应于真实的物理设备,每个I2C总线设备都需要一个i2c_client来描述。i2c_adapter和i2c_client的关系与I2C总线硬件体系中适配器和设备关系一致,即i2c_client依附于i2c_adapter.
图6 设备驱动模块加载流程
在Linux内核源代码中drivers目录下的i2c_dev.c文件,是通用的I2C总线设备驱动文件,为应用程序提供open()、write()、read )、ioctl()和close()等操作接口来访问设备。应用层可以借用这些接口访问挂接在适配器上的I2C总线设备的存储空间或寄存器,并控制I2C总线设备的工作方式。
2.1.3 S3C2440的I2C总线驱动
设备驱动S3C2440内部的I2C总线控制器通过4个寄存器实现对通信的控制,分别是I2C控制寄存器(I2CCON)、I2C状态寄存器(I2CSTAT)、I2C收发数据移位寄存器(I2CDS)、I2C地址寄存器(I2CADD)。
按照Linux中I2C总线框架要求,S3C2440的I2C总线驱动设计主要完成以下工作:设计i2c_adapter_s3c_init()模板加载函数和对应于i2c_adapter_s3c_exit()模板卸载函数;设计i2c_adapter_s3c_xfer()模板S3C2440适配器通信方法函数。
i2c_adapter_s3c_init()通过注册s3c2440_i2c_driver结构体实现总线驱动的平台注册,s3c2440_i2c_driver结构体包含了具体适配器的probe()函数、remove()函数、resume()函数指针等信息。代码如下:
static int _ _init i2c_adap_s3c_init(){
int ret;
ret=platform_driver_regisiter(s3c2440_i2c_driver);//注册platform_driver结构体
if(ret==0){//注册失败
ret=platform_driver_regisiter(s3c2440_i2c_driver);
if(ret)
platform_driver_unregisiter (s3c2440_i2c_driver);
}
return ret;
}
static struct platform_driver s3c2440_i2c_driver={
.probe=s3c24xx_i2c_probe,
.remove=s3c24xx_i2c_remove,
.resume=s3c24xx_i2c_resume,
.driver={
.owner=THIS MODULE,
.name=“s3c2440i2c”,
},
} ;
完成了S3C2440的I2C总线适配器驱动注册后,就可以将具体设备驱动注册到该总线平台上,实现I2C总线数据通信。i2c_dev.c文件是内核源码提供的通用I2C总线设备驱动文件,针对每个I2C总线适配器生成一个主设备号为89的设备文件,设备驱动模块加载流程如图6所示。完成加载后,驱动提供i2cdev_read()、i2cdev_write()、i2cdev_ioctl()函数来对应用户空间的read()、write()、ioctl()函数,供用户使用。用户通过这些接口函数实现I2C总线数据的读写功能。
2.2 DSP数据接收中断程序设计
图7 I2C总线中断服务程序流程
通过配置F28015的I2C模块寄存器,设置I2C模块为从工作方式,同时利用I2C总线中断响应程序实现对总线上数据的接收和发送,进而完成数据通信。F28015产生了I2C总线中断后,就执行中断服务程序,图7为I2C总线中断服务程序流程。
中断服务程序通过查询状态寄存器(I2CSTR)标志位,得出
通信 设计 方案 I2C 多机 Linux 操作系统 ARM DSP 基于 相关文章:
- 无线通信领域中的模拟技术发展趋势(蜂窝基站)(09-22)
- 新一代移动通信系统及无线传输关键技术(06-19)
- 蜂窝移动通信基站电磁辐射对人体影响的探讨(04-10)
- 无线升级到802.11n 应考虑的因素有哪些?(10-30)
- 第四代移动通信系统中的多天线技术(08-05)
- 4G移动通信系统研究进展与关键技术(12-24)