zoukankan      html  css  js  c++  java
  • [国嵌攻略][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
    ", 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
    ", rdData.msgs[1].buf[0]);
        
        //释放读取消息
        free(rdData.msgs[0].buf);
        free(rdData.msgs[1].buf);
        free(rdData.msgs);
        
        //关闭设备文件
        close(fd);
    }
  • 相关阅读:
    【总结】——Repeater控件详细应用
    【SelfIntroduction in Optional Course】
    【软考之后的思考】
    打印菱形图案printDiamond
    【这是来自Word 2010 的Test】
    【30岁前挣够500万】
    【总结 CKEditor 和 CKFinder 的配置和使用】
    linux压缩(解压缩)命令详解 [转]
    关于吞吐量和并发度 [转]
    Linux的五个查找命令 [转]
  • 原文地址:https://www.cnblogs.com/d442130165/p/5289313.html
Copyright © 2011-2022 走看看