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.

[参考译文] 66AK2G12:通过在 ARM 上运行的 Kernel Linux RT 加载 DSP 代码

Guru**** 651100 points
Other Parts Discussed in Thread: 66AK2G12
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1079756/66ak2g12-dsp-code-loading-by-means-of-kernel-linux-rt-running-on-arm

部件号:66AK2G12
“线程”中讨论的其他部件: EVMK2GK2GICE

各位专家:

为了我的工作,我正在开发基于 SoC 66AK2G12ABYQ100的定制板上的控制电机应用程序。

我通过 EVMK2G 在 DSP c66x 上开发了代码。 该代码在评估板上正常工作,编译的结果是 ELF 文件 PrjD.out。  

现在,我必须 将 ELF 文件 PrjD.out 加载 到安装在我的定制电子板上的66AK2G12上。   

我下载 了用于 K2G 的 Linux-RT 处理器 SDK 06.03.00.106版(发布日期为4月20日),并在 ARM 上安装了 ti-Linux-kernel-ti2019.03-RT。

 

下一步是配置在 ARM 上运行的内核,以便在 其 L2SRAM 上加载 DSP 代码

此操作 应 由 mpmcl / mpmsrv 工具执行,这些工具使用 CMEM 驱动程序处理定义的 CMA 区域内的实际内存分配。  

我修改 了设备树条形图(DTB),将 DDR 从512M 减少到256M。  

根文件系统还包含 我正在使用的 Busybox (不是 Arago)的内部版本,包括  mpm 所需的所有从属库。

我有以下问题:

1)我 的 DSP 应用是裸机代码,它基于库 CSL。  我 使用以下默认链接程序文件通过 CCS10.2.0编译了此代码。  

 

-heap  0x8000
-stack 0xC000

-l ti/dsplib/lib/dsplib.lib
-l ti/dsplib/lib/dsplib_cn.lib
-l ti/mathlib/lib/mathlib.lib

MEMORY
{
  L2SRAM (RWX)  : org = 0x10800000, len = 0x080000
  MSMCSRAM (RWX): org = 0x0c000000, len = 0x100000   /* 1MB MSMC Shared SRAM */
  DDR3 (RWX)    : org = 0x80000000, len = 0x80000000 /* 2GB external DDR3 */
}

SECTIONS
{
  .kernel: {
    dsplib*<*.o*> (.text:optimized) { SIZE(_kernel_size) }
  } 
  
  .text:            load >> L2SRAM 
  .text:touch:      load >> L2SRAM

  GROUP (NEAR_DP)
  {
    .neardata
    .rodata 
    .bss
  } load > L2SRAM
   
  .init_array: load >> L2SRAM 
  .far:        load >> L2SRAM
  .fardata:    load >> L2SRAM
  .neardata    load >> L2SRAM
  .rodata      load >> L2SRAM
  .data:       load >> L2SRAM 
  .switch:     load >> L2SRAM
  .stack:      load >  L2SRAM
  .args:       load >  L2SRAM align = 0x4, fill = 0 {_argsize = 0x200; }
  .sysmem:     load >  L2SRAM
  .cinit:      load >  L2SRAM
  .const:      load >  L2SRAM START(const_start) SIZE(const_size)
  .pinit:      load >  L2SRAM
  .cio:        load >> L2SRAM
  .csl_vect:   load >  L2SRAM
   xdc.meta:   load >> L2SRAM, type = COPY
}

下面是 CCS 的一般配置。

我通过  板载调试器 TI XDS2xxx 成功地验证了我的 ELF 文件 PrjD.out 在 EVMK2G 上的工作情况。

 此 ELF 文件是否与上述工具(Linux RT, mpmcl,mpmsrv,CMEM,CMA 等)兼容?  

是否需要修改链接器或对 ELF 文件进行后处理?

2)以下标准 CMA 配置在以下 DTB 配置上无法正常工作:

        dsp_common_mpm_memory: dsp-common-mpm-memory@81d000000 {
			compatible = "ti,keystone-dsp-mem-pool";
			reg = <0x00000008 0x1d000000 0x00000000 0x2800000>;
			no-map;
			status = "okay";
		};

		dsp_common_memory: dsp-common-memory@81f800000 {
			compatible = "shared-dma-pool";
			reg = <0x00000008 0x1f800000 0x00000000 0x800000>;
			reusable;
			status = "okay";
		};


