[国嵌攻略][156][I2C自编设备驱动设计]

AT24C08的驱动在Linux内核中已经提供,在/drivers/misc/eeprom/at24.c文件中。在对应的probe函数中有一个创建/sys/.../eeprom文件的函数,应用程序通过调用/sys/.../eeprom设备文件来对设备进行读写操作。

移植AT24C08驱动

1.修改内核注册eeprom设备

在kernel/linux-mini2440/arch/arm/mach-s3c2440.c中的machine_init下注册IIC设备。

mach-mini2440.c

static struct at24_platform_data at24c08 = {
    .byte_len = 8192 / 8,   //字节长度
    .page_size = 8,         //每页大小
    .flags = 0
};

static struct i2c_board_info __initdata mini2440_i2c_devices[] = {
    {
        I2C_BOARD_INFO("24c08", 0x50),   //"24c08"表示型号,0x50表示地址
        .platform_data = &at24c08
    }
};

static void __init mini2440_machine_init(void){
    i2c_register_board_info(0,mini2440_i2c_devices,ARRAY_SIZE(mini2440_i2c_devices));
}

2.配置内核支持eeprom驱动

make menuconfig ARCH=arm

device drivers->[*]misc devices->eeprom support->

<*>i2c eeproms form most venders->exit->save

make uImage ARCH=arm CROSS_COMPILE=arm-linux-

3.下载内核到开发板

/sys/bus/i2c/devices/0-0050/eeprom文件就是内核注册的eeprom设备文件。0x50对应0-0050文件夹,24c08对应eeprom文件。

i2capp.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char **argv){
    //打开文件
    int fd;
    
    fd = open("/sys/bus/i2c/devices/0-0050/eeprom", O_RDWR);
    if(fd < 0){
        printf("error
");
        return -1;
    }
    
    //写入数据
    int i;
    unsigned char wrData[10];
    
    for(i = 0; i < 10; i++){
        wrData[i] = i;
    }
    
    lseek(fd, 0, SEEK_SET);
    write(fd, wrData, 10);
    
    //读取数据
    unsigned char rdData[10];
    
    lseek(fd, 0, SEEK_SET);
    read(fd, rdData, 10);
    
    for(i = 0; i < 10; i++){
        printf("%d ", rdData[i]);
    }
    printf("
");
    
    //关闭文件
    close(fd);
    
    return 0;
}
原文地址:https://www.cnblogs.com/d442130165/p/5292400.html