This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM5728:Linux/AM572x:在 AM572x SOC 上的 ARM A15上运行 Linux、使 C66x 退出复位状态、以调试裸机 F/W 问题

Guru**** 2553450 points
Other Parts Discussed in Thread: AM5728

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/924289/am5728-linux-am572x-taking-the-c66x-out-of-reset-with-linux-running-on-the-arm-a15-on-am572x-soc-to-debug-problem-with-baremetal-f-w

器件型号:AM5728

尊敬的香榭丽舍

我尝试运行简单的裸机 DSP F/W (只是 LED 闪烁...) AM5728 GP EVM B/D 上运行的软件。 (处理器 SDK Linux 06.03.00.106)

我通过 JTAG 调试器检查了我的 DSP f/w 与 CCS、它运行正常!!!

(没有任何引导阶段或保持 u-boot 阶段、两者都可以。)

因此、我将".out"文件复制到"/lib/firmware/dra7-dsp1-fw.xe66 "上的 Linux 文件系统路径。

然后我重新启动了一个 B/D 以在内核启动序列中使用 remoteproc 启动 DSP F/W。。

下面是使用 remoteproc 启动内核的消息...

root@am57xx-EVM:~# dmesg | grep remoteproc
[7.535443] remoteproc remote0:588200.IPU 可用
[ 7.701710] proc remoteproc proc1:5502000.IPU 可用
[ 7.852374] remoteRemoteproc removeproc 2:408000.dsp 可用
[ 7.948015]
mspc remote2:1150001.001.mspc remoteDSP 可用]
启动 FW 映像 dra7-dsp1-fw.xe66、大小为742408
[ 8.246866] remoteproc remoteproc0:启动588200.IPU
[ 8.252731] remoteproc remotecproc0:启动 FW 映像 dra7-ippu1-fw.xem4、大小为6884184
[ 8.303815] remotepre 8.52000-1
:启动 mute1.451080 ws
已注册

远程处理器0 (类型7)[8.428313]远程处理器远程处理器0:远程处理器588200.IPU 现已启动[8.709654]远程


处理器处理器进程1:已注册的远程处理器1 (类型7)[8.741043]远程处理器远程处理器1:远程处理器5502000.IPU 现已启动[9.529.442]远程处理器远程处理器启动[DSP 51003] 启动 FW 映像 dra7-dsp2-fw.xe66、大小20483260
[9.678107] remoteproc remoteproc 3:注册的 virtio2 (类型7)
[9.746024] remoteproc remoteproc remoteproc 3:远程处理器41000000.dsp 现已启动
[14.241376] remoteproc remoteproc 4:14.74604b2dprc remote2u.24674b4000:14.4bpr854.b24674bpr85] remote45b4000可用


提供4b2b8000.PRU 

我认为 DSP1 F/W 出现了问题、

因为没有消息:“远程处理器40800000.dsp 现已启动”

这是我的 DSP 代码(简单状态 LED 闪烁环路)

