博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
I.MX6 AT24Cxx eeprom Linux i2c-gpio
阅读量:6037 次
发布时间:2019-06-20

本文共 5582 字,大约阅读时间需要 18 分钟。

/************************************************************************** *                  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.  
selects submenus --->. │ │ Highlighted letters are hotkeys. Pressing
includes,
excludes, │ │
modularizes features. Press
to exit,
for Help, │ │ for Search. Legend: [*] built-in [ ] excluded
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(+)────────────────────────────────────────────────────────────────┘ │ ├────────────────────────────────────────────────────────────────────────────┤ │
< 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
//添加i2c-gpio头文件 #include
//添加头文件 ...... /** * 指定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)引脚是否被上拉了。

 

转载于:https://www.cnblogs.com/zengjfgit/p/5060331.html

你可能感兴趣的文章
Java break continue return 的区别
查看>>
算法(Algorithms)第4版 练习 1.3.4
查看>>
jquery easyUI checkbox复选项获取并传后台
查看>>
浅析NopCommerce的多语言方案
查看>>
设计模式之简单工厂模式
查看>>
C++中变量的持续性、链接性和作用域详解
查看>>
2017 4月5日上午
查看>>
Google Chrome开发者工具
查看>>
第一阶段冲刺报告(一)
查看>>
使用crontab调度任务
查看>>
【转载】SQL经验小记
查看>>
zookeeper集群搭建 docker+zk集群搭建
查看>>
Vue2.5笔记:Vue的实例与生命周期
查看>>
论JVM爆炸的几种姿势及自救方法
查看>>
联合体、结构体简析
查看>>
使用throw让服务器端与客户端进行数据交互[Java]
查看>>
java反射与代理
查看>>
深度分析Java的ClassLoader机制(源码级别)
查看>>
微服务架构选Java还是选Go - 多用户负载测试
查看>>
我的友情链接
查看>>