【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配置信息
  1. 使能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

在这里插入图片描述

  1. 使能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的引脚复用
  1. rtc-efi不需要依赖ACPI配置RTC,管脚引用可以直接放在驱动中执行。
  2. I2C3 管脚复用信息如下:
控制域Func2
hdt_mb_done_state_padi2c_3_scl
hdt_mb_fail_state_padi2c_3_sda
  1. 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

  1. 在源码驱动初始化程序段中添加管脚复用
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的写使能功能
  1. 3077又写保护功能,要想在操作系统中正常使用hwclock之类的命令,需要提前禁止写保护功能(客户要求)
  2. 关于3077芯片写保护的禁止与使能说明如下:
    在这里插入图片描述

2.1 寄存器说明:
在这里插入图片描述
3. 按文档说明,做如下设置禁止写保护功能:
先配置WRTC1 : 0x10 赋值 1xxx xxxx // 实际使用值为0x80
再配置WRTC2,3 : 0x0f 赋值 1xxx x1xx // 厂商建议值0xff,实际使用值为0x84

  1. 修改源码,加入上述配置寄存器禁止写保护的代码段:
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 验证时间
  1. 启动到操作系统后,查看内核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. 验证

  1. 启动到操作系统,使用date修改系统时间,使用hwclock修改RTC时间
  2. reboot操作系统
  3. 查看当前系统时间是否与RTC时间保持一致,即验证RTC功能是否正常
  4. 设备下电一段时间后,重新上电
  5. 上电后再次确认时间

参考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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/311822.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1、MYSQL系列-深入理解Mysql索引底层数据结构与算法

索引的本质 索引是帮助MySQL高效获取数据的排好序的数据结构 索引数据结构 二叉树红黑树Hash表BTree B-Tree B-Tree 叶节点具有相同的深度&#xff0c;叶节点的指针为空&#xff0c;所有索引元素不重复&#xff0c;节点中的数据索引从左到右递增排列 BTree(B-Tree变种) 非叶…

使用FastDDS编译IDL文件

1.安装FastDDS环境 Ubuntu22.04 1.1安装依赖的软件 sudo apt-get update //基础工具安装 sudo apt install cmake g python3-pip wget git //Asio 是一个用于网络和低级 I/O 编程的跨平台C库&#xff0c;它提供了一致的 异步模型。 TinyXML2是一个简单&#xff0c;小巧&…

Leetcode 4. 寻找两个正序数组的中位数

心路历程&#xff1a; 这道题暴力解很简单&#xff0c;一看到要求O(log(mn))的复杂度就只能是双指针&#xff0c;但是实测发现这道题用归并排序更快。这可能就是平均复杂度和实际复杂度的Gap吧。 二分法的思路&#xff1a; 要找到第 k (k>1) 小的元素&#xff0c;那么就取…

利用redis和fastapi实现本地与平台策略进行交互

redis在pandas一文有详细使用方法(一文教会pandas-CSDN博客)&#xff0c;具体可视化软件有redisstudio等。它是一个由 Salvatore Sanfilippo 写的 key-value 存储系统&#xff0c;是跨平台的非关系型数据库。 Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络…

NTC热敏电阻采集温度-单片机通用模板

NTC热敏电阻采集温度-单片机通用模板 一、NTC热敏电阻转换温度的原理二、AT104Tem.c的实现三、AT104Tem.h的实现 一、NTC热敏电阻转换温度的原理 ①NTC热敏电阻会随着温度的升高&#xff0c;电阻值R逐渐降低&#xff1b;②硬件搭建电阻分压电路采集ADC逆推热敏电阻当前的阻值&…

ArcGIS加载的各类地图怎么去除服务署名水印

昨天介绍的&#xff1a; 一套图源搞定&#xff01;清新规划底图、影像图、境界、海洋、地形阴影图、导航图-CSDN博客文章浏览阅读373次&#xff0c;点赞7次&#xff0c;收藏11次。一体化集成在一起的各类型图源&#xff0c;比如包括影像、清新的出图底图、地形、地图阴影、道路…

如何在PPT中获得网页般的互动效果

如何在PPT中获得网页般的互动效果 效果可以看视频 PPT中插入网页有互动效果 当然了&#xff0c;获得网页般的互动效果&#xff0c;最简单的方法就是在 PPT 中插入网页呀。 那么如何插入呢&#xff1f; 接下来为你讲解如何获得&#xff08;此方法在 PowerPoint中行得通&#…

Modality-Aware Contrastive Instance Learning with Self-Distillation ... 论文阅读

Modality-Aware Contrastive Instance Learning with Self-Distillation for Weakly-Supervised Audio-Visual Violence Detection 论文阅读 ABSTRACT1 INTRODUCTION2 RELATEDWORKS2.1 Weakly-Supervised Violence Detection2.2 Contrastive Learning2.3 Cross-Modality Knowle…

