From

一:读写/dev/i2c-x设备结点
/dev/i2c-x设备结点对应的驱动文件为内核目录drivers/i2c下自带的i2c-dev.c文件,通读此文件可以发现它的工作流程。1、通过register_chrdev注册字符设备结点2、通过class_create在sysfs下创建对应的class结点3、利用bus_register_nofifier对I2C总线添加通知链,在有适配器加入或删除时调用相应的处理函数4、通过I2C核心函数i2c_for_each_dev循环遍历I2C总线上的设备,每找到一个设备便执行i2cdev_attach_adapter函数5、在i2cdev_attach_adapter函数中会首先判断此设备是否为适配器,如果是,则通过device_create在/dev目录下生成相应的结点,名称为i2c-x,其中x为第几个适配器6、在用户空间利用open("/dev/i2c-x",O_RDWR)操作相应结点时,会为操作此适配器的每一个用户创建一个i2c_client,i2c_client会通过client->adapter = adapter和file->private_data = client关联对应的适配器和操作文件7、则在用户空间通过read/write函数操作设备时驱动通过struct i2c_client *client = file->private_data;获取到适配器结构,继而通过调用I2C核心函数i2c_mater_send/i2c_master_recv,最终调用到具体的适配器发送/接收数据函数通过此方法操作I2C设备时需注意在通过open打开设备结点后,需通过ioctl I2C_SLAVE函数设置设备地址,之后才可通过read/write函数对设备进行操作二:自定义I2C设备,并通过/dev下对应结点操作驱动文件可按如下编写:
1、通过module_i2c_driver注册对应的I2C驱动,此时内核会遍历挂载在I2C总线上的设备,通过总线的match方法对驱动和设备进行匹配,匹配原则可以是1、基于设备树的of_driver_match_device方法,对应的结构为定义的驱动结构体是否含有of_match_table成员 2、基于id_table的匹配,对应为驱动是否定义id_table成员 3、基于名字的匹配,匹配原则为驱动的name是否和设备的name相同 4、基于ACPI风格的匹配,使用较少2、当驱动和设备匹配后会先调用I2C总线的probe函数先做一些处理,之后便会调用我们定义的I2C驱动的probe函数3、在probe函数中保存client指针到我们自定义的设备结构体中,如自定义为:struct xxx{struct i2c_client client;...
};4、通过register_chrdev注册字符设备,通过class_create和device_create创建/sys/和/dev/下结点(或通过mknod手工创建)5、在open函数中将自定义的驱动结构设置为file->private_data,方便在读写函数中获取6、在用户空间通过open函数打开我们注册的/dev/目录下结点,read/write时便会调用对应的读写函数,在读写函数中会通过file->private_data获取到自定义驱动结构,进而取到i2c_client,最终通过i2c_mater_send/i2c_master_recv或直接自己构建i2c_msg通过i2c_transfer进行发送三:通过DEVICE_ATTR在对应的sys设备目录下创建读写文件
1、还是先通过module_i2c_driver注册对应的I2C驱动,在找到设备后调用的probe函数中,只需要通过sysfs_create_files创建一组读写函数或sysfs_create_group创建多组操作函数2、编写读写函数并通过DEVICE_ATTR宏进行声明,将函数组织为struct attribute,多组struct attribute组织为struct attribute_group并作为刚刚sysfs函数的参数3、用户空间不需要通过open/read/write方法,而只需要通过echo/cat对/sys/class/设备名称目录下的刚刚定义的函数进行读写就可以了四:将驱动注册为regmap,在对应的读写函数中使用regmap的读写方法
regmap是内核3.1之后加入的特性,用于减少慢速I/O驱动上的重复逻辑,可以使驱动代码量减少。这种方法个人觉得最大的好处是那些既支持I2C又支持SPI的设备,而在实际使用中只会使用其中一种接口,所以公共部分的读写函数不再通过i2c_transfer或者spi_sync_transfer这些特定于具体总线的操作函数,而是通过regmap提供的regmap_read/regmap_write公共函数,此函数会根据之前设备的注册自动选择为是I2C或是SPI的操作,所以我们需要做的就是:1、通过module_i2c_driver或是module_spi_driver注册设备,内核会根据i2c_borad_info或者spi_board_info或者设备树中设备所挂载在的总线自动进行I2C或者SPI的probe操作2、在I2C的probe函数中通过devm_regmap_init_i2c,在SPI的probe函数中通过devm_regmap_init_spi将设备注册为regmap的对应接口,函数的第二个参数为regmap_config结构,指示了寄存器宽度和数据宽度3、可通过上方的二方法将设备注册为字符设备或三方法在/sys目录下创建对应的操作函数4、在操作函数的实现中只需要通过regmap_read/regmap_write对数据进行处理就可以了

