【Phytium】飞腾D2000 UEFI/EDK2 适配 RTC(IIC SD3077)
文章目录
- 0. env
- 1. 软件
- 2. 硬件
- 10. 需求
- 1. 硬件
- 2. 软件
- 20. Datasheet
- CPU
- RTC
- 30. 调试步骤
- 1. 硬件环境搭建
- 2. UEFI 开发环境搭建
- 3. 修改步骤
- 1. UEFI 中使能RTC驱动、配置RTC信息等
- 1.1 使能RTC驱动
- 1.2 修改RTC对应的IIC配置信息
- 1.3 解决驱动冲突
- 1.4 验证波形
- 2. 修改对应RTC驱动,适配SD3077
- 1.1 修改IIC3的引脚复用
- 1.2 允许SD3077的写使能功能
- 1.3 验证时间
- 4. 验证
- 90. 附件
- 1. CPU 参考手册
- 2. RTC 参考手册
0. env
1. 软件
开发环境:ubuntu1804
toolchain:飞腾GCC4.9
UEFI:edk2-core-3.5
运行环境:kylin v10 | kernel-5.4 | aarch64 | arm64
2. 硬件
CPU:飞腾 腾锐D2000
RTC:SD3077
硬件连接:CPU(I2C3) — RTC
10. 需求
1. 硬件
RTC 这路的IIC要通信正常
2. 软件
UEFI 中完成RTC更新
linux中可手动更新date
20. Datasheet
CPU
腾锐D2000软件编程手册-V1.1.pdf // 官网下载:略
RTC
SD3077+datasheetv3.4.pdf // 官网下载:参考附件
30. 调试步骤
1. 硬件环境搭建
D2000 核心板 通过I2C3接口外接RTC SD3077
RTC供电3V3
CPU可单独上下电,不影响RTC供电
2. UEFI 开发环境搭建
ubuntu1804 搭建EDK2的环境,飞腾适配过的版本
安装对应toolchain:飞腾GCC4.9
制作bootloader的工程:略
3. 修改步骤
1. UEFI 中使能RTC驱动、配置RTC信息等
vi PhytiumPkg/PhytiumD2000Pkg/PhytiumD2000Pkg.dsc
1.1 使能RTC驱动
!if $(BOARD) == "DEMO"DEFINE HDA_SUPPORT = TRUE
- DEFINE SD3068 = FALSE
+ DEFINE SD3068 = TRUE
remark: 1. 使能这里的SD3068,
从而配置I2C slave addr 为:0x32
配置RTC使用的I2C controller Base Address 为:0x28009000 即I2C3的控制器
1. 如果I2C_RTC_USE没使能,使能后即可使用RTC-efi53 DEFINE I2C_RTC_USE = TRUE
1.2 修改RTC对应的IIC配置信息
- 使能SD3068后
1. 则RTC使用的slave address修改为:0x32529 !if $(SD3068) == TRUE530 gPhytiumPlatformTokenSpaceGuid.PcdRtcI2cControllerSlaveAddress|0x32531 !else532 gPhytiumPlatformTokenSpaceGuid.PcdRtcI2cControllerSlaveAddress|0x68533 !endif
2. 默认使用的是I2C0、I2C1的控制器来操作RTC;实际使用的是I2C3,所以这里的RTC使用的I2C controller的基质要修改为I2C3,即0x28009000 // 参考手册说明# RTC I2C Controller Register Base Address and Speed#
...
- gPhytiumPlatformTokenSpaceGuid.PcdRtcI2cControllerBaseAddress|0x28007000 // IIC1 飞腾空出了I2C0、I2C1
+ gPhytiumPlatformTokenSpaceGuid.PcdRtcI2cControllerBaseAddress|0x28009000 // IIC3 实际使用的是I2C3

