1.
清中断后才能继续使用
对于不同种i2c控制器提供通用的接口把i2c数据发送出去,还是从i2c设备里面读到数据
我们模仿内核函数自已构造i2c_transfer
int i2c_transfer(p_i2c_msg msgs, int num)
参数p_i2c_msg msgs/*构造信息结构体*/
typedef struct i2c_Msg{
unsigned int addr;
int len;
int flags;
int cnt_transferred;
int err;
unsigned char *buf;
}i2c_msg;
我们要设计出比较容易拓展的程序,对于i2c控制器我们抽象出通用的结构体。
typedef struct i2c_Controller{
int (*init)(void);
int (*master_transfer)(i2c_msg msgs, int num);
char *name;
}i2c_controller;
构造完后要告诉上层,上层有个管理者叫做i2c_controller.c,对于2440 i2c控制器可以有个文件sc2440_i2c_controller.c,在这个文件中构造设置i2c_controller把它放入上层i2c_controller.c文件中的数组里。假设有个TI的开发板也要构造出i2c_controller
I2c_controller.c文件
#include "i2c_controller.h"
#define I2C_CONTROLLER 10
/* 定义一个存放不同芯片的结构体指针数组 */
static p_i2c_controller p_i2c_comtrollers[I2C_CONTROLLER];
static p_i2c_controller p_i2c_con_selected;
/* 不同芯片放入数组,如果哪项空的话就放进去 */
void register_i2c_controller(p_i2c_controller *p)
{
int i;
for (i=0; i<I2C_CONTROLLER; i++)
{
if (!p_i2c_comtrollers[i]) /* 如果哪项空的话 */
{
p_i2c_comtrollers[i] = p;
return;
}
}
}
/* 根据名字选择某一款芯片 */
int select_i2c_controller(char *name)
{
int i;
for (i=0; i<I2C_CONTROLLER; i++)
{
if (p_i2c_comtrollers[i] && !strcmp(name, p_i2c_comtrollers[i]->name)) /* strcmp 相等返回零 */
{
p_i2c_con_selected = p_i2c_controllers[i];
return 0;
}
}
return -1;
}
/* 实现i2c_transfer接口函数 */
int i2c_transfer(i2c_msg msgs, int num)
{
return p_i2c_con_selected->master_transfer(msgs, num);
}
/* 初始化函数 */
void i2c_init(void)
{
/* 注册下面的I2C控制器 */
s3c2440_i2c_con_add();
/* 选择某款I2C控制器 */
select_i2c_controller("");
/* 调用它的init函数 */
p_i2c_con_selected->init();
}
sc2440_i2c_controller.c文件
#include "i2c_controller.h"
static p_i2c_msg p_cur_msg;
void s3c2440_i2c_con_init(void)
{
}
int s3c2440_master_xfer(p_i2c_msg msgs, int num)
{
}
/* 实现i2c_controller
.init
.master_xfer
.name
*/
static i2c_controller s3c2440_i2c_con = {
.name = "s3c2440",
.init = s3c2440_i2c_con_init,
.master_xfer = s3c2440_master_xfer,
};
struct i2c_controller *s3c2440_i2c_con_add(void)
{
return &s3c2440_i2c_con;/* 注册一种i2c控制器结构体 */
}**
2c_controller.h文
#ifndef _I2C_CONTROLLER_H
#define _I2C_CONTROLLER_H
typedef struct i2c_Msg{
unsigned int addr;
int len;
int flags;
int cnt_transferred;
int err;
unsigned char *buf;
}i2c_msg,*p_i2c_msg;
typedef struct i2c_Controller{
int (*init)(void);
int (*master_transfer)(i2c_msg msgs, int num);
char *name;
}i2c_controller,*p_i2c_controller;
struct i2c_controller *s3c2440_i2c_con_add(void);//结构体指针函数
#endif