基于Linux的I2C驱动器。采纳probe道路。根据这个框架,如下面就可以写任何支持I2C总线设备Linux驱动器。

I2C设备连接到cpu具体i2c接口。被安装在cpu的i2c适配器。i2c设备和cpu信息交流需要通过cpu操作适配器互动。cpu上有1个或多个适配器。每一个适配器上能够挂载256个设备地址不一样的i2c器件,通过i2c驱动就能够让cpu和适配器上的多个不一样的i2c器件通信而不会产生冲突。

驱动包含两个文件,dev.c和drive.c,当中dev.c是构建I2C设备,即创建I2C_Client结构体。而driver.c是在probe中获取dev.c中构建的i2c_client,然后构建fileoperation。详细步骤结合代码例如以下。

1、在dev的入口函数中构建I2C-CLient

static unsigned short addr_list[] = {0x60, 0x50, I2C_CLIENT_END   //这个数组包括了设备地址,以I2C_CLIENT_END为数组结尾</span>};
static struct i2c_client *at24cxx_client;    //创建I2C_Client结构体
static int at24cxx_dev_init(void)
{/*构建I2C_Client*/struct i2c_adapter *adapter;struct i2c_board_info info;    adapter=i2c_get_adapter(0);         //获取适配器,由于有些cpu有多个I2C适配器。參数0为适配器编号memset(&info, 0, sizeof(struct i2c_board_info));strlcpy(info.type, "at24cxx", I2C_NAME_SIZE);    //这个是I2C_NAME,是和i2c_driver匹配的keywordat24cxx_client=i2c_new_probed_device(adapter, &info, addr_list);//假设数组中地址的设备存在则成功返回i2c_client结构体
//这个函数终于会调用device_create创建设备i2c_put_adapter(adapter);if(at24cxx_client)return 0;else return -ENODEV;
}

2、在driver.c的入口函数中注冊I2C_driver结构体

static const struct i2c_device_id = {
 { "at24cxx", 0 },
 { }
};
static struct i2c_driver at24cxx_driver = {.driver = {.name = "100ask",.owner = THIS_MODULE,},.probe = at24cxx_probe,.remove = __devexit_p(at24cxx_remove),.id_table = at24cxx_ids,//id_table中name是和dev创建i2c_client的name匹配,若匹配则会调用probe设备方法
};static int at24cxx_drv_init(void)
{/*×¢²ái2c_driver*/return i2c_add_driver(&at24cxx_driver);}

3、在probe设备方法中构建file_operation注冊字符设备

static struct file_operations at24cxx_fops =
{.owner = THIS_MODULE,.read = at24cxx_read,.write = at24cxx_write,};static int at24cxx_probe(struct i2c_client *client, const struct i2c_device_id *id)
{printk("%s %s %d.\n",__FILE__,__FUNCTION__,__LINE__);at24cxx_client = client;//将dev中构建的i2c_client结构体传递过来,由于这个结构体在read,write等设备方法中传递信息时须要用到major = register_chrdev(0,"at24cxx",&at24cxx_fops);//注冊字符设备class = class_create(THIS_MODULE,"at24cxx");device_create(class,NULL,MKDEV(major,0),NULL,"at24cxx");return 0;
}

4、构建write和read等设备方法中传递I2C消息

static ssize_t at24cxx_read(struct file *file, char __user *buf, size_t count, loff_t *off)
{unsigned char addr,data;copy_from_user(&addr,buf,1);data = i2c_smbus_read_byte_data(at24cxx_client,addr);//这里用i2c_smbus_read_byte_data函数来和实际的I2C设备进行信息交互</span>
//这里详细用哪个函数来传递消息须要结合详细的器件的时序。不同的时序有不同的传递函数,查看Linux源代码中的说明文档有关于传递函数的说明。

copy_to_user(buf,&data,1); return 0; } static ssize_t at24cxx_write(struct file *file, const char __user *buf, size_t count , loff_t *off) { unsigned char ker_buf[2]; unsigned char addr,data; copy_from_user(ker_buf,buf,2); addr = ker_buf[0]; data = ker_buf[1]; if(!i2c_smbus_write_byte_data(at24cxx_client,addr,data)) return 2; else return -EIO; }

假设i2c总线中挂载了实际的i2c设备,并且设备地址在以上的addr_list中,则不管是先载入dev.ko还是先载入driver.ko都会成功的运行probe函数,然后创建字符设备。在应用程序中open设备,并调用read和write则会对应的调用driver中的read和write设备方法。

測试应用程序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>/* i2c_test r addr* i2c_test w addr val*/void print_usage(char *file)
{printf("%s r addr\n", file);printf("%s w addr val\n", file);
}int main(int argc, char **argv)
{int fd;unsigned char buf[2];if ((argc != 3) && (argc != 4)){print_usage(argv[0]);return -1;}fd = open("/dev/at24cxx", O_RDWR);if (fd < 0){printf("can't open /dev/at24cxx\n");return -1;}if (strcmp(argv[1], "r") == 0){buf[0] = strtoul(argv[2], NULL, 0);printf("before data: %c, %d, 0x%2x\n", buf[0], buf[0], buf[0]);read(fd, buf, 1);printf("data: %c, %d, 0x%2x\n", buf[0], buf[0], buf[0]);}else if ((strcmp(argv[1], "w") == 0) && (argc == 4)){buf[0] = strtoul(argv[2], NULL, 0);buf[1] = strtoul(argv[3], NULL, 0);if (write(fd, buf, 2) != 2)printf("write err, addr = 0x%02x, data = 0x%02x\n", buf[0], buf[1]);}else{print_usage(argv[0]);return -1;}return 0;
}

2014--12--17

征途開始

兴许补充

转载于:https://www.cnblogs.com/mfrbuaa/p/4593267.html

I2C驱动程序框架probe道路相关推荐

  1. Linux的 i2c 驱动框架分析

    1.基本概念 总线设备驱动模型,是Linux 内核的一个基础,基本理论可以说按照大企业的分工原则,每个人只要负责自己的事情,向其他部门给出标准的接口调用,后勤部就负责后勤工作,厨房有可能跟后勤部产生工 ...

  2. Linux I2C驱动框架(超详细)

    Linux I2C驱动框架 文章目录 Linux I2C驱动框架 一.几个重要的对象 1.I2C总线 2.I2C驱动 3.I2C设备 4.I2C设配器 小结 二.内核源码分析 1.注册I2C驱动 2. ...

  3. 【linux驱动开发】i2c驱动框架之温湿度传感器htu21d

    文章目录 一.linux内核i2c驱动框架 1.1 i2c适配器 1.2 i2c设备驱动 1.3 i2c设备驱动匹配过程 二.温湿度传感器htu21d 三.htu21d设备驱动编写 3.1 修改设备树 ...

  4. I2C驱动框架分析(3):DW_I2C驱动分析

    I2C驱动框架分析(1):I2C重要概念与数据结构 I2C驱动框架分析(2):I2C框架源码分析 I2C驱动框架分析(3):DW_I2C驱动分析 第三章:DW_I2C驱动 其驱动文件在drivers/ ...

  5. 驱动硬件Framebuffer驱动程序框架 skeletonfb.c 分析

    新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正 Framebuffer驱动程序框架 skeletonfb.c 析分 近来想好好研究一下lcd驱动发开程过,lcd驱动发开重要就是fr ...

  6. 迅为iTOP-i.MX6ULL开发板I2C驱动程序实现 I2C通信

    在第 67.1 章节学习 i2c 的时候,我们是在应用层操作设备节点对 i2c 设备进行读写的,那么如果我们在 驱动里面对 i2c 设备进行读写要怎么办呢?本章节我们将来学习. 我们复制第 67.3 ...

  7. 网卡驱动程序框架和编写

    参考韦东山二期视频资料 网卡驱动程序框架 1.网卡驱动程序"收发功能" 2.编程步骤: 2.1设置net_device结构 2.2硬件相关设置 2.3接收到数据要做的事情 2.4发 ...

  8. Gadget驱动程序框架

    Gadget驱动程序框架 文章目录 Gadget驱动程序框架 参考资料: 一. 怎样理解Gadget框架 二.从硬件软件角度理解Gadget框架 2.1 底层硬件操作_UDC驱动 2.2 上层软件操作 ...

  9. Linux i2c驱动框架分析 (二)

    Linux i2c驱动框架分析 (一) Linux i2c驱动框架分析 (二) Linux i2c驱动框架分析 (三) 通用i2c设备驱动分析 i2c core i2c核心(drivers/i2c/i ...

最新文章

  1. 机器学习算法与Python实践之(三)支持向量机(SVM)进阶
  2. 中公教育计算机网络,计算机考试题库:计算机网络模拟练习题(2)
  3. 送你两个神器,关系数据库数据入湖轻松应对
  4. selenium 常见面试题以及答案(Java版)
  5. 吴恩达深度学习之五《序列模型》学习笔记
  6. ShutdownHook- Java 优雅停机解决方案
  7. coolpad大神f2Android,酷派大神F2全高清版(8675-FHD Android 5.0)刷Recovery教程
  8. 计算机无法打开浏览器,win7电脑打开ie浏览器被提示“该页无法显示”怎么解决...
  9. python 表情包 网站源码_Python实现表情包的代码实例
  10. windows下VS中各种C++库的集成
  11. 基于模型预测控制MPC的光伏并网系统设计|太阳能发电|模型预测控制
  12. 就大学生对网络舆情态度的调查
  13. 已知网络号求子网掩码c语言,已知ip地址求子网掩码 - 已知ip地址求子网掩码_已知ip地址和子网掩码求网络号、子网号和主机号...
  14. 八、十六进制数转换到十进制数
  15. 356 次小生成树(求解最近公共祖先优化)
  16. 出租车管理系统源码php,出租车管理系统((SSH+MYSQL+JSP))
  17. Helm部署服务前自定义Chart包默认的配置参数(四)
  18. 国密SM9算法C++实现之六:密钥封装解封算法
  19. c语言猜牌游戏,C++实现猜牌小游戏
  20. PDA设备BUG修复和打包成APK文件

热门文章

  1. Pyhon Django 表单类ModelForm注册案例(可直接操作数据库)
  2. Spring的使用步骤
  3. 如何在eclipse中自定义一个jar包名称
  4. 最优化——分析线性规划的对偶问题的等价性
  5. mysql5.6最好的备份方案_Mysql 5.6迁移至PostgreSQL 9.6的实践小结
  6. C/C++之C++命名空间
  7. Qt小游戏《2048》源码(含大量注释)
  8. 剩余 大小 查看内存_计算机内存管理介绍
  9. OS / 进程中某个线程崩溃,是否会对其他线程造成影响?
  10. C++ 函数传参的三种方式