用户态驱动模型
用户态驱动模型首先是一个应用程序,其次是在这个用户程序中通过内核调用来驱动设备。
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); }