Linux i2c驱动(eeprom 读写)

本文介绍了M24256 256 Kbit Serial I²C Bus EEPROM的特性,包括I2C扩展寻址、400 kHz协议支持等,并详细阐述了写page和读page的时序。接着,讨论了在Linux系统中针对该设备的I2C驱动实现。
摘要由CSDN通过智能技术生成

一、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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值