I2C总线驱动程序
#include "linux/module.h"
#include "linux/i2c.h"
#include "linux/init.h"
#include "linux/time.h"
#include "linux/
interrupt.h"
#include "linux/delay.h"
#include "linux/errno.h"
#include "linux/err.h"
#include "linux/platform_device.h"
#include "linux/pm_runtime.h"
#include "linux/clk.h"
#include "linux/cpufreq.h"
#include "linux/slab.h"
#include "linux/io.h"
#include "linux/of_i2c.h"
#include "linux/of_gpio.h"
#include "plat/gpio-cfg.h"
#include "mach/regs-gpio.h"
#include "asm/irq.h"
#include "plat/regs-
iic.h"
#include "plat/iic.h"
//#define PRINTK printk
#define PRINTK(...)
enum s3c24xx_i2c_state {
};
struct
s3c2440_i2c_regs {
};
struct s3c2440_i2c_xfer_data {
};
static struct s3c2440_i2c_xfer_data s3c2440_i2c_xfer_data;
static struct s3c2440_i2c_regs *s3c2440_i2c_regs;
static void s3c2440_i2c_start(void)
{
}
static void s3c2440_i2c_stop(int err)
{
}
static int s3c2440_i2c_xfer(struct i2c_adapter *adap,
{
}
static u32 s3c2440_i2c_func(struct i2c_adapter *adap)
{
}
static const struct i2c_algorithm s3c2440_i2c_algo = {
//
.smbus_xfer
= ,
};
// 1. 分配/设置i2c_adapter
static struct i2c_adapter s3c2440_i2c_adapter = {
};
static int isLastMsg(void)
{
}
static int isEndData(void)
{
}
static int isLastData(void)
{
}
static irqreturn_t s3c2440_i2c_xfer_irq(int irq, void *dev_id)
{
next_read:
}
//
static void s3c2440_i2c_init(void)
{
}
static int i2c_bus_s3c2440_init(void)
{
}
static void i2c_bus_s3c2440_exit(void)
{
}
module_init(i2c_bus_s3c2440_init);
module_exit(i2c_bus_s3c2440_exit);
MODULE_LICENSE("GPL");
==============================================================
解析:
编写"
总线(适配器adapter)"驱动
Device Drivers
nfs 30000000 192.168.1.123:/work/nfs_root/uImage_noi2cbus; bootm 30000000
应用程序发送消息出去时,会调用适配器adapter里面的算法函数algo里面的master_xfer函数,先把消息记录下来之后调用start函数,start函数里发送start启动信号并且把设备地址发送出去,然后休眠。发送完之后产生一个中断,在中断函数里面读出状态,如果没有ack的话认为发生错误发出停止信号唤醒应用程序;如果有ack信号而且是最后一个消息,最后一个数据则发出停止信号,否则进入下一个状态读/写,如果是写判断是否是最后一个数据,若还有数据要发送把数据发送出去,若是最后一个数据但是不是最后一个消息的话开始处理下一个消息,发出start信号和设备地址,若是最后一个消息的最后一个数据则发出停止信号;如果是读判断数据是否读完,如果没有读完但是接收到的不是最后一个数据则发送ack信号,若接收到最后一个数据否则无ack,但若数据已经读完则处理下一个消息发送start信号。
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/319503_1_0.jpg)
评论