裸机i2c框架

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴凯你在想啥呢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值