void main (void)
{
//焊盘配置
board_initCfg boardCfg;
boardCfg = Board_init_unlock_MMR | Board_init_uart_stdio |
Board_init_module_clock | Board_init_PINMUX_config;
board_init (boardCfg);

//启用 GPIO 时钟
HW_WR_REG32 (CSL_MPU_L4PER_CM_CORE_RESG+CSL_L4PER_CM_CORE_COMPONENT_CM_L4PER_GPIO7_CLKCTRL_REG、0x102);
while ((HW_RD_REG32 (CSL_MPU_L4PER_CM_CORE_regs+CSL_L4PER_CM_CORE_COMPONENT_CM_L4PER_GPIO7_CLKCTRL_REG)&(0x00030000U))!= 0x0)
{
;
}

GPIOModuleReset (CSL_DSP_GPIO7_regs);
GPIOModuleEnable (CSL_DSP_GPIO7_regs);

GPIODirModeSet (CSL_DSP_GPIO7_regs、8、GPIO_DIR_OUTPUT);
GPIOPinWrite (CSL_DSP_GPIO7_regs、8、GPIO_PIN_HIGH);

GPIODirModeSet (CSL_DSP_GPIO7_regs、9、GPIO_DIR_OUTPUT);
GPIOPinWrite (CSL_DSP_GPIO7_regs、9、GPIO_PIN_HIGH);

GPIODirModeSet (CSL_DSP_GPIO7_regs、14、GPIO_DIR_OUTPUT);
GPIOPinWrite (CSL_DSP_GPIO7_regs、14、GPIO_PIN_HIGH);

GPIODirModeSet (CSL_DSP_GPIO7_regs、15、GPIO_DIR_OUTPUT);
GPIOPinWrite (CSL_DSP_GPIO7_regs、15、GPIO_PIN_HIGH);

HW_WR_FIELD32_RAW (GPO7_8_PINMODE_ADDR、PINMUX_SETMASK、 0、GPO7_8_PINMODE_VAL);
HW_WR_FIELD32_RAW (GPO7_9_PINMODE_ADDR、PINMUX_SETMASK、0、GPO7_9_PINMODE_VAL);
HW_WR_FIELD32_RAW (GPO7_14_PINMODE_ADDR、PINMUX_SETMASK、0、GPO7_14_PINMODE_VAL);
HW_WR_FIELD32_RAW (GPO7_15_PINMODE_ADDR、PINMUX_SETMASK、0、GPO7_15_PINMODE_VAL);

while (1)
{
GPIOPinWrite (CSL_DSP_GPIO7_regs、8、GPIO_PIN_HIGH);
GPIOPinWrite (CSL_DSP_GPIO7_regs、9、GPIO_PIN_LOW);
GPIOPinWrite (CSL_DSP_GPIO7_regs、14、GPIO_PIN_HIGH);
GPIOPinWrite (CSL_DSP_GPIO7_regs、15、GPIO_PIN_LOW);
延迟(4000000);

GPIOPinWrite (CSL_DSP_GPIO7_regs、8、GPIO_PIN_LOW);
GPIOPinWrite (CSL_DSP_GPIO7_regs、9、GPIO_PIN_HIGH);
GPIOPinWrite (CSL_DSP_GPIO7_regs、14、GPIO_PIN_LOW);
GPIOPinWrite (CSL_DSP_GPIO7_regs、15、GPIO_PIN_HIGH);
延迟(4000000);
}
}

我还在与状态指示 GPIO 相关的内核器件树上阻止 GPIO 设置。

am57xx-beagle-x15-common.dtsi

// LED{
// 兼容="GPIO-LED";

// led0{
// 标签="beagle-x15:usr0";
// GPIO =<&GPIO7 9 GPIO_ACTIVE_HIGH>;
// linux、default-trigger ="检测信号";
// 默认状态="off";
// };

// LED1{
// 标签="beagle-x15:USR1";
// GPIO =<&GPIO7 8 GPIO_ACTIVE_HIGH>;
// linux、default-trigger ="CPU0";
// 默认状态="off";
// };

// LED2{
// 标签="bagle-x15:usr2";
// GPIO =<&GPIO7 14 GPIO_ACTIVE_HIGH>;
// linux、default-trigger ="mmc0";
// 默认状态="off";
// };

// LED3{
// 标签="beagle-x15:usr3";
// GPIO =<&GPIO7 15 GPIO_ACTIVE_HIGH>;
// linux、default-trigger ="磁盘活动";
// 默认状态="off";
// };
// };

但在启动后、状态 LED 全部熄灭。  

因此、我需要了解裸机 DSP f/w 为何不起作用。

在 Linux 环境中、  

我在以下链接中找到了 CCS 和 JTAG 的调试技术"Out of reset":

http://software-dl.ti.com/processor-sdk-rtos/esd/docs/latest/rtos/index_how_to_guides.html#taking-the-c66x-out-of-reset-with-linux-running-on-the-arm-a15

但是、这些内容仅适用于带有 EvmK2的 C66x!!

在 GP EVM AM5728上不工作....

CCS 中出现弹出错误:

连接到目标时出错:
(错误-1180 @ 0x0)
器件保持复位状态。 使器件退出复位状态、然后重试此操作。
(仿真包9.2.0.00002) 

