首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >DDRLESS模式下的软件调试(MPSOC)

DDRLESS模式下的软件调试(MPSOC)

原创
作者头像
Frank-大龙
修改2025-03-14 13:40:20
修改2025-03-14 13:40:20
3931
举报
文章被收录于专栏:MPSOCMPSOC

一、需求:

在帮助客户bring up板子时,有时会遇到极端情况,客户的板子第一版ddr无法使用,需要改版,为了尽量不拖延项目进度,需要在ddrless的情况继续调试,比如对PL Design进行调试,就需要运行一些软件代码来配合。ddrless下代码运行有两种常用的方式:

二、OCM:

MPSOC的OCM是256K,在正常启动模式下(sd/emmc/qspi),fsbl不但需要负责psu的初始化,还需要负责代码以及bit文件的搬移,这样256K空间能留给用户程序使用的就会非常小。 但是我们可以使用vitis的debug或者run功能来运行我们的代码,这种场景下,fsbl就只负责初始化,不负责代码搬移,那整个256K都可以给我们用户程序使用(在JTAG模式下没有拷贝函数的赋值):

XFsbl_PrimaryBootDeviceInit
XFsbl_PrimaryBootDeviceInit

三、Microblaze:

除了OCM,还有一种选择,可以使用PL 的microblaze来运行驱动,microblaze的信息输出也可以借用ps uart来完成

3.1

将Microblaze的DP口通过AXI_LPD连到PS,并配置地址。 0xFF000000是PS UART0 Controller的基地址。

3.2

在Vitis用下面代码自己封装一个打印函数printmsg(其实就是通过上面的通路,将打印字符直接写入到PS UART Controller的TX/RX FIFO),microblaze代码中可以使用printmsg进行打印。

#include "xil_io.h"

#define UART0_BASE_ADDR 0xFF000000

/* Write to memory location or register */

#define Xlnx_mWriteReg(BASE_ADDRESS, RegOffset, data) \

*(unsigned int *)(BASE_ADDRESS + RegOffset) = ((unsigned int) data);

/* Read from memory location or register */

#define Xlnx_mReadReg(BASE_ADDRESS, RegOffset) \

*(unsigned int *)(BASE_ADDRESS + RegOffset);

#define XlnxUartChanged_IsTransmitFull(BaseAddress) \

((Xil_In32((BaseAddress) + 0x2C) & 0x10) == 0x10)

void XlnxUartChanged_SendByte(u32 BaseAddress, u8 Data)

{

while (XlnxUartChanged_IsTransmitFull(BaseAddress));

Xlnx_mWriteReg(BaseAddress, 0x30, Data);

}

void printmsg(char c) {

XlnxUartChanged_SendByte(UART0_BASE_ADDR, c);

}

void MicroPrintViaPsUart(char *ptr)

{

while (*ptr) {

printmsg (*ptr++);

}

}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、需求:
  • 二、OCM:
  • 三、Microblaze:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档