用户态驱动模型

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

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(*sizeof(IIC_MSG)); wrData.msgs[].addr = 0x50; //注意设备地址为0b01010000,但是芯片手册地址为0b10100000
wrData.msgs[].flags = ;
wrData.msgs[].len = ;
wrData.msgs[].buf = (unsigned char *)malloc(*sizeof(unsigned char));
wrData.msgs[].buf[] = ;
wrData.msgs[].buf[] = ; wrData.nmsgs = ; //写入消息数据
ioctl(fd, I2C_RDWR, (unsigned long)(&wrData));
printf("wrData is %d\n", wrData.msgs[].buf[]); //释放写入消息
free(wrData.msgs[].buf);
free(wrData.msgs); //构造读取消息
IIC_DATA rdData; rdData.msgs = (IIC_MSG *)malloc(*sizeof(IIC_MSG)); rdData.msgs[].addr = 0x50;
rdData.msgs[].flags = ;
rdData.msgs[].len = ;
rdData.msgs[].buf = (unsigned char *)malloc(*sizeof(unsigned char));
rdData.msgs[].buf[] = ; rdData.msgs[].addr = 0x50;
rdData.msgs[].flags = ;
rdData.msgs[].len = ;
rdData.msgs[].buf = (unsigned char *)malloc(*sizeof(unsigned char));
rdData.msgs[].buf[] = ; rdData.nmsgs = ; //读取消息数据
ioctl(fd, I2C_RDWR, (unsigned long)(&rdData));
printf("rdData is %d\n", rdData.msgs[].buf[]); //释放读取消息
free(rdData.msgs[].buf);
free(rdData.msgs[].buf);
free(rdData.msgs); //关闭设备文件
close(fd);
}

[国嵌攻略][155][I2C用户态驱动设计]的更多相关文章

  1. [国嵌攻略][165][usb下载线驱动设计]

    查看USB设备的生产商ID和设备ID 示例: lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub 生产商ID是1d ...

  2. I2C用户态驱动设计

    一.用户态驱动模型 1.1 I2C通用驱动代码 i2c_dev_init: static int __init i2c_dev_init(void) { int res; printk(KERN_IN ...

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

    AT24C08的驱动在Linux内核中已经提供,在/drivers/misc/eeprom/at24.c文件中.在对应的probe函数中有一个创建/sys/.../eeprom文件的函数,应用程序通过 ...

  4. [国嵌攻略][153][I2C裸机驱动设计]

    eeprom简介 eeprom电可擦除可编程只读存储器,是一种类似于flash的固态存储器,但是与flash相比又存在一些区别: 1.eeprom可以按位擦写,而flash只能大片擦除. 2.eepr ...

  5. [国嵌攻略][152][I2C总线介绍]

    IIC电气特性 I2C(inter intergrated circuit)总线是由philps公司开发的两线式串行总线,用于连接微控制器及其外围设备. I2C总线只有两根双向信号线: SDA:ser ...

  6. Linux用户态驱动设计

    聊聊Linux用户态驱动设计   序言 设备驱动可以运行在内核态,也可以运行在用户态,用户态驱动的利弊网上有很多的讨论,而且有些还上升到政治性上,这里不再多做讨论.不管用户态驱动还是内核态驱动,他们都 ...

  7. 聊聊Linux用户态驱动设计

    序言 设备驱动可以运行在内核态,也可以运行在用户态,用户态驱动的利弊网上有很多的讨论,而且有些还上升到政治性上,这里不再多做讨论.不管用户态驱动还是内核态驱动,他们都有各自的缺点.内核态驱动的问题是: ...

  8. [国嵌攻略][154][Linux-I2C子系统]

    IIC子系统架构 device driver层: 1.device driver,由用户开发. 2.i2c-dev由内核实现,但是需要配合应用模式驱动才能使用. i2c core层: 1.总线驱动,也 ...

  9. [国嵌攻略][107][Linux进程管理子系统]

    进程与程序 1.程序:存放在磁盘上的一系列代码和数据的可执行映像,是一个静止的实体. 2.进程:是一个执行中的程序,它是一个动态的实体. 进程四要素 1.有一段程序供其执行.这段程序不一定是某个进程所 ...

随机推荐

  1. ZooKeeper如何保证单一视图

    由于ZooKeeper的数据模型简单且全部在内存中,ZooKeeper的速度非常快.它提供了一系列保证: • 顺序一致性 • 原子性 • 单一视图 • 可靠性 • 实时性 下面将结合源码(3.4.10 ...

  2. java-FFmpeg(一) 实现视频的转码和截图功能

    FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库l ...

  3. 高级开发层面,针对Hibernate方面面试题的总结(对其它ORM也适用)

    虽然目前mytabis用得比较多,但Hibernate相对比较容易上手,而且也有不少公司在用,所以本文就用这个举例,事实上,本文给出的面试建议也适用于各种ORM.本文摘自java web轻量级开发面试 ...

  4. C++ qsort

    使用qsort 需要包含头文件#include<algorithm> 例子: class Wooden{ public: int weight; int length; bool flag ...

  5. 搜索引擎之全文搜索算法功能实现(基于Lucene)

    之前做去转盘网的时候,我已经公开了非全文搜索的代码,需要的朋友希望能够前去阅读我的博客.本文主要讨论如何进行全文搜索,由于本人花了很长时间设计了新作:观点,观点对全文搜索的要求还是很高的,所以我又花了 ...

  6. mysql 的 fiter push down 优化

    出处:黑洞中的奇点 的博客 http://www.cnblogs.com/kelvin19840813/ 您的支持是对博主最大的鼓励,感谢您的认真阅读.本文版权归作者所有,欢迎转载,但请保留该声明. ...

  7. 设置状态栏(UIStatusBar)样式

    方法1:找到项目里面的info.plist文件,添加属性Status bar style,设置属性值为transparent black style 状态条为白色 ,设置属性值为 gray style ...

  8. 每天学一点Docker(5)——了解Docker架构

    Docker的核心组件: 1.Docker客户端 - Client 2.Docker服务器 - Docker deamon 3.Docker镜像 - Image 4.仓库 - Registry 5.D ...

  9. AVFoundation 框架初探究(一)

    夜深时动笔 前面一篇文章写了视频播放的几种基本的方式,算是给这个系列开了一个头,这里面最想说和探究的就是AVFoundation框架,很想把这个框架不敢说是完全理解,但至少想把它弄明白它里面到底有什么 ...

  10. 必须掌握的ES6新特性

    ES6(ECMAScript2015)的出现,让前端开发者收到一份惊喜,它简洁的新语法.强大的新特性,带给我们更便捷和顺畅的编码体验,赞! 以下是ES6排名前十的最佳特性列表(排名不分先后): 1.D ...