用户态驱动模型

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

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. 如何写一个SSH项目(一)程序设计大体思路

    SSH:分别是指Spring,Struts,Hibernate. 后来Struts2代替了Struts,所以我们常说的SSH是指Spring,Struts2,Hibenate. 其中Spring一般用 ...

  2. for 在项目实战中用的比较多

    for循环编程语言中的语句之一,用于循环执行.for循环是开界的,它的一般形式为: for(; <条件表达式>; ) 语句: 初始化通常是一个赋值语句, 它用来给循环控制变量赋初值: 条件 ...

  3. mysql超时机制

    mysql每次建立一个socket连接(connect)时,这个socket都会占用一定内存.即使你关闭(close)连接时,并不是真正的关闭,而是处于睡眠(sleep)状态. 当你下次再进行连接时, ...

  4. Linux目录结构详解

    /: 根目录,一般根目录下只存放目录,不要存放文件,/etc./bin./dev./lib./sbin应该和根目录放置在一个分区中/bin:/usr/bin: 可执行二进制文件的目录,如常用的命令ls ...

  5. perl-5.14.0在新版gcc中编译不通过解决办法

    1     由于在新版本中GCC把C99中的标准库分成了libc和libm两个部分,libm中包含一些数学库等,如果要用到libm时,必须加上-lm选项 在解压Configure之后,再在Makefi ...

  6. springMVC(7)---表单标签

    springMVC(7)---表单标签 form标签作用                                     简单来讲form表单有两大作用 1:第一就是往后端提交数据或者前端回显 ...

  7. Hibernate学习笔记(6)---Criteria接口

    Criteria接口 Criteria查询通过面相对向的设计,将数据查询条件封装为一个对象.在hibernate执行时会把criteria指定的查询恢复相应的sql语句. 条件查询 Criteria ...

  8. Windows同时安装Python2、Python3兼容运行

    Python2.Python3可以同时安装在windows上,关键是如何有选择的运行Python2还是Python3.   指定运行版本 如果你有一个Python文件叫 hello.py,那么你可以这 ...

  9. solr7.2安装实例,中文分词器

    一.安装实例 1.创建实例目录 [root@node004]# mkdir -p /usr/local/solr/home/jonychen 2.复制实例相关配置文件 [root@node004]#  ...

  10. Ubuntu 安装Appium

    1.安装node apt-get install node.js 2.安装npm apt-get install npm 3.安装cnpm npm install -g cnpm 创建链接:ln -s ...