zoukankan      html  css  js  c++  java
  • I.MX6 AT24Cxx eeprom Linux i2c-gpio

    /**************************************************************************
     *                  I.MX6 AT24Cxx eeprom Linux i2c-gpio
     * 声明:
     *     很多时候当我们使用Linux系统管理硬件的时候,更多的是通过芯片中的控制器,
     * 但有时候,我们也会遇到芯片中的控制不够用,或者在设计的过程中出现意外,如没
     * 有想到控制器存在,本文中的内容就是因为I2C中第四个控制器不存在,但硬件上却
     * 认为其存在,为了解决这个问题,发现了i2c-gpio设备驱动,以此类推的,其他的一
     * 些相对简单的控制器也会有这种IO设备驱动。
     *
     *                                       2015-12-20 深圳 南山平山村 曾剑锋
     *************************************************************************/
    
    
                        \\\\\\-*- 目录 -*-////////////
                        |  一.参考文档:    
                        |  二.Linux内核支持的I2C总线形式:    
                        |  三.开启内核i2c-gpio功能:    
                        |  四.开启AT24Cxx系列eeprom驱动:    
                        |  五.GPIO IO配置:    
                        |  六.板级文件移植代码:    
                        |  七.eeprom写保护问题:    
                        ------------------------------------
    
    
    
    一.参考文档:
        1.linux gpio模拟i2c的使用/用GPIO模拟I2C总线-1:
            http://blog.163.com/ac952_hmz/blog/static/94791513201281133230840/
        2.基于S3C2440的嵌入式Linux驱动——AT24C02(EEPROM I2C接口)驱动解读:
            http://blog.csdn.net/yj4231/article/details/18182775
    
    二.Linux内核支持的I2C总线形式:
        1.使用芯片上有I2C总线控制器:
            可以直接将I2C设备挂载在对应的总线上。
        2.不使用芯片上I2C总线控制器,通过模拟I2C总线时序:
            通过使用普通的GPIO口,自己去控制GPIO引脚电平,延时时长,模拟出I2C时序,以此来和I2C设备通信。
        3.不使用芯片上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驱动:
        1. 由于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/5 power supply supervisor                         │ │  
            │ │    < > EEPROM 93CX6 support                                            │ │  
            │ │                                                                        │ │  
            │ │                                                                        │ │  
            │ │                                                                        │ │  
            │ │                                                                        │ │  
            │ │                                                                        │ │  
            │ │                                                                        │ │  
            │ │                                                                        │ │  
            │ └────────────────────────────────────────────────────────────────────────┘ │  
            ├────────────────────────────────────────────────────────────────────────────┤  
            │                      <Select>    < Exit >    < Help >                      │  
            └────────────────────────────────────────────────────────────────────────────┘  
        2. 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  = 5,                   //100Khz
            .timeout = 500,  
            //.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  = 3, /* 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(3, gpio_i2c_devices, ARRAY_SIZE(gpio_i2c_devices));
            ......
        }
        ......
    
    七.eeprom写保护问题:
        当你发现能够从eeprom中读出数据,但是无法往eeprom中写数据时,请检查eeprom芯片的wp(write protect)引脚是否被上拉了。
  • 相关阅读:
    codeforces C. Fixing Typos 解题报告
    codeforces B. The Fibonacci Segment 解题报告
    codeforces B. Color the Fence 解题报告
    codeforces B. Petya and Staircases 解题报告
    codeforces A. Sereja and Bottles 解题报告
    codeforces B. Levko and Permutation 解题报告
    codeforces B.Fence 解题报告
    tmp
    API 设计 POSIX File API
    分布式跟踪的一个流行标准是OpenTracing API,该标准的一个流行实现是Jaeger项目。
  • 原文地址:https://www.cnblogs.com/zengjfgit/p/5060331.html
Copyright © 2011-2022 走看看