用户态驱动模型

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

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. bzoj 4653: [Noi2016]区间

    Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就是使得存在一个 x ...

  2. 字符串MD5加密运算

    public static string GetMd5String(string str)       {           MD5 md5 = MD5.Create();           by ...

  3. Golang fmt包使用小技巧

    h1 { margin-top: 0.6cm; margin-bottom: 0.58cm; direction: ltr; color: #000000; line-height: 200%; te ...

  4. JMeter常见错误解决方法

    1.Windows 平台,双击 jmeter/bin 目录下 jmeter.bat 文件,jmeter 无法启动且报错如下: 此问题是没有配置 jdk 环境变量所致,配置好 jdk 环境变量即可. 2 ...

  5. python中星号的意义(**字典,*列表或元组)

    传递实参和定义形参(所谓实参就是调用函数时传入的参数,形参则是定义函数是定义的参数)的时候,你还可以使用两个特殊的语法:*.** . 调用函数时使用* ,** test(*args)中 * 的作用:其 ...

  6. 微信小程序开发之图片预览

    实现图片的展示和大图预览 使用wx.previewImage(OBJECT)来实现 OBJECT参数说明: 参数 类型 必填 说明 current String 否 当前显示图片的链接,不填则默认为 ...

  7. 走进Vue时代进阶篇(01):重构电商购物车模块

    前言 从这篇文章开始,我准备给大家分享一些关于Vue.js这门框架的技巧性系列文章,正好我们公司项目中也用到了Vue.所以,教是最好的学.进阶篇比较适合于二三线城市,还在小厂打拼的童鞋们.欢迎你们跟着 ...

  8. Dotnet Core Windows Service

    在dotnet 中有topshelf 可以很方便的写windows 服务并且安装也是很方便的,命令行 运行.exe install 就直接把exe 程序安装成windows 服务.当然 代码也要做相应 ...

  9. vscode运行前端代码

    vscode 可安装静态web服务器  Live Server用于运行前端代码,方便调试.最新的 Live Server已支持php动态页面. 安装方法是,点击左侧第五个图标,打开"扩展&q ...

  10. ES6小点心之通用弹窗

    小点心,顾名思义,开箱即食,拿来即用. 前端业务逻辑主要分为[交互效果]和[数据展示]两方面.数据展示可使用 MVVM 框架来实现.前端的交互效果常用的也就那么几种,比如弹窗,楼层定位,倒计时,下拉刷 ...