Yolo-world+Python-OpenCV之摄像头视频实时目标检测

上一次介绍了如何使用最基本的 Yolo-word来做检测&#xff0c;现在我们在加opencv来做个实时检测的例子 基本思路 1、读取离线视频流 2、将视频帧给yolo识别 3、根据识别结果 对视频进行绘制边框、加文字之类的 完整代码如下&#xff1a; import datetimefrom ultralytics …

excel 无法正确处理 1900-03-01 前的日期

问题由来&#xff1a;excel 用公式 TEXT(A1,"yyyy-mm-dd") 转日期时&#xff0c;当A1 的值等于59 的时候&#xff0c;返回值是1900-02-28&#xff1b;当A1 的值等于61 的时候&#xff0c;返回值是1900-03-01&#xff1b;那么当 A1的值为 60 的时候&#xff0c;返回值…

权限管理Ranger详解

文章目录 一、Ranger概述与安装1、Ranger概述1.1 Ranger介绍1.2 Ranger的目标1.3 Ranger支持的框架1.4 Ranger的架构1.5 Ranger的工作原理 2、Ranger安装2.1 创建系统用户和Kerberos主体2.2 数据库环境准备2.3 安装RangerAdmin2.4 启动RangerAdmin 二、Ranger简单使用1、安装 R…

PDF文档电子签名怎么做?

如何确保电子文档的签署具有公信力和法律效力&#xff0c;防止伪造和假冒签名等问题&#xff0c;是电子文档无纸化应用面临的重要挑战。本文将详细介绍PDF文档电子签名的概念、重要性、实施步骤以及相关的法律背景&#xff0c;帮助用户理解并有效应用PDF文档电子签名技术。 1.…

# RAG | Langchain # Langchain RAG:打造Markdown文件的结构化分割解决方案

【文章简介】 在信息技术的现代背景下&#xff0c;高效地处理和分析文本数据对于知识获取和决策支持至关重要。Markdown文件因其易读性和高效性&#xff0c;在文档编写和知识共享中占据了重要地位。然而&#xff0c;传统的文本处理方法往往忽视了Markdown的结构化特性&#xff…

深度学习 Lecture 7 迁移学习、精确率、召回率和F1评分

一、迁移学习&#xff08;Transfer learning) 用来自不同任务的数据来帮助我解决当前任务。 场景&#xff1a;比如现在我想要识别从0到9度手写数字&#xff0c;但是我没有那么多手写数字的带标签数据。我可以找到一个很大的数据集&#xff0c;比如有一百万张图片的猫、狗、汽…

卷积神经网络的结构组成与解释(详细介绍)

文章目录 前言 1、卷积层 2、激活层 3、BN层 4、池化层 5、FC层&#xff08;全连接层&#xff09; 6、损失层 7、Dropout层 8、优化器 9、学习率 10、卷积神经网络的常见结构 前言 卷积神经网络是以卷积层为主的深层网络结构&#xff0c;网络结构包括有卷积层、激活层、BN层、…

专业140+总410+国防科技大学831信号与系统考研经验国防科大电子信息与通信,真题,大纲,参考书。

应群里同学要求&#xff0c;总结一下我自己的复习经历&#xff0c;希望对大家有所借鉴&#xff0c;报考国防科技大学&#xff0c;专业课831信号与系统140&#xff0c;总分410&#xff0c;大家以前一直认为国防科技大学时军校&#xff0c;从而很少关注这所军中清华&#xff0c;现…

【C++】哈希一

这篇博客要说的是哈希算法&#xff0c;哈希又称为散列&#xff0c;它是将存储的值和存储的位置建立起关联关系的一种算法&#xff0c;或者说是一种将任意长度的数据映射为固定长度的输出的算法。 什么意思呢&#xff1f;我们来看一个例子&#xff1a;比如说我们要存储1&#xf…

Github 2024-04-12 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-04-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目6TypeScript项目2Cuda项目1C++项目1C项目1HTML项目1Jupyter Notebook项目1JavaScript项目1Python - 100天从新手到大师 创建周期:22…

pytorch 今日小知识3——nn.MaxPool3d 、nn.AdaptiveAvgPool3d、nn.ModuleList

MaxPool3d — PyTorch 2.2 documentation 假设输入维度&#xff08;1,2,3,4,4&#xff09; maxpool torch.nn.MaxPool3d(kernel_size(2, 2, 2), stride(2, 2, 2), padding(1, 0, 0))F 维的 kernel_size 为 2&#xff0c;说明在 F 维的覆盖的 frame 数为 2&#xff0c;也就是…

机器学习实验------决策树

第1关&#xff1a;什么是决策树 任务描述 本关任务&#xff1a;根据本节课所学知识完成本关所设置的选择题。 第2关&#xff1a;信息熵与信息增益 任务描述 本关任务&#xff1a;掌握什么是信息增益&#xff0c;完成计算信息增益的程序设计。 import numpy as npdef calcIn…