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模式下没有拷贝函数的赋值):
三、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模式下没有拷贝函数的赋值):
三、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)
版权声明:本文标题:DDRLESS模式下的软件调试(MPSOC) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/jiaocheng/1748292537a2280999.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论