以及 CCS 中的日志:

Cortex_M4_IPU1_C0:GEL 输出:->>>AM572x Cortex M4启动序列正在进行中... <<--
Cortex_M4_IPU1_C0:GEL 输出:--> AM572x Cortex M4启动序列完成! <<--
Cortex_M4_IPU1_C1:GEL 输出:--> AM572x Cortex M4启动序列正在进行中... <<---
Cortex_M4_IPU1_C1:GEL 输出:--> AM572x Cortex M4启动序列完成! <<--
Cortex_M4_IPU2_C0:GEL 输出:--> AM572x Cortex M4启动序列正在进行中... <<--
Cortex_M4_IPU2_C0:GEL 输出:--> AM572x Cortex M4启动序列完成! <<--
Cortex_M4_IPU2_C1:GEL 输出:--> AM572x Cortex M4启动序列正在进行中... <<---
Cortex_M4_IPU2_C1:GEL 输出:--> AM572x Cortex M4启动序列完成! <<---
C66xx_DSP1:GEL 输出:--> AM572x C66x DSP 启动序列正在进行中... <<---
C66xx_DSP1:GEL 输出:--> AM572x C66x DSP 启动序列完成! <<---
C66xx_DSP2:GEL 输出:--> AM572x C66x DSP 启动序列正在进行中... <<---
C66xx_DSP2:GEL 输出:--> AM572x C66x DSP 启动序列完成! <<--
CortexA15_0:GEL 输出:--> AM572x Cortex A15启动序列正在进行中... <<---
CortexA15_0:GEL 输出:--> AM572x Cortex A15启动序列完成! <<--
CortexA15_1:GEL 输出:--> AM572x Cortex A15启动序列正在进行中... <<---
CortexA15_1:GEL 输出:--> AM572x Cortex A15启动序列完成! <<--
德州仪器 XDS2xx USB 调试探针/C66xx_DSP1:加载程序前必须连接目标方。
德州仪器(TI) XDS2xx USB 调试探针/C66xx_DSP2:加载程序之前必须连接目标。
IcePick_D:GEL 输出:IPU RTOS 从等待复位中释放。
IcePick_D:GEL 输出:IPU SIMCOP 从等待复位中释放。
IcePick_D:GEL 输出:IVAHD C66从等待复位中释放。
IcePick_D:GEL 输出:IVAHD ICONT1从等待复位中释放。
IcePick_D:GEL 输出:IVAHD ICONT2被从等待复位中释放。
C66xx_DSP1:连接到目标时出错:(错误-1180 @ 0x0)器件保持在复位状态。 使器件退出复位状态、然后重试此操作。 (仿真包9.2.0.00002) 

我使用以下 DSP 代码测试了其他测试:

void main (void)
{
int ncnt = 0;

while (1)
{
延迟(4000000);
nCnt++;

}
} 

而且也没有消息:“远程处理器40800000.DSP 现在已启动”

可能需要设置 link.cmd 文件的系统信息??

以下是我的 link.cmd 文件:


-stack 0x1000 /*软件堆栈大小 */
-heap 0x2000 /*堆区域大小 /*

指定系统内存映射*/

内存
{
RST_START: org = 0x00800000 len = 0x0300
IRAM_MEM: org = 0x00800300 len = 0x7c00
MMU_TLB:origin = 0x4031C000 length = 0x000004000
/* SBL 将使用地址0x80000000处的1KB 空间用于 EVE */
DDR3_A8:org = 0x80000400 len =(0x0B000000 - 0x400)/* 176 MB *
DDR3_boot: org = 0x000000 8Blen = 0x00010000 // 32 MB */
DDR3_DSP: org = 0x8B010000 len = 0x01FF0000 /* 32 MB */
DDR3_M3VPSS:org = 0x8D000000 len = 0x01000000 // 16 MB */
DDR3_M3VIDEO:org = 0x8E000000 len = 0x01000000 // 16 MB */
DDR3_SR0: org = 0x8F000000 len = 0x01000000 /* 16 MB */
}

