[RK3288][Android6.0] AT24C02驱动分析及功能增加小结
Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92
Spec:
网上很多,如
https://wenku.baidu.com/view/0020131fff00bed5b8f31d05.html
驱动:
文件:
kernel/drivers/misc/eeprom/at24.c
支持at24cxx所有系列,当然也支持at24c02, 这些系列不同的区别仅在于eeprom的大小.
static const struct i2c_device_id at24_ids[] = {{ "24c00", AT24_DEVICE_MAGIC(128 / 8, AT24_FLAG_TAKE8ADDR) },{ "24c01", AT24_DEVICE_MAGIC(1024 / 8, 0) },{ "24c02", AT24_DEVICE_MAGIC(2048 / 8, 0) },{ "spd", AT24_DEVICE_MAGIC(2048 / 8,AT24_FLAG_READONLY | AT24_FLAG_IRUGO) },{ "24c04", AT24_DEVICE_MAGIC(4096 / 8, 0) },
......
};
驱动可以同时支持多个eeprom同时挂载,但需要修改eeprom的大小,比如支持at24c02,需要将2048改成4096.
static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
......
num_addresses = DIV_ROUND_UP(chip.byte_len,(chip.flags & AT24_FLAG_ADDR16) ? 65536 : 256);
......
}
驱动没有创建字符设备提供给上层, 而是以sysfs文件的读写方式来操作,对应读写操作函数:
at24_bin_read()和at24_bin_write()
操作路径:
/sys/bus/i2c/drivers/at24/5-0050/eeprom
5-0050是表示i2c通道5,地址是0x50,会根据设备连接i2c端口以及地址变化.
使用:
#echo "at24c02 test" > /sys/bus/i2c/drivers/at24/5-0050/eeprom
#cat /sys/bus/i2c/drivers/at24/5-0050/eeprom
如果需要偏移若干地址读写,可以编写一个ap来操作,可参考:
http://blog.csdn.net/dzw19911024/article/details/53813862
实际案例:
原理图:
改动如下:
diff --git a/arch/arm/boot/dts/rk3288-b.dts b/arch/arm/boot/dts/rk3288-b.dts
index 1ff653a..ad3bc1a 100644
--- a/arch/arm/boot/dts/rk3288-b.dts
+++ b/arch/arm/boot/dts/rk3288-b.dts
@@ -324,6 +324,7 @@&i2c3 {status = "okay";
+};&i2c4 {
@@ -340,8 +341,14 @@};};+//Kris,170510, add eeprom.&i2c5 {
- status = "disabled";
+ status = "okay";
+ eeprom@50 {
+ compatible = "24c02";
+ reg = <0x50>;
+ status = "okay";
+ };};&fb {
diff --git a/arch/arm/boot/dts/rk3288-pinctrl.dtsi b/arch/arm/boot/dts/rk3288-pinctrl.dtsi
index a35d4d7..4a4ebc8 100755
--- a/arch/arm/boot/dts/rk3288-pinctrl.dtsi
+++ b/arch/arm/boot/dts/rk3288-pinctrl.dtsi
@@ -404,21 +404,21 @@gpio7_i2c5 {i2c5_sda:i2c5-sda {
- rockchip,pins = <EDPHDMII2C_SDA>;
+ rockchip,pins = <I2C5HDMI_SDA>;rockchip,pull = <VALUE_PULL_NORMAL>;rockchip,drive = <VALUE_DRV_DEFAULT>;//rockchip,tristate = <VALUE_TRI_DEFAULT>;};i2c5_scl:i2c5-scl {
- rockchip,pins = <EDPHDMII2C_SCL>;
+ rockchip,pins = <I2C5HDMI_SCL>;rockchip,pull = <VALUE_PULL_NORMAL>;rockchip,drive = <VALUE_DRV_DEFAULT>;//rockchip,tristate = <VALUE_TRI_DEFAULT>;};i2c5_gpio: i2c5-gpio {
- rockchip,pins = <FUNC_TO_GPIO(EDPHDMII2C_SDA)>, <FUNC_TO_GPIO(EDPHDMII2C_SCL)>;
+ rockchip,pins = <FUNC_TO_GPIO(I2C5HDMI_SDA)>, <FUNC_TO_GPIO(I2C5HDMI_SCL)>;rockchip,drive = <VALUE_DRV_DEFAULT>;};};
diff --git a/arch/arm/configs/rockchip_b_defconfig b/arch/arm/configs/rockchip_b_defconfig
index a7037c2..092dc3c 100644
--- a/arch/arm/configs/rockchip_b_defconfig
+++ b/arch/arm/configs/rockchip_b_defconfig
@@ -662,3 +662,5 @@ CONFIG_CRYPTO_TWOFISH=yCONFIG_CRYPTO_DEV_ROCKCHIP=yCONFIG_CRYPTO_DEV_ROCKCHIP_ENCRYPT=yCONFIG_XMF10411=y
+#Kris,170510, add eeprom
+CONFIG_EEPROM_AT24=y
diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c
index 2baeec5..a6391a9 100644
--- a/drivers/misc/eeprom/at24.c
+++ b/drivers/misc/eeprom/at24.c
@@ -213,11 +213,15 @@ static ssize_t at24_eeprom_read(struct at24_data *at24, char *buf,msg[0].addr = client->addr;msg[0].buf = msgbuf;msg[0].len = i;
+ //Kris, 170510, set scl_rate.
+ msg[0].scl_rate = 100*1000;msg[1].addr = client->addr;msg[1].flags = I2C_M_RD;msg[1].buf = buf;msg[1].len = count;
+ //Kris, 170510, set scl_rate.
+ msg[1].scl_rate = 100*1000;}/*
@@ -331,6 +335,7 @@ static ssize_t at24_eeprom_write(struct at24_data *at24, const char *buf,/* Get corresponding I2C address and adjust offset */client = at24_translate_offset(at24, &offset);+/* write_max is at most a page */if (count > at24->write_max)count = at24->write_max;
@@ -355,6 +360,8 @@ static ssize_t at24_eeprom_write(struct at24_data *at24, const char *buf,msg.buf[i++] = offset;memcpy(&msg.buf[i], buf, count);msg.len = i + count;
+ //Kris, 170510, set scl_rate.
+ msg.scl_rate = 100*1000;}
参考:
地址设置:
http://blog.csdn.net/qq_27312943/article/details/53325885
驱动解析:
http://blog.csdn.net/yj4231/article/details/18182775
[RK3288][Android6.0] AT24C02驱动分析及功能增加小结相关推荐
- MTK6580(Android6.0)-camera 驱动分析
一.MTK6580 平台 Camera 驱动整体框架 mtk平台三大件调试中,camera的调试难度最大,问题也就最多,为此特地分析了一下整个camera驱动部分 实现过程,以下为camera驱动框架 ...
- [RK3288][Android6.0] 串口驱动流程小结
Platform: ROCKCHIP OS: Android 6.0 Kernel: 3.10.92 RK的调试串口使用的是另外一套方法(后面再提), 这里的流程针对普通的串口. 相关文件: rk_s ...
- [RK3288][Android6.0] Audio录音frame rate设置流程小结
Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 HAL: 默认的配置在 hardware/rockchip/audio/tinyalsa_hal/ ...
- [RK3288][Android6.0] 调试笔记 --- WiFi芯片AP6356S添加
Platform: RK3288 OS: Android 6.0 Kernel: 3.10.92 背景: RK3288 Android6.0平台对AP6356S的支持不是很完善,直接修改wifi ch ...
- [RK3288][Android6.0] 设置中通过Sensor旋转显示画面小结
Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 Settings -> Display有个选项控制旋转屏幕时内容是否跟着旋转 这个功能是通过 ...
- android6.0源码分析之Zygote进程分析
在android6.0源码分析之Runtime的初始化一文中,对Zygote进程的初期的Runtime初始化过程进行了分析,在Runtime启动结束后,会对Zygote进程进行初始化,其它Java进程 ...
- android6.0源码分析之Camera2 HAL分析
1.Camera HAL的初始化 Camera HAL的初始加载是在Native的CameraService初始化流程中的,而CameraService初始化是在Main_mediaServer.cp ...
- [RK3288][Android6.0] 调试笔记 --- 电池电量一直显示100%
Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 之前文章[RK3288][Android6.0] 调试笔记 - 伪电池驱动添加 阐述了如何添加一个 ...
- android6.0源码分析之Runtime的初始化
Android运行时作为android架构的一部分,起着非常重要的作用,它和核心库(Core Libraries)组成了Android运行时库层.本文将依据android源码对AndroidRunti ...
最新文章
- update 改写 merge into
- supervisord+supervisorclusterctl+supervisord-monit
- CNN 模型的参数(parameters)数量和浮点运算数量(FLOPs)是怎么计算的
- ssm访问html页面,SSM实现未登录无法访问页面
- 修改密码导致应用程序池无法启动
- mysql中的所有类型_mysql中常用的数据类型
- java初级系统项目_JavaSE-初级阶段项目-基于excel表格的学生管理系统
- Word转换PDF:pdf虚拟打印机怎么用操作技巧详解
- 物流车笔记——编码器原理
- Mac中如何将本地文文档设置成文档模板(WPS)
- 一个完整的系统测试需要考虑哪些方面
- 学生来看我,我自我满足...........
- 个人邮箱怎么注册,商业人士用哪个邮箱,邮箱使用全攻略!
- C语言指针(函数指针数组,二级指针)
- 与第三方Api接口对接需要注意的点
- vue为什么需要nodejs 的环境
- 好消息!ios10越狱插件造成桌面图标消失的完美解决方法来了!!!
- Prolog系列学习-1
- 【蓝桥杯选拔赛真题01】python输出字符串 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析
- String split()