I2C总线 驱动程序设计 --- EEPROM 驱动设计

Linux - I2C子系统

在本博客中,涉及到的I2C驱动程序都是指从设备的驱动程序设计。

这里写图片描述

1、I2C核心
I2C 总线和 I2C 设备驱动的中间枢纽,它提供了I2C 总线驱动和设备驱动的注册、注销方法等。

2、I2C控制器驱动
I2C CPU对 控制器的驱动实现,控制器可在 外部,也可以集成在 CPU 内部。

3、I2C设备驱动
对 I2C从设备的驱动实现,如AT24C02的驱动

这里写图片描述

用户可以自己编写一个驱动,也可以使用现有的通用的I2C总线驱动,然后根据通用驱动自己编写用户态的驱动程序。

I2C用户态驱动设计(EEPROM)

通用I2C接口驱动程序,代码参见:内核代码\drivers\i2c\i2c-dev.c 文件。

用户态驱动程序设计 代码举例:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <malloc.h>

#define I2C_RDWR 0x0707   //命令值

struct i2c_msg{
    unsigned short addr;  //从设备地址
    unsigned short flags; //读写方向
    unsigned short len;   //消息长度,数据有几个字节
    unsigned char  *buf;  //消息数据
};

struct i2c_rdwr_ioctl_data{
    struct i2c_msg *msgs;  //指向i2c消息的指针
    unsigned int nmsgs;    //消息的个数
};

int main()
{
    int fd;
    struct i2c_rdwr_ioctl_data e2prom_data;

    //1、打开通用设备文件
    //i2c设备对应的文件是/dev/i2c-0,以读写方式打开
    fd = open("/dev/i2c-0", O_RDWR);

    e2prom_data.msgs = (struct i2c_msg *)malloc(2 * sizeof(struct i2c_msg)); 
    //2、构造写数据到eeprom的消息
    e2prom_data.nmsgs = 1; //向eeprom中写入,只有1条消息

    (e2prom_data.msgs[0]).len    =  2;//2个字节
    (e2prom_data.msgs[0]).addr   =  0x50;
    (e2prom_data.msgs[0]).flags  =  0;//写
    (e2prom_data.msgs[0]).buf    =  (unsigned char *)malloc(2 * sizeof(char));
    (e2prom_data.msgs[0]).buf[0] =  0x10;//写入的位置
    (e2prom_data.msgs[0]).buf[1] =  0x01;//写入的数据

    //3、使用ioctl写入数据
    ioctl(fd, I2C_RDWR, (unsigned long)&e2prom_data); //使用ioctl函数将消息写入文件中

    //4、构造从eeprom读数据的消息
    e2prom_data.nmsgs = 2; //两条消息,一个写,一个读

    (e2prom_data.msgs[0]).len    =  1;//1个字节
    (e2prom_data.msgs[0]).addr   =  0x50;
    (e2prom_data.msgs[0]).flags  =  0;//写
    (e2prom_data.msgs[0]).buf[0] =  0x10;//写入需要读出数据的位置

    (e2prom_data.msgs[1]).len    =  1;//2个字节
    (e2prom_data.msgs[1]).addr   =  0x50;
    (e2prom_data.msgs[1]).flags  =  1;//读
    (e2prom_data.msgs[1]).buf    =  (unsigned char *)malloc(2 * sizeof(char));  
    (e2prom_data.msgs[1]).buf[0] =  0;

    //5、使用ioctl读出数据
    ioctl(fd, I2C_RDWR, (unsigned long)&e2prom_data);
    printf("buff[0] = %d\n", (e2prom_data.msgs[1]).buf[0]);

    //6、关闭设备
    close(fd);  
}

自编驱动程序设计(不使用通用i2c驱动)

在内核代码中已经有专门的eeprom驱动程序,参考代码:
\drivers\misc\eeprom\At24.c

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章