linux应用对I2C设备驱动4种读写方法相关推荐

  1. 在Linux系统中存储设备的两种表示方法

    作者:北南南北 来自:LinuxSir.Org 摘要: 硬盘和硬盘分区在Linux都表示为设备,按我们通俗的说法来说,就是怎么来表示或描述硬盘和或硬盘分区,但这种描述应该是科学和具体的:比如IDE硬盘 ...

  2. linux I2C设备驱动

    linux内核的总线-设备-驱动模型,当总线上的设备与总线上的驱动匹配时,就会调用驱动的probe函数,完成一系列的操作 I2C也是内核的一种总线 一.I2C设备的4种构建方法 1.静态注册设备 (1 ...

  3. 用户空间访问I2C设备驱动

    2012-01-11 15:33:43 标签:Linux I2C 字符设备 设备驱动 用户空间 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. ...

  4. linux下i2c设备驱动程序,Linux I2C 设备驱动

    I2C 设备驱动要使用 i2c_driver 和 i2c_client 数据结构并填充其中的成员函数.i2c_client 一般被包含在设备的私有信息结构体yyy_data 中,而 i2c_drive ...

  5. 手把手教你写Linux I2C设备驱动

    手把手教你写Linux I2C设备驱动 标签:Linux 设备 驱动 详解 i2c 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http:/ ...

  6. linux探测i2c设备连接状态,手把手教你写Linux I2C设备驱动

    Linux I2C驱动是嵌入式Linux驱动开发人员经常需要编写的一种驱动,因为凡是系统中使用到的I2C设备,几乎都需要编写相应的I2C驱动去配置和控制它,例如 RTC实时时钟芯片.音视频采集芯片.音 ...

  7. Linux I2C设备驱动编写(二)

    I2C对外API I2C client的注册 i2c_register_board_info具体实现 i2c_new_device I2C driver 关于I2C设备驱动的小总结 I2C adapt ...

  8. 手把手教你写Linux I2C设备驱动 tvp5158

    Linux I2C驱动是嵌入式Linux驱动开发人员经常需要编写的一种驱动,因为凡是系统中使用到的I2C设备,几乎都需要编写相应的I2C驱动去配置和控制它,例如 RTC实时时钟芯片.音视频采集芯片.音 ...

  9. Linux 设备驱动篇之I2c设备驱动

    ******************************************************************************************** 装载声明:希望 ...

最新文章

  1. 【转】一台台式机电脑 是集成显卡,我现在想搞两个显示器,一台显示器看监控,一台显示器自己...
  2. 为什么Java 8中不再需要StringBuilder拼接字符串
  3. Hadoop 05_MapReduce1.0
  4. java 1.7 环境变量_安装JDK1.8之后又安装1.7出现的环境变量问题
  5. onvif 模拟摄像头_VirtualOnvif 这是一个虚拟的网络摄像机 - 下载 - 搜珍网
  6. 大数据之 Hadoop 基本概念
  7. jquery表单的提交
  8. 170923_Spring Cloud 微服务实战(翟永超著) 读书笔记(一)_什么是Spring Cloud?
  9. 珍藏汇总:19个超赞无版权免费图片素材库
  10. linux 温度测试软件,linux上安装cpu温度监控软件
  11. 小程序华为手机canvas不显示问题
  12. excel切片器联动
  13. 化妆品不合肤质惹来老年斑
  14. C++ websocket 使用体验
  15. 视频编解码中的temporal id和layer id(x265,HM,VTM)
  16. DirectX12 - Pipeline(管线)
  17. 《银行磁条卡销售点终端规范》
  18. 多路YUV_RGB文件播放器
  19. 067_bilibili_downloader
  20. FND_MESSAGE使用

热门文章

  1. Hyper-V 虚拟网络设置
  2. Parallels中使用加密狗读取文件出现错误
  3. IronPython 小试牛角
  4. 安卓开发者必备的六个工具
  5. vue 读取ajax数据,详解vue 中使用 AJAX获取数据的方法
  6. 【机器学习】因子分解机(Factorization Machine)原理与java实现
  7. 光盘放进电脑读不出来_U盘插入电脑读不出来?学会这3招,轻松解决USB无法读取的问题...
  8. uniapp 模糊搜索文字添加颜色
  9. php ssl扩展,php如何安装openssl扩展?
  10. python修饰器执行步骤_Python修饰器学习总结