//指定段分配到内存*/

SECTIONS
{
boot:
{
rts*.lib (.text)
}load > ddr3_boot

.cachetest_ddrbuf > IRAM_MEM
组:加载> IRAM_MEM
{
.bss: /*未初始化或零初始化*/
.neardata:
.rodata:
}
Board_IO_DELAY_DATA:LOAD > IRAM_MEM
Board_IO_DELAY_CODE:LOAD > IRAM_MEM
.cSL_vect:load > RST_start
.vects: load > IRAM_MEM
L2_int:LOAD > IRAM_MEM
pmIdleFunc:load > IRAM_MEM
init:load > IRAM_MEM
.cio :加载> IRAM_MEM

text:load > IRAM_MEM /*代码 *
.data:load > IRAM_MEM /*初始化的全局和静态变量。 *
/*全局和静态变量。 *
RUN_START (BSS_START)
RUN_END (BSS_END)
.const:LOAD > IRAM_MEM /*全局常量 *
.cinit:加载> IRAM_MEM
stack:load > IRAM_MEM /*软件系统堆栈 */
.far:load > IRAM_MEM
.plt :load > IRAM_MEM
.fardata:load > IRAM_MEM
.switch:load > IRAM_MEM
.my_sect_DDR:load > IRAM_MEM
.sysmem:load > IRAM_MEM
}

我认为下面的情况是可疑的…

DDR3_boot: org = 0x000000 8Blen = 0x00010000 // 32 MB */ 

我还使用以下进行了测试,但结果相同...(无消息:远程处理器40800000.DSP 现已启动)

DDR3_boot: org = 0x99000000 len = 0x04000000 /* 32 MB */ 

如何计算 DDR3_boot org 和 len???

请检查我的 DSP 项目:

e2e.ti.com/.../am572x_5F00_dsp0_5F00_baremetal.zip

我的 CMA 和 CMEM 设置如下:

am57xx-beagle-x15-common.dtsi

存储器@









@






@0{device_type ="存储器";reg =<0x0 0x80000000 0x0 0x80000000>;// 2GB};保留存储器{#address-cells =<2>;#size-cells =<2>;ranges;ippu2_memory_region:i5800000 = 0x99000"
共享存储器区;"dma-region = 0x99000";dma-dma-region = 0x99000";dma-region dma-region = 0x99000";dma-dma-region dma-region = 0x99000";dma-region dma-region = 0x99000";dma-dma-dma-
reg =<0x0 0x99000000 0x0 0x4000000>;
可重用;
status ="确定";
};

ipu1_memory_region:ipu1-memory@






@9d000000{compatible ="共享 dma-pool";reg =<0x0 0x9d000000 0x0 0x2000000>;可重用;status ="确定";};dsp2_dma-pool = 0x800000000;0xdma-region





= 0x000000;"0xdma-region dma-status";0xdma-que";0xdma-dma-dma-que"


am57xx-evme-cmem.dtsi
/{
保留存储器{
#address-cells =<2>;
大小单元格=<2>;
范围;

cmem_block_mem_0:cmem_block_mem@a0000000{
reg =<0x0 0xa0000000 0x0 0x0c000000>;
无地图;
状态="正常";
};

cmem_block_mem_1_ocmc3:cmem_block_mem@40500000{
reg =<0x0 0x40500000 0x0 0x100000>;
无映射;
状态="确定";
};
};

cmem{
兼容="ti、cmem";
#address-cells =<1>;
#size-cells =<0>;

#pool-size-cells =<2>;

状态="正常";

cmem_block_0:cmem_block@0{
reg =<0>;
memory-region =<&cmem_block_mem_0>;
cmem-buf-pools=<1 0x0 0x0c000000>;
};

cmem_block_1:cmem_block@1{
reg =<1>;
memory-region =<&cmem_block_mem_1_ocmc3>;
};
};
};

和内存状态:

根部@am57xx-evm:~





@
@



@
@/proc/iomem 20013000-2ffffff:MEM 20100000-201ffff:0000:00:00.0 40300000-4037ffff:40300000。ocmcram 40500000-4051700fff:CMEM 40800000-40847fff:l40800d4000-40fff



