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

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