- 使能I2C_RTC_USE后
1. 则使用的事Ds1339_RtcLib.inf,对应驱动:./PhytiumPkg/PhytiumD2000Pkg/Library/Ds1339_RtcLib/253 # Board Specific RealTimeClock Library254 !if $(I2C_RTC_USE) == TRUE255 RealTimeClockLib|$(PLATFORM_PACKAGE)/Library/Ds1339_RtcLib/Ds1339_RtcLib.inf256 !else257 RealTimeClockLib|$(PLATFORM_PACKAGE)/Library/XgeneRealTimeClockLib/XgeneRealTimeClockLib.inf258 !endif259 TimeBaseLib|EmbeddedPkg/Library/TimeBaseLib/TimeBaseLib.inf
1.3 解决驱动冲突
驱动冲突,占用了0x28000000,+0x5000的位置,正好囊括了i2c3的地址
1. 如果不用也可以不使能该功能--- a/PhytiumPkg/PhytiumD2000Pkg/Drivers/FixGcdDxe/FixGcdDxe.c
+++ b/PhytiumPkg/PhytiumD2000Pkg/Drivers/FixGcdDxe/FixGcdDxe.c
@@ -54,18 +54,18 @@ InitializeFixGcdDxe ();ASSERT_EFI_ERROR (Status);- Status = gDS->AddMemorySpace (
- EfiGcdMemoryTypeReserved,
- 0x28008000, 0x5000,
- EFI_MEMORY_UC
- );
- ASSERT_EFI_ERROR (Status);
+ //Status = gDS->AddMemorySpace (
+ // EfiGcdMemoryTypeReserved,
+ // 0x28008000, 0x5000,
+ // EFI_MEMORY_UC
+ // );^M
+ //ASSERT_EFI_ERROR (Status);- Status = gDS->SetMemorySpaceAttributes (
- 0x28008000, 0x5000,
- EFI_MEMORY_UC
- );
- ASSERT_EFI_ERROR (Status);
+ //Status = gDS->SetMemorySpaceAttributes (
+ // 0x28008000, 0x5000,
+ // EFI_MEMORY_UC
+ // );
+ //ASSERT_EFI_ERROR (Status);return Status;}
1.4 验证波形
编译后,测量I2C3这一路的信号,正常会产生RTC读写信号
2. 修改对应RTC驱动,适配SD3077
使用上述修改,则需要修改的驱动为:./PhytiumPkg/PhytiumD2000Pkg/Library/Ds1339_RtcLib/*
1.1 修改IIC3的引脚复用
- rtc-efi不需要依赖ACPI配置RTC,管脚引用可以直接放在驱动中执行。
- I2C3 管脚复用信息如下:
| 控制域 | … | Func2 |
|---|---|---|
| hdt_mb_done_state_pad | … | i2c_3_scl |
| hdt_mb_fail_state_pad | … | i2c_3_sda |
- I2C3 引脚功能配置寄存器:
| 偏移 | 位域 | 说明 |
|---|---|---|
| 0x0204 | [3 : 2] | 控制 hdt_mb_done_state_pad 的上下拉 |
| 0x0204 | [1 : 0] | 控制 hdt_mb_done_state_pad 的复用功能 |
| 0x0208 | [31 : 30] | 控制 hdt_mb_fail_state_pad 的上下拉 |
| 0x0208 | [29 : 28] | 控制 hdt_mb_fail_state_pad 的复用功能 |
实际使用:I2C3,则需要复用 这两个pin为Func2
即:
SCL : 0x28180000 + 0x0204 : [3:0] : 写入0010
SDA : 0x28180000 + 0x0208 : [31:28] : 写入0010
- 在源码驱动初始化程序段中添加管脚复用
vi PhytiumPkg/PhytiumD2000Pkg/Library/Ds1339_RtcLib/Ds1339_RtcLib.c
1. 在LibRtcInitialize中添加服用程序@@ -980,8 +1016,20 @@ LibRtcInitialize (mRtcBase = PcdGet64 (PcdRtcI2cControllerBaseAddress);mSlaveaddress = PcdGet32 (PcdRtcI2cControllerSlaveAddress);
+ /* I2C3 :
+ SCL : 0x28180000 + 0x0204 : [3:0] : Pll FUNC2
+ SDA : 0x28180000 + 0x0208 : [31:28] : Pll FUNC2
+ */
+ Reg = MmioRead32(0x28180204);
+ MmioWrite32(0x28180204, (Reg & (~(0xff << 0))) | (0x22 << 0));
+ Reg = MmioRead32(0x28180208);
+ MmioWrite32(0x28180208, (Reg & (~(0xff << 28))) | (0x22 << 28));
...
1.2 允许SD3077的写使能功能
- 3077又写保护功能,要想在操作系统中正常使用hwclock之类的命令,需要提前禁止写保护功能(客户要求)
- 关于3077芯片写保护的禁止与使能说明如下:
2.1 寄存器说明:
3. 按文档说明,做如下设置禁止写保护功能:
先配置WRTC1 : 0x10 赋值 1xxx xxxx // 实际使用值为0x80
再配置WRTC2,3 : 0x0f 赋值 1xxx x1xx // 厂商建议值0xff,实际使用值为0x84
- 修改源码,加入上述配置寄存器禁止写保护的代码段:
vi PhytiumPkg/PhytiumD2000Pkg/Library/Ds1339_RtcLib/Ds1339_RtcLib.c
+#ifdef RTC_FIX
+ /* I2C3 :
+ SCL : 0x28180000 + 0x0204 : [3:0] : Pull FUNC2
+ SDA : 0x28180000 + 0x0208 : [31:28] : Pull FUNC2
+ */
+ Reg = MmioRead32(0x28180204);
+ MmioWrite32(0x28180204, (Reg & (~(0xff << 0))) | (0x22 << 0));
+ Reg = MmioRead32(0x28180208);
+ MmioWrite32(0x28180208, (Reg & (~(0xff << 28))) | (0x22 << 28));
+
+ if(mSlaveaddress == CONFIG_RTC_SD3068){
+ SD3068EnableRegWrite (mSlaveaddress);
+ }
+#endif
+#ifdef RTC_FIX
+VOID
+EFIAPI
+SD3068EnableRegWrite (
+ IN UINT32 mSlaveaddress
+ )
+{
+ UINT8 Buffer;
+ Buffer = rtc_read (0x10, mSlaveaddress);
+ Buffer |= (1 << 7);
+ rtc_write (0x10, Buffer, mSlaveaddress);
+
+ Buffer = rtc_read (0x0f, mSlaveaddress);
+ Buffer |= (1 << 2);
+ Buffer |= (1 << 7);
+ rtc_write (0x0f, Buffer, mSlaveaddress);
+
+}
+#endif /* ifdef RTC_RIX */
1.3 验证时间
- 启动到操作系统后,查看内核log,看一下rtc-efi打印
参考log:
root@kylin-pc:~# dmesg | grep rtc
[ 1.087034] rtc-efi rtc-efi: registered as rtc0
[ 1.093138] rtc-efi rtc-efi: setting system clock to 2024-04-12T12:13:51 UTC (1712924031)
4. 验证
- 启动到操作系统,使用date修改系统时间,使用hwclock修改RTC时间
- reboot操作系统
- 查看当前系统时间是否与RTC时间保持一致,即验证RTC功能是否正常
- 设备下电一段时间后,重新上电
- 上电后再次确认时间
参考log如下:
root@kylin-pc:~# date
1970年 01月 01日 星期四 08:00:19 CST
root@kylin-pc:~#
root@kylin-pc:~# date -s "2024-04-13 11:11:00"
2024年 04月 13日 星期六 11:11:00 CST
root@kylin-pc:~#
root@kylin-pc:~# hwclock -w
root@kylin-pc:~#
root@kylin-pc:~# hwclock -r
2024-04-13 11:11:14.212325+08:00
root@kylin-pc:~#
root@kylin-pc:~# reboot// rebootroot@kylin-pc:~#
root@kylin-pc:~# date
2024年 04月 13日 星期六 11:13:12 CST
root@kylin-pc:~# // 设备断电几分钟后,再次上电。RTC保持供电root@kylin-pc:~#
root@kylin-pc:~# date
2024年 04月 13日 星期六 11:27:48 CST
root@kylin-pc:~#
root@kylin-pc:~# dmesg | grep rtc
[ 1.091921] rtc-efi rtc-efi: registered as rtc0
[ 1.098025] rtc-efi rtc-efi: setting system clock to 2024-04-13T11:27:26 UTC (1713007646)
root@kylin-pc:~#
90. 附件
1. CPU 参考手册
略
2. RTC 参考手册
https://www.whwave.com.cn/cpscxz
相关文章:
【Phytium】飞腾D2000 UEFI/EDK2 适配 RTC(IIC SD3077)
文章目录 0. env1. 软件2. 硬件 10. 需求1. 硬件2. 软件 20. DatasheetCPURTC 30. 调试步骤1. 硬件环境搭建2. UEFI 开发环境搭建3. 修改步骤1. UEFI 中使能RTC驱动、配置RTC信息等1.1 使能RTC驱动1.2 修改RTC对应的IIC配置信息1.3 解决驱动冲突1.4 验证波形 2. 修改对应RTC驱动…...
如何利用纯前端技术,实现一个网页版视频编辑器?
纯网页版视频编辑器 一、前言二、功能实现三、所需技术四、部分功能实现4.1 素材预设4.2 多轨道剪辑 一、前言 介绍:本篇文章打算利用纯前端的技术,来实现一个网页版的视频编辑器。为什么突然想做一个这么项目来呢,主要是最近一直在利用手机…...
stm32实现hid键盘
前面的cubelmx项目配置参考 stm32实现hid鼠标-CSDN博客https://blog.csdn.net/anlog/article/details/137814494?spm1001.2014.3001.5502两个项目的配置完全相同。 代码 引用 键盘代码: 替换hid设备描述符 先屏蔽鼠标设备描述符 替换为键盘设备描述符 修改宏定…...
【单例模式】饿汉式、懒汉式、静态内部类--简单例子
单例模式是⼀个单例类在任何情况下都只存在⼀个实例,构造⽅法必须是私有的、由⾃⼰创建⼀个静态变量存储实例,对外提供⼀个静态公有⽅法获取实例。 目录 一、单例模式 饿汉式 静态内部类 懒汉式 反射可以破坏单例 道高一尺魔高一丈 枚举 一、单例…...
windows关闭Windows Search功能
我发现windows最恶心的功能就是自动更新和搜索。自动更新就是个毒瘤,得到了全世界的人讨厌。 而搜索功能难用、慢和造成卡死,根本没有存在的必要。并且他的windows search filter服务会在每次移动大量文件后建立索引,持续的占用cpu和硬盘的资…...
政安晨:【深度学习神经网络基础】(九)—— 在深度学习神经网络反向传播训练中理解梯度
目录 简述 理解梯度 什么是梯度 计算梯度 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 简述 在深度…...
免费的 ChatGPT、GPTs、AI绘画(国内版)
🔥博客主页:白云如幻❤️感谢大家点赞👍收藏⭐评论✍️ ChatGPT3.5、GPT4.0、GPTs、AI绘画相信对大家应该不感到陌生吧?简单来说,GPT-4技术比之前的GPT-3.5相对来说更加智能,会根据用户的要求生成多种内容甚…...
UniApp 微信小程序:在 onLaunch 中等待异步方法执行完成后,再调用页面中的接口
最近遇到了一个问题:在 App.vue 中的 onLaunch 中调用登录接口时,由于异步登录尚未完成就调用了 index 页面的接口,导致 token 异常。如何确保页面在 App 中的 onLaunch 执行完毕后再继续执行呢? 在网上查阅了一些资料,…...
【招贤纳士】长期有效
【招贤纳士】长期有效,有意者联系 一、SLAM算法工程师工作内容:任职资格: 二、规划算法工程师工作内容:任职资格: 三、感知算法工程师岗位职责:任职要求:加分项: 四、传感器系统工程…...
华为配置静态ARP示例
华为配置静态ARP示例 组网图形 图1 配置静态ARP组网图 静态ARP简介配置注意事项组网需求配置思路操作步骤配置文件相关信息 静态ARP简介 静态ARP表项是指网络管理员手工建立IP地址和MAC地址之间固定的映射关系。 正常情况下网络中设备可以通过ARP协议进行ARP表项的动态学习&…...
LRTimelapse for Mac:专业延时摄影视频制作利器
LRTimelapse for Mac是一款专为Mac用户设计的延时摄影视频制作软件,它以其出色的性能和丰富的功能,成为摄影爱好者和专业摄影师的得力助手。 LRTimelapse for Mac v6.5.4中文激活版下载 这款软件提供了直观易用的界面,用户可以轻松上手&#…...
Java复习第十九天学习笔记(Cookie、Session登录),附有道云笔记链接
【有道云笔记】十九 4.7 Cookie、Session登录 https://note.youdao.com/s/VwpxfEim 一、会话技术简介 生活中会话 我: 小张,你会跳小苹果码? 小张: 会,怎么了? 我: 公司年会上要表演节目&a…...
HBase的数据模型与架构
官方文档:Apache HBase – Apache HBase™ Homehttps://hbase.apache.org/ 一、HBase概述 1.概述 HBase的技术源自Google的BigTable论文,HBase建立在Hadoop之上,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,用于…...
卷积神经网络的结构组成与解释(详细介绍)
文章目录 前言 1、卷积层 2、激活层 3、BN层 4、池化层 5、FC层(全连接层) 6、损失层 7、Dropout层 8、优化器 9、学习率 10、卷积神经网络的常见结构 前言 卷积神经网络是以卷积层为主的深层网络结构,网络结构包括有卷积层、激活层、BN层、…...
使用ansible的连通性检查的关键参数
使用ansible进行ping命令的时候发现有些不通 ansible cba -m ping 10.1.1.1 | FAILED! > {"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this h…...
Jenkins用maven风格build报错解决过程记录
1、Jenkins2.453新建项目,构建风格选的maven 2、自由风格构建部署没有任何问题,但是maven风格build一直失败,报错如下图 3、解决方案:在系统管理–系统配置–Maven项目配置,删除全局MAVEN_OPT的路径信息,…...
Web3.0与AI的交融:开启智能互联网新时代
目前有140 多个 Web3 AI 概念项目,覆盖了基础设施、数据、预测市场、计算与算力、教育、DeFi & 跨链、安全、NFT & 游戏 & 元宇宙、搜索引擎、社交 & 创作者经济、AI 聊天机器人、DID & 消息传递、治理、医疗、交易机器人等诸多方向。持续关注…...
自动化_Ansible学习笔记
文章目录 Ansible 介绍配置文件主配置文件优先级 常用命令ansible-playbook ad-hocinventory 主机清单Playbook 剧本YAML格式 ansible 模块介绍模块对应功能Commands modules(命令模块)command (命令)shell (外壳) 官方帮助文档 模块索引playbook 开头示例系统类setup (收集远程…...
用于密集视觉冲击的紧凑三维高斯散射Compact 3D Gaussian Splatting For Dense Visual SLAM
Compact 3D Gaussian Splatting For Dense Visual SLAM 用于密集视觉冲击的紧凑三维高斯散射 Tianchen Deng 邓天辰11Yaohui Chen 陈耀辉11Leyan Zhang 张乐妍11Jianfei Yang 杨健飞22Shenghai Yuan 圣海元22Danwei Wang 王丹伟22Weidong Chen 陈卫东11 Abstract 摘要 …...
ChatGPT揭秘:高效论文写作的秘籍
ChatGPT无限次数:点击直达 ChatGPT揭秘:高效论文写作的秘籍 引言 在当今信息爆炸的时代,高效撰写论文对于研究者和学术工作者至关重要。随着人工智能技术的不断发展,ChatGPT等自然语言处理工具的出现为论文写作提供了全新的思路和工具。本文…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...


