RK3566 Android12 HG24C02MM/TR EEPROM适配
一、背景
近期项目中,有一个需求,要使用RK3566 Android12平台适配一款HG24C02MM/TR EEPROM芯片,通过i2c实现主板与EEPROM芯片的数据通讯。废话不多说,来看资料。
二、芯片资料
HG24C02 / HG24C04 / HG24C08 / HG24C16是提供2048/4096/8192/16384位串行电可擦除和可编程只读存储器(EEPROM),组织为256/512/1024/2048个8位字。该设备经过优化,适用于许多工业和商业应用,其中低功耗和低电压操作是必不可少的。HG24C02 / HG24C04 / HG24C08 / HG24C16有节省空间的8引脚DIP, 8引脚SOP, 8引脚MSOP, 5引脚SOT23封装,通过两线串行接口接入。翻译不太准确,直接看原文:
简单讲,在下使用的这款芯片为2Kbit(256x8)的串行EEPROM,采用I2C接口通信。要通过I2C做通讯,该芯片采用SDA引脚实现双向的数据传输,SCK作为I2C的时钟输入。。。表格如下:
引脚号 | 引脚名称 | 功能描述 |
---|---|---|
1 | A0 | 设备地址输入位 0(可硬件配置,用于多设备区分) |
2 | A1 | 设备地址输入位 1(可硬件配置,用于多设备区分) |
3 | A2 | 设备地址输入位 2(可硬件配置,用于多设备区分) |
4 | GND | 地(GND)(电源负极,0V参考) |
5 | SDA | 串行数据线(双向数据传输,开漏输出,需上拉电阻) |
6 | SCL | 串行时钟线(I²C 时钟输入,上升沿采样数据) |
7 | WP | 写保护(高电平禁止写入,低电平允许写入) |
8 | VCC | 电源正极(典型电压:1.7V~5.5V) |
这里值得留意的是A0、A1、A2这三个引脚,通过查看硬件的配置,设定其电平高低为0还是1,以便于区分多个设备,比如在下的项目就采用两个HG24C02芯片,那么就得做区分处理,让软件能够识别到不同的芯片,这点下文细谈。
在下在开发过程中真正采用到的信息资料也就上述内容,其余的有兴趣可从datasheet规格书中了解。
三、硬件接线
鉴于保密需求,该方面不作展示。
四、软件调试
1、DTS配置
首先得先搞懂EEPROM的IIC设备地址是哪个,如同前面提到过的,这里我们要去看硬件上A0、A1、A2引脚的接线。在下的电平配置分别是:
第一个HG24C02芯片为A0=0,A1=0,A2=1
第二个HG24C02芯片为A0=0,A1=1,A2=1
这里呢我们看到芯片规格书中的下图所示
可以得知在下使用的芯片设备地址常规配列为:
1 0 1 0 A2 A1 A0 R/W
通常R/W位值默认是0,那么,
第一个芯片的地址的二进制序列为
10101000
右移一位,得到
01010100
化为16进制,得到的值即为该芯片的I2C设备地址:
0x54
同理,第二个芯片的地址的二进制序列为
10101100
右移一位,得到
01010110
转换16进制,得到第二个芯片的I2C设备地址:
0x56
那么dts中配置如下:
&i2c3 {status = "okay";pinctrl-names = "default";pinctrl-0 = <&i2c3m1_xfer>; eeprom@54{compatible = "atmel,24c02";reg = <0x54>;// pagesize = <8>;status = "okay";};};&i2c5 {status = "okay";pinctrl-names = "default";pinctrl-0 = <&i2c5m0_xfer>;eeprom@56{compatible = "atmel,24c02";reg = <0x56>;// pagesize = <8>;status = "okay";};
};
其中,驱动部分我们使用at24c02的驱动,因为HG24C02和AT24C02在硬件接口、通信协议以及功能逻辑上完全兼容,属于同类型的I2C EEPROM存储设备。该驱动在RK的SDK中已经适配,我们直接调用即可。
通过查看对应驱动的Makefile文件和Kconfig文件可知,我们需同步打开配置如下:
CONFIG_EEPROM_AT24=y
2、调试测试
接下来,编译烧录系统,我们用命令查看i2c3和i2c5上的设备:
rk3566:/ # i2cdetect -y 30 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- UU -- -- -- -- -- -- -- 5c -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --rk3566:/ # i2cdetect -y 50 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- UU -- -- -- -- -- -- -- 5e --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
可以知道,我们在0x54和0x56上的两个i2c设备的内核驱动已经成功加载,当然,这里也可以通过log查看驱动加载的流程。接下来,我们查看生成的EEPROM节点,以I2C5为例,如下
rk3566:/ # cd /sys/bus/i2c/devices/5-0056/
rk3566:/sys/bus/i2c/devices/5-0056 # ls
5-00560 driver eeprom modalias name of_node power subsystem uevent
rk3566:/sys/bus/i2c/devices/5-0056 # echo "Hello World" > eeprom
rk3566:/sys/bus/i2c/devices/5-0056 # cat eeprom
Hello World
er eeprom modalias name of_node power subsystem uevent
5-26 09:00:44/sys/bus/i2c/devices/5-0056/eeprom����������������������������������������������������������������������������������������������������������������������������������������������
rk3566:/sys/bus/i2c/devices/5-0056 #
成功加载驱动的话,会生成有一个EEPROM节点,通过echo命令往里面写值,可以看到,cat命令后能输出我们先前输入进去的内容"Hallow World"。到这里,我们基本上打通了这个HG24C02芯片的底层配置。为了方便后续Android系统服务(比如hal或vendor进程)访问这些EEPROM设备,我们再把它们的权限组修改,如下配置:
Index: device/rockchip/rk356x/init.rk356x.rc
===================================================================
--- device/rockchip/rk356x/init.rk356x.rc (revision 6666)
+++ device/rockchip/rk356x/init.rk356x.rc (revision 6667)
@@ -44,6 +44,12 @@
on boot...... # reduce schedul time to improve io performancewrite /sys/kernel/debug/sched_features NO_ENERGY_AWARE
+
+ chown system system /sys/bus/i2c/devices/3-0054/eeprom
+ chmod 0660 /sys/bus/i2c/devices/3-0054/eeprom
+
+ chown system system /sys/bus/i2c/devices/5-0056/eeprom
+ chmod 0660 /sys/bus/i2c/devices/5-0056/eepromon init# Increased power consumption and CPU in exchange for memory
至此,完成整个开发流程。
五、参考资料
1、RK3568-适配at24c04模块_rk3568 i2c地址范围-CSDN博客https://blog.csdn.net/qq_42952079/article/details/134054118
2、RK3566调试eeprom_内核配置eeprom-CSDN博客https://blog.csdn.net/professionalmcu/article/details/126934556
3、24C02原理图设计+管脚配置+管脚描述_24c02引脚图原理图-CSDN博客https://blog.csdn.net/XL__MAX/article/details/87913634
4、AT24C02 E2PROM芯片详解_24c02地址-CSDN博客https://blog.csdn.net/as480133937/article/details/105472659
5、24C02 EEPROM详解-CSDN博客https://blog.csdn.net/qq_45386946/article/details/108182813
相关文章:

RK3566 Android12 HG24C02MM/TR EEPROM适配
一、背景 近期项目中,有一个需求,要使用RK3566 Android12平台适配一款HG24C02MM/TR EEPROM芯片,通过i2c实现主板与EEPROM芯片的数据通讯。废话不多说,来看资料。 二、芯片资料 HG24C02 / HG24C04 / HG24C08 / HG24C16是提供2048…...

IoTDB 集成 DBeaver,简易操作实现时序数据清晰管理
数据结构一目了然,跨库分析轻松实现,方便 IoTDB “内部构造”管理! 随着物联网场景对时序数据处理需求激增,时序数据库与数据库管理工具的集成尤为关键。作为数据资产的 “智能管家”,借助数据库管理工具的可视化操作界…...

sqli-labs第二十八关——Trick with ‘union select‘
一:分析 这一关的提示和上一关一样,所以我们查看源码,屏蔽了注释符,空格,union,select等关键词 分析这一条源码的几个新增添符号 \s: 匹配任何的空白字符(普通空格,\t&…...

mapbox高阶,PMTiles介绍,MBTiles、PMTiles对比,加载PMTiles文件
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️Fill面图层样式1.4 ☘️PMTiles介绍1.5…...
Go语言通道如何实现通信
在Go语言中,通道(channel)是一种内置的数据结构,用于在不同的goroutine之间进行通信和同步。通道提供了一种安全且有效的方式来传递数据,避免了数据竞争和死锁等问题。 要在Go语言中使用通道进行通信,你需…...

投稿 IEEE Transactions on Knowledge and Data Engineering 注意事项
投稿 IEEE Transactions on Knowledge and Data Engineering 注意事项 要IEEE overleaf 模板私信,我直接给我自己论文,便于编辑 已经投稿完成了,有一些小坑 准备工作 注册IEEE账户:若没有IEEE账户,需前往IEEE官网注册。注册成功后,可用于登录投稿系统。现在新的系统,…...
题目 3316: 蓝桥杯2025年第十六届省赛真题-数组翻转
题目 3316: 蓝桥杯2025年第十六届省赛真题-数组翻转 时间限制: 3s 内存限制: 512MB 提交: 101 解决: 24 题目描述 小明生成了一个长度为 n 的正整数数组 a1, a2, . . . , an,他可以选择连续的一 段数 al , al1, ..., ar,如果其中所有数都相等即 al al1 …...

mongodb源码分析session接受客户端find命令过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制。 现在继续研究ASIOSession和connection是怎么接受客户端命令的? mongo/transport/service_state_machine.cpp核心方法有…...
Netty 实战篇:为自研 RPC 框架加入异步调用与 Future 支持
我们在上篇实现了一个轻量级 RPC 框架,现在要进一步优化 —— 加入异步响应支持,让 RPC 通信变得真正高效、非阻塞、支持并发。 一、为什么需要异步调用? 上篇的 RPC 框架是“同步阻塞”的: 每次发送请求后,必须等待服…...
python37天打卡
知识点回顾: 过拟合的判断:测试集和训练集同步打印指标 模型的保存和加载 仅保存权重 保存权重和模型 保存全部信息checkpoint,还包含训练状态 早停策略 作业:对信贷数据集训练后保存权重,加载权重后继续训练50轮&am…...

变焦位移计:机器视觉如何克服人工疲劳与主观影响?精准对结构安全实时监测
变焦视觉位移监测与人工监测的对比 人工监测是依靠目测检查或借助于全站仪,水准仪,RTK等便携式仪器测量得到的信息,但是随着整个行业的发展,传统的人工监测方法已经不能满足监测需求,从人工监测到自动化监测已是必然趋…...
嵌入式硬件篇---Ne555定时器
文章目录 前言1. 基本概述类型功能封装形式2. 引脚功能(DIP-8 封装)内部结构阈值电压两种工作模式4. 主要特性优点:缺点:5. 典型应用场景定时控制脉冲生成检测与触发信号处理6. 关键参数速查表前言 本文简单介绍了Ne555定时器(多谐振荡器/定时器)。DIP与SOP封装。 1. 基…...

【Axure结合Echarts绘制图表】
1.绘制一个矩形,用于之后存放图表,将其命名为test: 2.新建交互 -> 载入时 -> 打开链接: 3.链接到URL或文件路径: 4.点击fx: 5.输入: javascript: var script document.createEleme…...

使用web3工具结合fiscobcos网络部署调用智能合约
借助 web3 工具,在 FISCO BCOS 网络上高效部署与调用智能合约,解锁区块链开发新体验。 搭建的区块链网络需要是最新的fiscobcos3.0,最新的才支持web3调用 现在分享踩坑经验,希望大家点赞 目录 1.搭建fiscobcos节点(3.…...

Oracle/openGauss中,DATE/TIMESTAMP与数字日期/字符日期比较
ORACLE 运行环境 openGauss 运行环境 0、前置知识 ORACLE:DUMP()函数用于返回指定表达式的数据类型、字节长度及内部存储表示的详细信息 SELECT DUMP(123) FROM DUAL; -- Typ2 Len3: 194,2,24 SELECT DUMP(123) FROM DUAL;-- Typ96 Len3: 49,50,51 -- ASCII值&am…...
Datatable和实体集合互转
1.使用已废弃的 JavaScriptSerializer,且反序列化为弱类型 ArrayList。可用但不推荐。 using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; using System.Web; using Sy…...
Win11切换JDK版本批处理脚本
维护的老项目jdk1.8,新项目开发采用jdk21,所以寻找类似nvm的软件,都不太满意,最后还是决定采用写一个脚本算了,先不折腾了。 1、创建switch_jdk.bat文件 2、把如下内容复制进行 echo off chcp 65001 >nul setloc…...

爬虫学习-Scrape Center spa6 超简单 JS 逆向
关卡 spa6 电影数据网站,无反爬,数据通过 Ajax 加载,数据接口参数加密且有时间限制,适合动态页面渲染爬取或 JavaScript 逆向分析。 首先抓包发现get请求的参数token有加密。 offset表示翻页,limit表示每一页有多少…...
对数的运算困惑
难点总结 学生在对数运算中的难点分析: 一、不理解对数,不会用对数公式或错用对数公式 ①对数 l o g 2 3 log_23 log23和指数幂 2 3 2^3 23一样,也就是个实数而已,所以其也会有加减乘除乘方开方等运算; 比如 2 2 + l o g 2 3 = 2 2 ⋅ 2 l o g 2 3 = 4 ⋅ 3 = 12 2^{2…...
C++ 图像处理库 CxImage 简介 (迁移至OpenCV)
文章目录 核心功能特点局限性与替代方案常用方法构造函数从数组创建图像访问属性访问像素点Windows平台支持 常用方法迁移至OpenCV CxImage 是一款功能强大的图像处理类库,主要用于 Windows 平台的图像处理任务。它支持多种图像格式的加载、保存、编辑及特效处理&am…...
linux系统与shell 笔记
Linux 系统 Linux 是一种开源的操作系统内核,基于 Unix 设计,具有多用户、多任务、高稳定性和安全性的特点。它广泛应用于服务器、嵌入式设备和个人计算机领域。Linux 系统的核心组件包括内核、系统库、工具链和用户界面(如命令行或图形界面…...

尚硅谷redis7 86 redis集群分片之3主3从集群搭建
86 redis集群分片之3主集群搭建 3主3从redis集群配置 找3台真实虚拟机,各自新建 mķdir -p /myredis/cluster 新建6个独立的redis实例服务 IP:192.168.111.175端口6381/端口6382 vim /myredis/cluster/redisCluster6381.conf bind 0.0.0.0 daemonize yes protected-mode no …...
Kaggle-Predict Calorie Expenditure-(回归+xgb+cat+lgb+模型融合+预测结果)
Predict Calorie Expenditure 题意: 给出每个人的基本信息,预测运动后的卡路里消耗值。 数据处理: 1.构造出人体机能、运动相关的特征值。 2.所有特征值进行从新组合,注意唯独爆炸 3.对连续信息分箱变成离散 建立模型&#x…...

【解决办法】Git报错error: src refspec main does not match any.
在命令行中使用 Git 进行 git push -u origin main 操作时遇到报错error: src refspec main does not match any。另一个错误信息是:error: failed to push some refs to https://github.com/xxx/xxx.git.这是在一个新设备操作时遇到的问题,之前没有注意…...
React与Vue的内置指令对比
React 与 Vue 在内置指令的设计理念和实现方式上有显著差异。Vue 提供了一套丰富的模板指令系统,而 React 更倾向于通过原生 JavaScript 语法和 JSX 实现类似功能。以下是两者的核心对比: 一、条件渲染 Vue 使用 “v-if”/ “v-else” 指令,…...

2025年5月24号高项综合知识真题以及答案解析(第1批次)
2025年5月24号高项综合知识真题以及答案解析...

【NATURE氮化镓】GaN超晶格多沟道场效应晶体管的“闩锁效应”
2025年X月X日,布里斯托大学的Akhil S. Kumar等人在《Nature Electronics》期刊发表了题为《Gallium nitride multichannel devices with latch-induced sub-60-mV-per-decade subthreshold slopes for radiofrequency applications》的文章,基于AlGaN/GaN超晶格多通道场效应晶…...

Ubuntu24.04换源方法(新版源更换方式,包含Arm64)
一、源文件位置 Ubuntu24.04的源地址配置文件发生改变,不再使用以前的sources.list文件,升级24.04之后,而是使用如下文件 /etc/apt/sources.list.d/ubuntu.sources二、开始换源 1. 备份源配置文件 sudo cp /etc/apt/sources.list.d/ubunt…...

26 C 语言函数深度解析:定义与调用、返回值要点、参数机制(值传递)、原型声明、文档注释
1 函数基础概念 1.1 引入函数的必要性 在《街霸》这类游戏中,实现出拳、出脚、跳跃等动作,每项通常需编写 50 - 80 行代码。若每次调用都重复编写这些代码,程序会变得臃肿不堪,代码可读性与维护性也会大打折扣。 为解决这一问题&…...

彻底理解一个知识点的具体步骤
文章目录 前言一、了解概念(是什么)二、理解原理(为什么)三、掌握方法(怎么用) 四、动手实践(会用)五、类比拓展(迁移能力)六、总结归纳(融会贯通…...