一、M24256简介
1、256 Kbit Serial I²C Bus EEPROM
2、Compatible with I2C Extended Addressing
3、Two Wire I2C Serial Interface
4、Supports 400 kHz Protocol
5、 Hardware Write Control
6、 BYTE and PAGE WRITE (up to 64 Bytes)
7、 RANDOM and SEQUENTIAL READ Modes
8、 Automatic Address Incrementing
9、管脚定义
二、M24256读写时序
1、写page时序
2、读page时序
三、i2c驱动
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/smp_lock.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/proc_fs.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include <linux/platform_device.h>
#include <asm/uaccess.h>
#include <asm/atomic.h>
#define EEPROM_MAJOR 247
#define EEPROM_I2C_MINORS 1
#define EEPROM_NAME "eeprom"
#define I2C_EEPROM_ADDR (0x54 << 1)
#define I2C_EEPROM_ID 777
#define EEPROM_BANK_SIZE 64
#define I2C_NAME(x) (x)->name
#define SET_EEPROM_PAGE_ADDR 1
#define EEPROM_MAX_ADDR 0x7fff /* 256Kbit = 32Kbyte */
static DEFINE_SPINLOCK(i2c_dev_array_lock);
static struct i2c_driver eeprom_driver;
static struct i2c_dev *i2c_dev_array[EEPROM_I2C_MINORS]= {NULL};
struct i2c_dev
{
int minor;
struct i2c_adapter *adap;
struct i2c_client *client;
atomic_t busy;
unsigned short page_address;
};
static struct i2c_dev *get_free_i2c_dev(struct i2c_adapter *adap)
{
struct i2c_dev *i2c_dev = NULL;
if(adap == NULL)
{
printk("invalid parameter,adap == NULL\n");
return NULL;
}
if( adap->nr >= EEPROM_I2C_MINORS)
{
printk("invalid parameter,adap->nr = %d\n",adap->nr);
return NULL;
}
i2c_dev = kzalloc(sizeof(*i2c_dev), GFP_KERNEL);
if(i2c_dev == NULL)
{
printk("kzalloc i2c_dev error \n");
return NULL;
}
spin_lock(&i2c_dev_array_lock);
if (i2c_dev_array[adap->nr] != NULL)
{
spin_unlock(&i2c_dev_array_lock);
printk("eeprom already has a device assigned to this adapter\n");
goto exit;
}
i2c_dev->minor = adap->nr;
i2c_dev_array[adap->nr] = i2c_dev;
spin_unlock(&i2c_dev_array_lock);
return i2c_dev;
exit:
kfre