【Phytium】飞腾D2000 UEFI/EDK2 适配 RTC(IIC SD3077)

news2024/11/24 11:44:36

文章目录

  • 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-efi
  53   DEFINE I2C_RTC_USE             = TRUE
1.2 修改RTC对应的IIC配置信息
  1. 使能SD3068后
1. 则RTC使用的slave address修改为:0x32

 529 !if $(SD3068) == TRUE
 530   gPhytiumPlatformTokenSpaceGuid.PcdRtcI2cControllerSlaveAddress|0x32
 531 !else
 532   gPhytiumPlatformTokenSpaceGuid.PcdRtcI2cControllerSlaveAddress|0x68
 533 !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 Library
 254   !if $(I2C_RTC_USE) == TRUE
 255     RealTimeClockLib|$(PLATFORM_PACKAGE)/Library/Ds1339_RtcLib/Ds1339_RtcLib.inf
 256   !else
 257     RealTimeClockLib|$(PLATFORM_PACKAGE)/Library/XgeneRealTimeClockLib/XgeneRealTimeClockLib.inf
 258   !endif
 259   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

// reboot

root@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.coloradmin.cn/o/1600778.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.2 @SpringBootApplication

2.2 SpringBootApplication 在前文的介绍中&#xff0c;读者已经了解到SpringBootApplication注解是加在项目的启动类上的。 SpringBootApplication实际上是一个组合注解&#xff0c;定义如下&#xff1a; SpringBootConfiguration EnableAutoConfiguration ComponentScan(exc…

Qt 实战(2)搭建开发环境 | 2.1、Windows下安装QT

一、Windows下安装QT 1、QT官网 QT官网&#xff1a;https://download.qt.io/&#xff0c;打开官网地址&#xff0c;如下&#xff1a; 目录结构介绍 目录说明snapshots预览版&#xff0c;最新的开发测试中的 Qt 库和开发工具onlineQt 在线安装源official_releases正式发布版&am…

STM32 F103 C8T6开发笔记14:与HLK-LD303-24G测距雷达通信

今日尝试配通STM32 F103 ZET6与HLK-LD303-24G测距雷达的串口通信解码 文章提供测试代码...... 目录 HLK-LD303-24G测距雷达外观&#xff1a; 线路连接准备&#xff1a; 定时器与串口配置准备&#xff1a; 定时器2的初始化&#xff1a; 串口1、2初始化&#xff1a; 串口1、2自定…

Vue加载glb / gltf模型(如何在vue中使用Three.js,vue使用threejs加载glb模型)

简介&#xff1a;Three.js 是一个用于在 Web 上创建和显示 3D 图形的 JavaScript 库。它提供了丰富的功能和灵活的 API&#xff0c;使开发者可以轻松地在网页中创建各种 3D 场景、模型和动画效果。可以用来展示产品模型、建立交互式场景、游戏开发、数据可视化、教育和培训等等…

互联网大厂ssp面经,数据结构:part1

1. 数组和链表的区别是什么&#xff1f; a. 数组是一种线性数据结构&#xff0c;存储在连续的内存块中&#xff0c;元素可以通过索引直接访问。 b. 链表是由节点组成的数据结构&#xff0c;每个节点包含数据和指向下一个节点的指针。 2. 数组和链表的的优缺点是什么&#xff…

原始部落版本潮玩宇宙小程序定制大逃杀游戏APP开发H5游戏

原始部落版本潮玩宇宙小程序定制大逃杀游戏APP开发H5游戏 潮玩宇宙小程序定制大逃杀游戏APP开发H5游戏 潮玩宇宙大逃杀小游戏模块成品源码&#xff0c;可嵌入任何平台系统&#xff0c;增加用户粘性&#xff0c;消除泡沫&#xff0c;短视频直播引流。 玩家选择一间房间躲避杀手…

VBA脚本: excel隐藏和展开指定行 【图文】

打开开发工具功能 【文件】-》【选项】-》【自定义功能区】-》勾选【开发工具】-》【确定】 代开VBA编辑器 【开发工具】-》【Visual Basic】 插入模块 编写代码 所有sheet 关闭 Sub HideRowsInAllSheets()Dim ws As WorksheetDim i As Integer 循环遍历所有工作表For E…

STM32学习和实践笔记(13):数码管显示实验

共阳就是共正极&#xff0c;也就是正极全部接在一起。 共阴就是共负极&#xff0c;也就是负极全部接在一起。 我目前使用这款PZ6806L&#xff0c;使用了一个共阳数码管。 共阴与共阳在码表上其实就是正好取反就可以了&#xff0c;所以可以共用一个码表。 数码管显示程序主要分…