:4040406400f:1504040f:4064000-040f:4064000-040f:404064000-040f:4064000-040f:4064000-040f:4064000-040f:4064000-040f OCP
45000000-45000fff : OCP
4802000-4802001f : serial
48032000-4803207f : timer@48032000
48034000-4803407f : timer@48034000
48036000-4803607f : timer@48036000
4804804804804804804804804804804804804804804804804000-4803e07f : timer@
@
@
@
@
@
@
@
@
@48048048048048048048048048048051000-480551000 f: 100551000 gpio 54000-560055000 f: 1004000-400000 gpio 54000-4804804804804804804804804804804804804804804804804804804804804804804804804804804804804804804804804804804804804804804804804804804804000-4804000-4804000-480534000-48051000
I2C@4807c000
48086000-4808607f:计时器@48086000
48088000-4808807f:计时器@48088000
48090000-48091fff:rng@48090000
4809c000-4809c3ff:MMC@4809c000 4805000 480a5000-480400000
a 509f:@
@
@

@
@
@
@
@
@
@48048484484484000-48448448244000-48484824f:48448484848484484484484bf:48448484484484b4000:484484484b4000
计时器@48824000
48826000-4882607f:计时器@48826000
48828000-4882807f:计时器@48828000
4882a000-4882a07f:计时器@4882a000
4882c000-4882c07f:计时器@
@
@
@
@
@
@
@
@
@
@4882c000 4880000_48848800fr:4884880000:48848800fr:48848800_48800f:48848800fr 48848800f:48848800_48800f:48848800f:48848800f:48848800fr 48848800f:48848800_48800f:48848848800f:48848848800_48800fr 48848800f
@
bandgtrl@4a0021e0
4a002380-4a0023ab:bandgap@4a0021e0
4a0023c0-4a0023fb:bandgap@



@
@
@
@


@4a0021e0 4a00246c-4a00246f:ldo 地址4a002470-4a0024072-4a0024072-a02456f:b4a4000-4a04000-4a024074-bdma:4a024074-a024074-a024074-a024bdma-4a024074-a024bdma-4a024074-a024bdma-4a024bdma-4a024bdma:4a024076-4a024074-a024074-a024bdma-4a024bdma-4a024074-a024bdma-4a024bdma-4a024074-a0a024bdma-4a024bdma

@@

phy_TX
4a084c00-4a084c3f:pll_ctrl
4a085000-4a0853ff:phy@4a085000
4a090000-4a09001f:ocp2scp@4a090000 4a074000-4aaeaeaeaeaeaeaeaeaeaeefphy_phy_4a094400-4a074000-4a074000-4a074000-4a074000-4a0742-4a074000-4a074e074-0743-4e074-0743-4e074-0742-0742-0742-0742-074e0742-074-0742-074e0742-074-074-0724-0742-0742-0742-0742-074e0742-074-0743-4e074-0724-0743-074-0724-074-074-074-0742-074-074-074-074-073-074e074-074-074-074-0742-0742-0742-074-












设置地址
4ae0c154-4ae0c157:ldo-address
4ae0c158-42240c15b:ldo-address
422410000-42200101ff:gpio@4ae10000
4ae14000-42241407f:wdt@4aeae4000-4b24000bf
:timer@
@
@






@4b240004b2b24b2b24bf:4b2b2b2b2b2b2b2b2b4b4000-b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4bf:24b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4000-b4b4b4b4b4b4b4b4b4b2

debug
4b2a4000-4b2a43ff:control
4b2a4400-4b2a44ff:debug
4b2b4000-4b2b6fff:IRAM
4b2b8000-4b2b2障 板:IRAM
4b500000-4b50009f:AES@
@



@

@4b5000004b700000-4b70000584000-4b5b5800f:100b5840000f:100b5b5rf:100b5840000100b5b5b5b40000f:100b5840000f:100b5840000f:100b5b5b5b5b40000f:100b5b5b5b5b40000f:100b58400b5b5b5b5b5b5b40000f:100b5b5b400b5b400b5b400b5b400b400b5b400b5b5b400b5b400b5b400b5b400b400b5b5b400b400b5b5b5b400b5b



