大家好,欢迎来到IT知识分享网。
文章目录
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. 软件
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 为:0x 即I2C3的控制器
1. 如果I2C_RTC_USE没使能,使能后即可使用RTC-efi 53 DEFINE I2C_RTC_USE = TRUE
1.2 修改RTC对应的IIC配置信息
- 使能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,即0x // 参考手册说明 # RTC I2C Controller Register Base Address and Speed # ... - gPhytiumPlatformTokenSpaceGuid.PcdRtcI2cControllerBaseAddress|0x // IIC1 飞腾空出了I2C0、I2C1 + gPhytiumPlatformTokenSpaceGuid.PcdRtcI2cControllerBaseAddress|0x // IIC3 实际使用的是I2C3
- 使能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 解决驱动冲突
驱动冲突,占用了0x,+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, - 0x, 0x5000, - EFI_MEMORY_UC - ); - ASSERT_EFI_ERROR (Status); + //Status = gDS->AddMemorySpace ( + // EfiGcdMemoryTypeReserved, + // 0x, 0x5000, + // EFI_MEMORY_UC + // );^M + //ASSERT_EFI_ERROR (Status); - Status = gDS->SetMemorySpaceAttributes ( - 0x, 0x5000, - EFI_MEMORY_UC - ); - ASSERT_EFI_ERROR (Status); + //Status = gDS->SetMemorySpaceAttributes ( + // 0x, 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 |
偏移 | 位域 | 说明 |
---|---|---|
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 : 0x + 0x0204 : [3:0] : 写入0010
SDA : 0x + 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 : 0x + 0x0204 : [3:0] : Pll FUNC2 + SDA : 0x + 0x0208 : [31:28] : Pll FUNC2 + */ + Reg = MmioRead32(0x); + MmioWrite32(0x, (Reg & (~(0xff << 0))) | (0x22 << 0)); + Reg = MmioRead32(0x); + MmioWrite32(0x, (Reg & (~(0xff << 28))) | (0x22 << 28)); ...
1.2 允许SD3077的写使能功能
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 : 0x + 0x0204 : [3:0] : Pull FUNC2 + SDA : 0x + 0x0208 : [31:28] : Pull FUNC2 + */ + Reg = MmioRead32(0x); + MmioWrite32(0x, (Reg & (~(0xff << 0))) | (0x22 << 0)); + Reg = MmioRead32(0x); + MmioWrite32(0x, (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 ()
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.+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 () root@kylin-pc:~#
90. 附件
1. CPU 参考手册
略
2. RTC 参考手册
https://www.whwave.com.cn/cpscxz
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/154653.html