[国嵌攻略][155][I2C用户态驱动设计]

用户态驱动模型

用户态驱动模型首先是一个应用程序,其次是在这个用户程序中通过内核调用来驱动设备。

 

IIC通用驱动代码

IIC通用驱动程序的代码在/drivers/i2c/i2c-dev.c中。一次读操作或者一次写操作就是一条消息。

 

EEPROM用户态驱动

IIC通用设备对应/dev/i2c-0设备文件。

1.打开通用设备驱动

2.构造写数据到eeprom的消息

3.使用ioctl写入数据

4.构造从eeprom读数据的消息

5.使用ioctl读出数据

6.关闭设备

 

配置IIC驱动

make menuconfig ARCH=arm

device drviers-><*>I2C soupport-><*>I2C device interface

device drviers-><*>I2C soupport->I2C hardware bus support-><*>s3c2410 I2C driver

 

i2capp.c

/********************************************************************
*头文件
*********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>

/********************************************************************
*宏定义
*********************************************************************/
#define I2C_RDWR 0x0707   //I2C读写命令

/********************************************************************
*类型定义
*********************************************************************/
typedef struct i2c_msg{
    unsigned short addr;    //设备地址
    unsigned short flags;   //读写标志
    unsigned short len;     //消息长度
    unsigned char  *buf;    //消息内容
}IIC_MSG;

typedef struct i2c_rdwr_ioctl_data{
    struct i2c_msg *msgs;   //消息指针
    unsigned int nmsgs;     //消息数量
}IIC_DATA;

/********************************************************************
*名称:main
*参数:
*    none
*返回:
*    none
*功能:主函数
*********************************************************************/
int main(){
    //打开设备文件
    int fd;
    
    fd = open("/dev/i2c-0", O_RDWR);
    
    //构造写入消息
    IIC_DATA wrData;
    
    wrData.msgs = (IIC_MSG *)malloc(1*sizeof(IIC_MSG));
    
    wrData.msgs[0].addr  = 0x50;   //注意设备地址为0b01010000,但是芯片手册地址为0b10100000
    wrData.msgs[0].flags = 0;
    wrData.msgs[0].len   = 2;
    wrData.msgs[0].buf = (unsigned char *)malloc(2*sizeof(unsigned char));
    wrData.msgs[0].buf[0] = 0;
    wrData.msgs[0].buf[1] = 123;
    
    wrData.nmsgs = 1;
    
    //写入消息数据
    ioctl(fd, I2C_RDWR, (unsigned long)(&wrData));
    printf("wrData is %d\n", wrData.msgs[0].buf[1]);
    
    //释放写入消息
    free(wrData.msgs[0].buf);
    free(wrData.msgs);
    
    //构造读取消息
    IIC_DATA rdData;
    
    rdData.msgs = (IIC_MSG *)malloc(2*sizeof(IIC_MSG));
    
    rdData.msgs[0].addr  = 0x50;
    rdData.msgs[0].flags = 0;
    rdData.msgs[0].len   = 1;
    rdData.msgs[0].buf = (unsigned char *)malloc(1*sizeof(unsigned char));
    rdData.msgs[0].buf[0] = 0;
    
    rdData.msgs[1].addr  = 0x50;
    rdData.msgs[1].flags = 1;
    rdData.msgs[1].len   = 1;
    rdData.msgs[1].buf = (unsigned char *)malloc(1*sizeof(unsigned char));
    rdData.msgs[1].buf[0] = 0;
    
    rdData.nmsgs = 2;
    
    //读取消息数据
    ioctl(fd, I2C_RDWR, (unsigned long)(&rdData));
    printf("rdData is %d\n", rdData.msgs[1].buf[0]);
    
    //释放读取消息
    free(rdData.msgs[0].buf);
    free(rdData.msgs[1].buf);
    free(rdData.msgs);
    
    //关闭设备文件
    close(fd);
}

 

posted @ 2016-03-17 21:01  盛夏夜  阅读(424)  评论(0编辑  收藏  举报