bp神经网络拟合函数未知参数【源码+视频教程】

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《复杂函数拟合案例分享》本专栏旨在提供 1.以案例的形式讲解各类复杂函数拟合的程序实现方法&#xff0c;并提供所有案例完整源码&#xff1b;2.…

【Java】通过poi给word首页添加水印图片

背景&#xff1a; poi并没有提供直接插入水印图片的方法&#xff0c;目前需要再word的首页插入一张水印图片&#xff0c;于是就需要通过另一种方式&#xff0c;插入透明图片&#xff08;png格式&#xff09;并将图片设置为“浮于文字上方”的方式实现该需求。 所需jar&#xf…

AI智能体技术突破:引领科技新浪潮

AI智能体技术突破&#xff1a;引领科技新浪潮 基于大模型的 AI Agent 工作流基于大模型的 AI Agent 工作流效果AI Agent 的四种设计模式Reflection 反思设计模式Tool use 工具使用设计模式Planning 规划设计模式Multiagent collaboration 多智能体协作设计模式 吴恩达在红杉美国…

吃透2000-2024年600道真题和解析,科学高效通过2025年AMC8竞赛

为帮助孩子科学、有效备考AMC8竞赛&#xff0c;我整理了2000-2004年的全部AMC8真题&#xff08;完整版共600道&#xff0c;且修正了官方发布的原试卷中的少量bug&#xff09;&#xff0c;并且独家制作成多种在线练习&#xff0c;利用碎片化时间&#xff0c;8个多月的时间足以通…

【C++题解】1317. 正多边形每个内角的度数?

问题&#xff1a;1317. 正多边形每个内角的度数&#xff1f; 类型&#xff1a;基本运算、小数运算 题目描述&#xff1a; 根据多边形内角和定理&#xff0c;正多边形内角和等于&#xff1a;&#xff08; n&#xff0d;2 &#xff09; 180∘ ( n 大于等于 3 且 n 为整数&#…

Backend - Django Swagger

目录 一、安装依赖 二、配置环境 三、路由&#xff08;urls&#xff09; 四、swagger UI 界面 &#xff08;一&#xff09;UI 界面 &#xff08;二&#xff09;单引号问题&#xff1a;Expecting property name enclosed in double quotes 1. 原因 2. 解决 五、自定义s…

Go 单元测试基本介绍

文章目录 引入一、单元测试基本介绍1.1 什么是单元测试&#xff1f;1.2 如何写好单元测试1.3 单元测试的优点1.4 单元测试的设计原则 二、Go语言测试2.1 Go单元测试概要2.2 Go单元测试基本规范2.3 一个简单例子2.3.1 使用Goland 生成测试文件2.3.2 运行单元测试2.3.3 完善测试用…

基于Adaboost模型的数据预测和分类matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 AdaBoost&#xff08;Adaptive Boosting&#xff09;是一种集成学习方法&#xff0c;由Yoav Freund和Robert Schapire于1995年提出&#xff0c;主要用于提高弱分类…

Docker 学习笔记(九):Docker 网络原理,理解 docker0,虚拟网卡,容器互联,以及跨网络连通

一、前言 记录时间 [2024-4-16] 系列文章简摘&#xff1a; Docker 学习笔记&#xff08;六&#xff09;&#xff1a;挑战容器数据卷技术一文通&#xff0c;实战多个 MySQL 数据同步&#xff0c;能懂会用&#xff0c;初学必备 Docker 学习笔记&#xff08;七&#xff09;&#x…

引领智能互联时代,紫光展锐赋能百业创新发展

随着5G技术的快速发展&#xff0c;各行各业对通信技术的需求也在不断升级。紫光展锐持续深耕5G垂直行业&#xff0c;不断推进5G标准演进&#xff0c;从R15到R16&#xff0c;再到R17&#xff0c;展锐携手生态合作伙伴&#xff0c;不断推出创新性解决方案&#xff0c;在5G RedCap…

FMEA赋能可穿戴设备:打造安全可靠的未来科技新宠!

在科技日新月异的今天&#xff0c;可穿戴设备已成为我们生活中不可或缺的一部分。它们以其便携性、智能化和个性化的特点&#xff0c;深受消费者喜爱。然而&#xff0c;随着可穿戴设备市场的快速扩张&#xff0c;其安全性和可靠性问题也日益凸显。为了确保产品质量&#xff0c;…

【Git】常用命令速查

目录 一、创建版本 二、修改和提交 三、查看提交历史 四、撤销 五、分支与标签 六、合并与衍合 七、远程操作 一、创建版本 命令简要说明注意事项git clone <url>克隆远程版本库 二、修改和提交 命令简要说明注意事项 三、查看提交历史 命令简要说明注意事项 …