/**************************************************************************
* I.MX6 AT24Cxx eeprom Linux i2c-gpio
* 声明:
* 很多时候当我们使用Linux系统管理硬件的时候,更多的是通过芯片中的控制器,
* 但有时候,我们也会遇到芯片中的控制不够用,或者在设计的过程中出现意外,如没
* 有想到控制器存在,本文中的内容就是因为I2C中第四个控制器不存在,但硬件上却
* 认为其存在,为了解决这个问题,发现了i2c-gpio设备驱动,以此类推的,其他的一
* 些相对简单的控制器也会有这种IO设备驱动。
*
* 2015-12-20 深圳 南山平山村 曾剑锋
*************************************************************************/ \\\\\\\\\\\\\-*- 目录 -*-////////////
| 一.参考文档:
| 二.Linux内核支持的I2C总线形式:
| 三.开启内核i2c-gpio功能:
| 四.开启AT24Cxx系列eeprom驱动:
| 五.GPIO IO配置:
| 六.板级文件移植代码:
| 七.eeprom写保护问题:
------------------------------------ 一.参考文档:
.linux gpio模拟i2c的使用/用GPIO模拟I2C总线-:
http://blog.163.com/ac952_hmz/blog/static/94791513201281133230840/
.基于S3C2440的嵌入式Linux驱动——AT24C02(EEPROM I2C接口)驱动解读:
http://blog.csdn.net/yj4231/article/details/18182775 二.Linux内核支持的I2C总线形式:
.使用芯片上有I2C总线控制器:
可以直接将I2C设备挂载在对应的总线上。
.不使用芯片上I2C总线控制器,通过模拟I2C总线时序:
通过使用普通的GPIO口,自己去控制GPIO引脚电平,延时时长,模拟出I2C时序,以此来和I2C设备通信。
.不使用芯片上I2C总线控制器,使用Linux内核自带的i2c-gpio驱动:
只需要指定要使用的GPIO口,延时时长,由i2c-gpio驱动去管理如何跟I2C设备通信,相当是一个I2C控制器,这是Linux内核提供的。 由于当前工作中的硬件设计需求,本文主要阐述第3种实现方式。 三.开启内核i2c-gpio功能:
如下图在内核配置中打开I2C_GPIO功能:
──────────────────────────────────────────────────────────────────────────────
┌───────────────────────── I2C Hardware Bus support ─────────────────────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus --->. │
│ Highlighted letters are hotkeys. Pressing <Y> includes, <N> excludes, │
│ <M> modularizes features. Press <Esc><Esc> to exit, <?> for Help, </> │
│ for Search. Legend: [*] built-in [ ] excluded <M> module < > module │
│ ┌────^(-)────────────────────────────────────────────────────────────────┐ │
│ │ < > SiS 96x │ │
│ │ < > VIA VT82C586B │ │
│ │ < > VIA VT82C596/82C686/82xx and CX700/VX8xx │ │
│ │ *** I2C system bus drivers (mostly embedded / system-on-chip) **│ │
│ │ < > Synopsys DesignWare │ │
│ │ <*> GPIO-based bitbanging I2C │ │
│ │ <*> IMX I2C interface │ │
│ │ < > Intel Moorestown/Medfield Platform I2C controller │ │
│ │ < > OpenCores I2C Controller │ │
│ │ < > PCA9564/PCA9665 as platform device │ │
│ │ < > Simtec Generic I2C interface │ │
│ │ < > Xilinx I2C Controller │ │
│ └────v(+)────────────────────────────────────────────────────────────────┘ │
├────────────────────────────────────────────────────────────────────────────┤
│ <Select> < Exit > < Help > │
└────────────────────────────────────────────────────────────────────────────┘ 四.开启AT24Cxx系列eeprom驱动:
. 由于Linux内核中已经包含了AT24Cxx系列的驱动,所以我们不需要做这部分工作,如下图在内核配置中打开AT24Cxx系列的驱动。
──────────────────────────────────────────────────────────────────────────────
┌────────────────────────────── EEPROM support ──────────────────────────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus --->. │
│ Highlighted letters are hotkeys. Pressing <Y> includes, <N> excludes, │
│ <M> modularizes features. Press <Esc><Esc> to exit, <?> for Help, </> │
│ for Search. Legend: [*] built-in [ ] excluded <M> module < > module │
│ ┌────────────────────────────────────────────────────────────────────────┐ │
│ │ <*> I2C EEPROMs from most vendors │ │
│ │ < > SPI EEPROMs from most vendors │ │
│ │ < > Old I2C EEPROM reader │ │
│ │ < > Maxim MAX6874/ power supply supervisor │ │
│ │ < > EEPROM 93CX6 support │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ └────────────────────────────────────────────────────────────────────────┘ │
├────────────────────────────────────────────────────────────────────────────┤
│ <Select> < Exit > < Help > │
└────────────────────────────────────────────────────────────────────────────┘
. AT24Cxx系列的驱动内核源代码:drivers/misc/eeprom/at24.c 五.GPIO IO配置:
......
/* IMX6DL no i2c4 */
/**
*MX6DL_PAD_ENET_TX_EN__I2C4_SCL,
*MX6DL_PAD_ENET_TXD1__I2C4_SDA,
*/
MX6DL_PAD_ENET_TX_EN__GPIO_1_28,
MX6DL_PAD_ENET_TXD1__GPIO_1_29,
...... 六.板级文件移植代码:
......
#include <linux/i2c-gpio.h> //添加i2c-gpio头文件
#include <linux/i2c/at24.h> //添加头文件
......
/**
* 指定2个GPIO用于I2C总线的SDA、SCL线
*/
#define SABRESD_I2C4_SDA_GPIO IMX_GPIO_NR(1, 29)
#define SABRESD_I2C4_SCL_GPIO IMX_GPIO_NR(1, 28)
......
static struct i2c_gpio_platform_data i2c_bus_gpio_data = {
.sda_pin = SABRESD_I2C4_SDA_GPIO,
.scl_pin = SABRESD_I2C4_SCL_GPIO,
.udelay = , //100Khz
.timeout = ,
//.sda_is_open_drain = 1, //在当前板子上不能加
//.scl_is_open_drain = 1, //在当前板子上不能加
};
static struct platform_device i2c_bus_gpio_device = {
//这个名字是必须这样,主要是为了和i2c-gpio驱动对应
.name = "i2c-gpio",
//由于主板已经用掉了0,1,2号,这里使用3
.id = , /* bus have 0,1,2, so start at 3 */
.dev = {
.platform_data = &i2c_bus_gpio_data,
}
};
static struct i2c_board_info __initdata gpio_i2c_devices[] = {
{
/**
* 24c02:与at24.c驱动中对应的at24c02驱动名对应
* 0x50:为对应I2C设备的地址,也就我们at24c02设备的地址
*/
I2C_BOARD_INFO("24c02", 0x50),
},
};
......
static void __init mx6_sabresd_board_init(void)
{
......
/**
* register gpio i2c bus write by zengjf
* 注册i2c-gpio设备,相当于注册一个I2C控制器
*/
platform_device_register(&i2c_bus_gpio_device);
......
/**
* register gpio i2c device write by zengjf
* 在I2C控制器3上注册I2C设备,这里的控制器3就是前面注册的I2C控制器,
* 主要是因为前面注册的I2C控制器的id是3
*/
i2c_register_board_info(, gpio_i2c_devices, ARRAY_SIZE(gpio_i2c_devices));
......
}
...... 七.eeprom写保护问题:
当你发现能够从eeprom中读出数据,但是无法往eeprom中写数据时,请检查eeprom芯片的wp(write protect)引脚是否被上拉了。