pll2
58040000-580401ff:wp
58040200-5804027f:pll
58040300-5804037f:phy
58060000-58078fff:core
5882000-5882ffff:l2ram58882000-588820ff
:mu@






@~ 58882000 80000000-58078ffff:corp

:/proc/cmem 8000-800000-8000-8000 dffff:l2ramf RAM:l600-8000-5888000f:inuerf:inuf:1000:1000 emb:inuf 1 bufs size 0xc000000 (请求0xc000000)

池0忙 bufs:
ID 0:phys addr 0xa0000000 (缓存)

池0空闲 bufs:

如何在这种情况下进行调试?

您能为我提供此问题的解决方案吗?

谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    DSP DDR3_boot 地址应为0x99000000。

    是否可以将所有段移动到 DDR3_boot 而不是 IRAM、然后重试?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢刘先生。

    我更改了.cmd 文件,如下所示:

    -stack 0x1000 /*软件堆栈大小 */
    -heap 0x2000 /*堆区域大小 /*
    
    指定系统内存映射*/
    
    内存
    {
    RST_START: org = 0x00800000 len = 0x0300
    //IRAM_MEM: org = 0x00800300 len = 0x7c00
    IRAM_MEM: org = 0x4050000 len = 0x7c00
    MMU_TLB:origin = 0x4031C000 length = 0x000004000
    /* SBL 将使用地址0x80000000处的1KB 空间用于 EVE */
    DDR3_A8:org = 0x80000400 len =(0x0B000000 - 0x400)/* 176 MB *
    
    //DDR3_boot: org = 0x000000 8Blen = 0x00010000 // 32 MB */
    //DDR3_DSP: org = 0x8B010000 len = 0x01FF0000 /* 32 MB */
    //DDR3_M3VPSS:org = 0x8D000000 len = 0x01000000 // 16 MB */
    //DDR3_M3VIDEO:org = 0x8E000000 len = 0x01000000 // 16 MB */
    //DDR3_SR0: org = 0x8F000000 len = 0x01000000 /* 16 MB */
    
    DDR3_boot: org = 0x99000000 len = 0x04000000 // 32 MB */
    }
    
    //指定段分配到内存*/
    
    SECTIONS
    {
    boot:
    {
    rts*.lib (.text)
    }load > ddr3_boot
    
    .cachetest_ddrbuf > ddr3_boot
    组:load > DDR3_boot
    {
    .bss: /*未初始化或零初始化*/
    .neardata:
    .rodata:
    }
    Board_IO_DELAY_DATA:LOAD > DDR3_BOOT
    Board_IO_DELAY_CODE:LOAD > DDR3_BOOT
    .cSL_vect:load > DDR3_boot
    .vect:load > DDR3_boot
    L2_int:load > DDR3_boot
    pmIdleFunc:load > ddr3_boot
    init:load > DDR3_boot
    .cio :加载> DDR3_boot
    
    .text:load > DDR3_boot /*代码 *
    .data:load > DDR3_boot /*初始化的全局和静态变量。 *
    /*全局和静态变量。 *
    RUN_START (BSS_START)
    RUN_END (BSS_END)
    .const:load > DDR3_boot /*全局常量 *
    .cinit:load > DDR3_boot
    stack:load > DDR3_boot /*软件系统堆栈 */
    .far:load > DDR3_boot
    .plt :load > ddr3_boot
    .fardata:load > ddr3_boot
    .switch:load > ddr3_boot
    .my_sect_DDR:load > ddr3_boot
    .sysmem:load > ddr3_boot
    }
    
    

    但结果与以前一样...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    RTOS 示例二进制文件不是与 Linux 配合使用的好参考。

    我建议您查看以下链接并使用 IPC 示例作为参考。

    https://software-dl.ti.com/processor-sdk-linux/esd/docs/06_03_00_106/linux/Foundational_Components_IPC.html

    此致、
    斯坦利