【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-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.mfbz.cn/a/549564.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[lesson36]经典问题解析三

经典问题解析三 关于赋值的疑问 什么时候需要重载赋值操作符&#xff1f;编译器是否提供默认的赋值操作&#xff1f; 编译器为每个类默认重载了赋值操作符 默认的赋值操作符仅完成浅拷贝 当需要进行深拷贝时必须重载赋值操作符 赋值操作符与拷贝构造函数有相同的存在意义 …

零基础入门测试该学什么?超全整理,照着学就对了!

对于很多小白而言&#xff0c;想要转行软件测试岗位&#xff0c;却又怕自己从来没有接触过计算机&#xff0c;底子很薄弱&#xff0c;从而还没开始就打起了退堂鼓。也有许多初学者&#xff0c;在入门的过程中&#xff0c;苦于不知道该学什么&#xff0c;又该从何学起&#xff0…

代码随想录算法训练营第四十二天| 二维背包、一维背包、LeetCode 416.分割等和子集

一、二维背包 文章讲解/视频讲解&#xff1a;https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-1.html 状态&#xff1a;已解决 1.背包问题介绍 背包问题实则是一类问题的集合&#xff0c;有好多不同小类型&#xff0c…

单位优秀信息宣传员告诉你向媒体投稿你不知道的好方法

作为基层社区信息宣传工作队伍中的一员,我刚开始接手单位的信息宣传投稿任务时,真的是一片茫然。没有任何媒体编辑的熟人朋友,我只能硬着头皮,一家家地去联系媒体,沟通投稿的事宜。这个过程真的是既费事又费力,每次投稿都像是在茫茫大海中寻找那一丝被认可的机会。 因为媒体对稿…

VLAN Mapping原理描述

基本原理 路由器收到带Tag的数据报文后&#xff0c;根据配置的VLAN Mapping方式&#xff0c;决定替换外层Tag中的VLAN ID或优先级&#xff1b;然后进入MAC地址学习阶段&#xff0c;根据源MAC地址映射后的VLAN ID刷新MAC地址表项&#xff1b;根据目的MAC映射后VLAN ID查找MAC地…

T细胞耗竭

目录 T Cell Exhaustion T 细胞衰竭路径上的细胞和分子路标 研究起源 介绍 T 细胞耗竭的发生路径 耗尽的T细胞亚群的解剖分离和迁移 持续TCR刺激的收益递减 通过共调节受体进行发育微调 细胞因子介导的耗尽T细胞亚群的特异性 T细胞耗竭和表观遗传 T Cell Exhaustion…

面试问答之转账功能测试点详解

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

快速排序题目SelectK问题

力扣75.颜色分类 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums &#xff0c;原地对它们进行排序&#xff0c;使得相同颜色的元素相邻&#xff0c;并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置的 sor…

数据库(mysql)-连接嵌套查询-2

子查询 MySQL中的子查询&#xff08;Subquery&#xff09;是嵌套在其他SQL查询中的查询。子查询可以出现在SELECT、FROM或WHERE子句中&#xff0c;并用于返回将被用于外部查询的数据。子查询的结果可以是一个单一的值、一行、一列或多行多列的数据集。 单行单列查询 实例 #查…

一款挺不错网站维护页面HTML源码

一款挺不错网站维护页面源码&#xff0c;单HTML不需要数据库&#xff0c;上传到你的虚拟机就可以用做维护页面还不错&#xff0c;用处多。。 源码下载 一款挺不错网站维护页面源码

【智能算法】鱼鹰优化算法(OOA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2023年&#xff0c;M Dehghani等人受到自然界鱼鹰狩猎行为启发&#xff0c;提出了鱼鹰优化算法&#xff08;Osprey Optimization Algorithm, OOA&#xff09;。 2.算法原理 2.1算法思想 OOA基本灵…

网络爬虫:定义、应用及法律道德考量

网络爬虫技术在当今数据驱动的世界中发挥着重要作用。本文将从网络爬虫的定义和主要功能&#xff0c;其在业界的应用实例&#xff0c;以及涉及的法律和道德问题三个方面进行深入探讨。 1. 爬虫的定义和主要功能 网络爬虫&#xff0c;也称为网页爬虫或蜘蛛&#xff0c;是一种…

苹果与印度深入洽谈,开启新业务 | 百能云芯

印度经济时报&#xff08;ET&#xff09;引述知情人士报导&#xff0c;苹果&#xff08;Apple&#xff09;正和 Murugappa 集团和塔塔集团旗下的Titan公司深入洽谈&#xff0c;将由这两家印度业者组装、甚至生产 iPhone 所用的相机模组。 苹果正将iPhone供应链向中国大陆以外地…

SpringBoot学习(三)数据访问、基础特性、核心原理

文章目录 数据访问示例自动配置原理jdbc场景自动配置数据源等基本信息MyBatisAutoConfiguration配置MyBatis整合流程 基础特性SpringApplication自定义banner自定义SpringApplicationFluentBuilder API Profiles使用指定环境环境激活环境包含 Profiles配置文件 外部化配置配置优…

JVM结构化体系

目录 目录 1.JVM 简介 1.1. 如何理解 JVM 呢&#xff1f; 1.2. 市场主流 JVM 分析&#xff1f; 1.3. 为什么要学习 JVM&#xff1f; 1.4. 字节码底层是如何执行呢&#xff1f; 如何理解 JIT 呢&#xff1f; 为什么 JVM 中解释执行与编译执行的并存&#xff08;混合模式&…

新手教程 | 2024年最新Vmware17安装教程及许可证(详细图文)

目录 前言&#xff1a; 一、VMware Workstation 17 Pro 简介 二、下载安装&#xff08;以Windows为例&#xff09; 三、许可证 四、检查是否安装成功 前言&#xff1a; 重新装电脑后&#xff0c;安装虚拟机 一、VMware Workstation 17 Pro 简介 VMware Workstation 17 …

【JavaWeb】Day46.Mybatis——入门

JDBC介绍 通过Mybatis可以很方便的进行数据库的访问操作。其实java语言操作数据库&#xff0c;只能通过一种方式&#xff1a;使用sun公司提供的 JDBC 规范。Mybatis框架&#xff0c;就是对原始的JDBC程序的封装。 JDBC&#xff1a; ( Java DataBase Connectivity )&#xff0c…

元类的执行

class MetaB(type):def __new__(cls, name, bases, attrs):print(f"使用元类 {cls.__name__} 创建{name}类 ")return super().__new__(cls, name, bases, attrs)class A(metaclassMetaB):passclass C(A):pass元类MetaB的__new__方法应该只会在创建类A时被调用一次, 因…

YoloV9实战:从Labelme到训练、验证、测试、模块解析

模型实战 训练COCO数据集 本次使用2017版本的COCO数据集作为例子&#xff0c;演示如何使用YoloV8训练和预测。 下载数据集 Images: 2017 Train images [118K/18GB] &#xff1a;http://images.cocodataset.org/zips/train2017.zip2017 Val images [5K/1GB]&#xff1a;htt…

Python-VBA函数之旅-compile函数

目录 1、 compile函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、相关文章&#xff1a; 个人主页&#xff1a;https://blog.csdn.net/ygb_1024?spm1010.2135.3001.5421 compile函数在Python中有多个实际应用场景&#xff0c;它主要用于将字符串形式的…
最新文章