实际上,启动时的内核在 CMA_INIT_RESTOND_ARIESS_ARIEND_ARIESS_ARIEND_ARIESS_AREs,显示“内核恐慌”。 

以下配置不会出现与引导内核相关的问题:

 
dsp_common_mpm_pool: dsp_common_mpm_pool@83000000 {
			compatible = "ti,keystone-dsp-mem-pool";
			reg = <0x00000000 0x83000000 0x00000000 0x400000>;
			no-map;
			status = "okay";
		};

	  dsp_common_memory: dsp_common_memory@82800000 {
			compatible = "shared-dma-pool";
			reg = <0x00000000 0x82800000 0x00000000 0x800000>;
			reusable;
			status = "okay";
		}; 
另一方面,此配置克服了 CMEM 初始化问题,但在 mpmsrv 工具使用 CMEM 时失败(DMA 操作出现内核恐慌)。
 
请您  是否可以为我提供与66AK2G12的 CMA 配置兼容的 CMEM 驱动程序(考虑 到降低了256M DTB 而不是512M)?
我 将 CMEM 驱动程序与存根选项配合使用。  

请提前感谢。

此致,

贝尼托

 


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

    你好,贝尼托,

    请参阅 适用于 K2G的 IPC 文档。

    此致,

    建中

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

    尊敬的许建忠先生:

    感谢您的反馈。

    我遵循您所附的 IPC 指南。 我 可以启动内核,但无法通过在 ARM 上运行 Linux RT 来加载 DSP。

    为了避免与我的定制电子板相关的错误,我尝试通过  K2GICE 加载 DSP TI 示例。 我报告了遇到的错误的一些详细信息...

    我可以加载驱动程序 CMEM。

    mpmsrv 工具工作正常。

    我成功地测试了一些与 mpmsrv 相关的命令作为 DSP 状态,重置,ping 等

    但是,我无法加载 DSP 代码。

    具体而言,我 尝试加载从 您建议的 IPC 指南下载的 TI 应用程序(server_core0.xe66)

    以下是错误:

    root@k2g-EVM:/usr/local/examples/ex02_MessageQ/release#/usr/bin/mpmcl load dsp0 server_core0.xe66
    加载失败(错误:-104)

    我在这里还附上了日志详细信息

    root@k2g-EVM:/usr/local/examples/ex02_MessageQ/release# tail -f /var/log/messages
    10月19日21:41:44 k2g-EVM demon.info mpmsrv[1449]: mpmsrv.c:110:mpm_server:收到尺寸为104字节的 cmd 1消息
    10月19日21:41:44 k2g-EVM demon.info mpmsrv[1449]: mpmsrv.c:134:mpm_server:收到了 dsp0文件名/usr/local/examples/ex02_MessageQ/release/server_core0.xe66的加载命令
    10月19日21:41:45 k2g-EVM daeme.err mpmsrv[1449]:mpmdlif.c:191:map_and_copy_segment:213664的传输句柄无效
    10月19日21:41:45 k2g-EVM daemon。错误 mpmsrv[1449]:mpmdlif.c:1279:DLIF_allocate:映射和复制失败,映象/usr/local/examples/ex02_MessageQ/release/server_core0.xe66,地址为0x800000,大小为0x68eb4
    10月19日21:41:45 k2g-EVM daeme.err mpmsrv[1449]:mpmdlif.c:1442:DLIF_error:<< D L O A D >>错误:
    10月19日21:41:45 k2g-EVM daemer.errmpmsrv[1449]: mpmdlif.c:1445:DLIF_error:无法为静态可执行文件分配目标内存。
    10月19日21:41:45 k2g-EVM daem.err mpmsrv[1449]:mpmdlif.c:864:mpm_dlif_load:文件/usr/local/examples/ex02_MessageQ/release/server_core0.xe66的图像加载失败
    10月19日21:41:45 k2g-EVM daem.err mpmsrv[1449]:mpmssm.c:c:c:510:mpm_load_slave:dsp0:图像加载失败
    10月19日21:41:45 k2g-EVM daem.err mpmsrv[1449]:mpmssm.c:419:mpm_ssm_state_error:输入了 dsp0的错误状态
    10月19日21:41:45 k2g-EVM demon.info mpmsrv[1449]: mpmsrv.c:77:mpm_server:正在等待从属消息

    内存配置为:  

    8000000000-97ffff:系统 RAM (引导别名)
    9f800000-9ffffff:系统 RAM (引导别名)
    8000000-817ffff:系统 RAM
    80000008000-800dfff:内核代码
    801000000-80108d2f7:内核数据
    818000000-81cffff:CMEM
    81f800000-81ffffff:系统 RAM

    而 CMEM 分配是  

    root@k2g-EVM:/usr/local/examples/ex02_MessageQ/released# cat /proc/cmem

    块0:池0:1 bufs size 0x5000000 (请求0x5000000)

    池0忙 bufs:

    池0免费 bufs:
    ID 0:physs 地址0x818000000

     当设备执行引导时:

    CMA 分配是  

    [0.000000]保留内存:已创建 CMA 内存池,大小为0x000000081f800000,大小为8 MIB
    [ 0.0000],共:保留内存:初始化节点 DSP-commo-memory@81f800000,兼容 ID shared-dma-pool
    [0.0000] CMA:保留48个 MIB,地址为0x0000000815000000

     设备树中的 CMA 配置为:

    内存@8000000 {
    device_type ="内存";
    REG =<0x00000008 0x00000000 0x00000000 0x20000000>;
    };

    保留内存{
    #address-cells =<2>;
    #size-单元格=<2>;
    范围;

    dsp_common_mpm_memory:dSP-commo-mpm-memory@81d000000{
    兼容="ti,keyston-dSP-mem-pool";
    REG =<0x00000008 0x1d000000 0x00000000 0x2800000>;
    无地图;
    状态=“正常”;
    };

    DSP_COMMON 内存:DSP-COMMON 内存@81f800000 {
    兼容=“shared-dma-pool”;
    REG =<0x00000008 0x1f800000 0x00000000 0x800000>;
    可重复使用;
    状态=“正常”;
    };

     设备树中的 CMEM 配置为:

    /
    保留内存{

    cmem_block_mem_0:cmem_block_memm@818000000{
    REG =<0x00000008 0x18000000 0x00000000 0x5000000>;
    无地图;
    状态=“正常”;
    };
    };

    cmem{
    兼容="ti,cmim";
    #address-cells =<1>;
    #size-单元格=<0>;

    #pool-size-cells =<2>;

    状态=“正常”;

    cmem_block_0:cmem_block@0{
    REG =<0>;
    内存区域=<&cmem_block_mem_0>;
    cmem-buf-pools =<1 0x00000000 0x5000000>;
    };

    cmem_block_1:cmem_block@1{
    REG =<1>;
    SRAM =<&SRAM_cmem>;
    };
    };
    };

    &msm_ram{
    SRAM_cmem:SRAM-cmem@a0000{
    REG =<0xa0000 0x57000>;
    };
    };

    请,您能建议我如何修复错误吗?

    如果您需要更多详细信息,请告诉我。

    请提前感谢。

    等待您的反馈。

    此致,

    贝尼托

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

    尊敬的许建忠先生,各位专家:

    请提供任何解决 错误的建议?

    请提前感谢。

    此致,

    贝尼托

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

    你好,贝尼托,

    我们的 Linux IPC 专家将在此次咨询中向您提供帮助。

    感谢您的耐心等待。

    此致,

    建中

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

    尊敬的许建忠先生:

    感谢您的反馈。  

    上周,我通过 K2GICE 上的 ARM 成功加载了 DSP。

    但是,该线程的主题( 与自定义板上的负载相关的问题)仍然存在。  

    我认为问题可能与外部内存配置有关。  

    事实上,我 的定制电子板与 K2GICE 非常相似。 主要区别在于外置内存 DDR3L SDRAM 的大小,即256MB,而不是512MB。  

    具体而言,我使用 K2GICE 的同一内核。 我只修改 了外部 SDRAM 和 GPIO 路由的*.DTS 文件。

    下面是一些详细信息。  

     我的 CMA - MPM 配置为:

     

            dsp_common_mpm_memory: dsp-common-mpm-memory@80f000000 {
    			compatible = "ti,keystone-dsp-mem-pool";
    			reg = <0x00000008 0x0f000000  0x00000000 0x800000>;
    			no-map;
    			status = "okay";
    		};
    
    		dsp_common_memory: dsp-common-memory@80f800000 {
    			compatible = "shared-dma-pool";
    			reg = <0x00000008 0x0f800000 0x00000000 0x800000>;			                   
    			reusable;
    			status = "okay";
    		};

    此外 ,我的 CMEM 配置是

        reserved-memory {
                                         
    		cmem_block_mem_0: cmem_block_mem@80e800000 {
    			reg = <0x00000008 0x0e800000 0x00000000 0x800000>;
    			no-map;
    			status = "okay";
    		};
    	}; 

    要彻底...

    CMA -  K2GICE 中的 MPM 配置(512MB)


               dsp_common_mpm_memory:dSP-commo-mpm-memory@81d000000{
               兼容="ti,keyston-dSP-mem-pool";
               REG =<0x00000008 0x1d000000 0x00000000 0x2800000>
               无地图;
               状态=“正常”;
               };


              DSP_COMMON 内存:DSP-COMMON 内存@81f800000 {
              兼容=“shared-dma-pool”;
              REG =<0x00000008 0x1f800000 0x00000000 0x800000>
              可重复使用;
              状态=“正常”;
              };

    CMA -定制主板中的 MPM 配置 (256MB)

              dsp_common_mpm_memory:dsp-commo-mpm-memory@80f000000{
              兼容="ti,keyston-dSP-mem-pool";
              REG =<0x00000008 0x0f000000 0x00000000 0x800000>
              无地图;
              状态=“正常”;
              };

              DSP_COMMON 内存:DSP-COMMON 内存@80f800000 {
              兼容=“shared-dma-pool”;
              REG =<0x00000008 0x0f800000 0x00000000 0x800000>
             可重复使用;
             状态=“正常”;
              };

    内核成功 运行,但在发出 DSP 重置命令时出现-105错误。   

      root@k2g-EVM:/etc/mpm# mpmcl 重置 dsp0
      重置失败(错误:-105)
      root@k2g-EVM:/etc/mpm# tail -f /var/log/messages
      k2g-EVM authpriv.notice login[317]:在'/dev/ttyS0上的 root 登录
      k2g-EVM demon.info mpmsrv[280]:mpmsrv.c:110:mpm_server:收到尺寸为44字节的 cmd 4消息
      k2g-EVM demon.info mpmsrv[280]:mpmsrv.c:253:mpm_server:已收到状态命令
      k2g-EVM demon.info mpmsrv[280]:mpmsrv.c:77:mpm_server:正在等待从属消息
      k2g-EVM demon.info mpmsrv[280]:mpmsrv.c:110:mpm_server:收到尺寸为44字节的 cmd 3消息
      k2g-EVM demon.info mpmsrv[280]:mpmsrv.c:233:mpm_server:已收到重置命令
      k2g-EVM daemon.err mpmsrv[280]:mpmdlif.c:384:mpm_rproc_cpu_reset:Rproc 用户 CPU 重置失败
      k2g-EVM daemon.err mpmsrv[280]:mpmdlif.c:426:mpm_dlif_reset:无法重置 DSP
      k2g-EVM daemon.err mpmsrv[280]:mpmsm.c:419:mpm_ssm_state_error:输入了 dsp0的错误状态
      k2g-EVM demon.info mpmsrv[280]:mpmsrv.c:77:mpm_server:正在等待从属消息

     在以下线程中:  

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/712332/linux-66ak2h14-device-tree-resource-table

    据报告,“DSP_COMMON mpm_pool 用于 Vcles/MessageQ。  资源表应将此地址用于虚拟环。  mpm-mem 节点(DTS)必须具有此地址,否则 VRing 将不起作用。  DSP 跟踪中会出现奇怪的 vring 错误

    我意识到 mpm_config.json 文件 不会处理 DDR3L 内存的大小,因为 VRINGS 地址是固定的。

     CMA - MPM 配置中的内存地址更改是否可能涉及 MPM 框架(MPMSRV-MPMCTL)中的问题?   

    请建议我如何正确修改*.DTS 文件,以成功地将 DDR3L 大小从512MB 减少到256MB?

    此致,

    贝尼托

     

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

    各位专家:  

    请您对我的咨询提出任何建议?

    正在等待反馈

    此致,

    贝尼托