I.MX6 AT24Cxx eeprom Linux i2c-gpio的更多相关文章

  1. I.MX6 Linux I2C device& driver hacking

    /******************************************************************************************* * I.MX6 ...

  2. Linux I2C总线设备驱动模型分析(ov7740)

    1. 框架1.1 硬件协议简介1.2 驱动框架1.3 bus-drv-dev模型及写程序a. 设备的4种构建方法a.1 定义一个i2c_board_info, 里面有:名字, 设备地址 然后i2c_r ...

  3. linux i2c驱动架构-dm368 i2c驱动分析

      linux i2c驱动架构-dm368 i2c驱动分析   在阅读本文最好先熟悉一种i2c设备的驱动程序,并且浏览一下i2c-core.c以及芯片提供商的提供的i2c总线驱动(i2c-davinc ...

  4. Linux I2C核心、总线和设备驱动

    目录 更新记录 一.Linux I2C 体系结构 1.1 Linux I2C 体系结构的组成部分 1.2 内核源码文件 1.3 重要的数据结构 二.Linux I2C 核心 2.1 流程 2.2 主要 ...

  5. Smart210学习记录-----Linux i2c驱动

    一:Linux i2c子系统简介: 1.Linux 的 I2C 体系结构分为 3 个组成部分: (1) I2C 核心. I2C 核心提供了 I2C 总线驱动和设备驱动的注册.注销方法,I2C 通信方法 ...

  6. linux i2c 设备节点读写

    最近需要操作24C02,封装了一下函数方便以后操作. 参考链接: https://my.oschina.net/handawei/blog/68526 http://blog.csdn.net/one ...

  7. linux驱动基础系列--Linux I2c驱动分析

    前言 主要是想对Linux I2c驱动框架有一个整体的把控,因此会忽略协议上的某些细节,同时里面涉及到的一些驱动基础,比如平台驱动.设备模型.sysfs等也不进行详细说明原理,涉及到i2c协议部分也只 ...

  8. Linux I2C驱动

    Linux I2C 驱动结构 i2c体系结构由三部分组成 i2C core i2c core提供了i2c 总线驱动 和 设备驱动的注册,注销方法 i2C and SMBus protocol 实现 i ...

  9. Android(Linux)控制GPIO方法二

    前文<Android(Linux)控制GPIO的方法及实时性分析>主要使用Linux shell命令控制GPIO,该方法可在调试过程中快速确定GPIO硬件是否有问题,即对应的GPIO是否受 ...

随机推荐

  1. iOS网络检测

    使用之前请从Apple网站下载示例:点此下载 Reachability 中定义了3种网络状态: typedef enum : NSInteger { NotReachable = ,//无网络 Rea ...

  2. Jmeter正则表达式提取器的使用方法(转)

    下面简单介绍一下Jmeter正则表达式提取器的使用方法. 1.添加Jmeter正则表达式提取器:在具体的Request下添加Jmeter正则表达式提取器(Jmeter正则表达式在“后置处理器”下面)  ...

  3. 十佳AngularJS框架

    您是否还在烦恼如何没有困难地创建一个创新型的Web应用程序?那么一定不要错过这个集合!在本文中,小编为大家收集了十个非常棒的AngularJS框架.AngularJS框架拥有大量有用的工具和组件,可以 ...

  4. SqlBulkCopy大批量数据插入到sql表中

    alter TYPE TableType AS TABLE ( Name VARCHAR() , code VARCHAR() ) GO alter PROCEDURE usp_InsertProdu ...

  5. 可运行jar包生成步骤和jar包的生成

    一.可运行jar包生成步骤 1.进入.class文件所在目录,新建一个记事本文件,假设为1.txt,文件内容: 1> Main-Class:可运行类的名字  (  例如:Main-Class:T ...

  6. 使用CSS3制作漂亮的按钮

    我给大家介绍一下如何使用CSS3来制作一个圆角阴影.渐变色的漂亮的按钮,它不需要任何图片和javascript脚本,只需要CSS3就可以轻松实现按钮效果,并且可以适用于任意HTML元素,想div,sp ...

  7. Qt_5_3_MSVC2012-编译QFtp-qt5编译QFtp

    一.下载源码 git clone https://qt.gitorious.org/qt/qtftp.git 或者直接下载:云盘下载 二.构建 1.不对源码修改,直接构建qtftp 2.做如下修改,再 ...

  8. XP下,文件夹添加右键命令行

    原文:XP下,文件夹添加右键命令行 总共有3种方式: --------------------1---------------------------------------------------- ...

  9. js获取滚动条距离浏览器顶部,底部的高度,兼容ie和firefox

    做web开发经常会碰到需要获取浏览器的滚动条与顶部和底部的距离,然后做相应的处理动作.下面作者就如何通过js来获取浏览器滚动条距离浏览器顶部和底部的高度做一下分享,这个是同时兼容ie和firefox的 ...

  10. IE6下position:fixed;兼容

    *html{ background-image:url(about:blank); background-attachment:fixed;}/*解决抖动问题*/ .backto-top{ width ...