admin管理员组

文章数量:1037775

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

一、需求:

在帮助客户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

三、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++);

}

}

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

一、需求:

在帮助客户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

三、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++);

}

}

本文标签: DDRLESS模式下的软件调试(MPSOC)