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.

[参考译文] CCS/PROCESSOR-SDK-AM57X:配置 M4的 L4PERx 存储器偏移

Guru**** 2564410 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/593449/ccs-processor-sdk-am57x-configuration-of-l4perx-memory-offsets-for-m4

器件型号:PROCESSOR-SDK-AM57X
Thread 中讨论的其他器件:SYSBIOS

工具/软件:Code Composer Studio

您好!

我们需要控制 M4内核下的多个外设。 我知道我们应该重新配置外设的存储器基址。 在我的 I2C3案例中。

此示例代码:

I2C_HwAttrs i2c_cfg;
I2C_socGetInitCfg (I2C_instance、&i2c_cfg);

Log_Print1 (Diags_entry | Diags_info、"--> I2C base ad:0x%x"、i2c_cfg.baseAddr); 

提供:  

[T=0x001de269] xdc.runtime.Main:--> I2C 基址 AD:0x48060000

在 cfg 文件中、正确修改了计时器的基址...

/*配置外部定时器基址以匹配资源表映射。
*
var dmTimer = xdc.useModule('ti.sysbios.timers.dmtimer.Timer');
/* dmTimer 0映射到 GPT1 */
dmTimer.timerSettings[0].baseAddr = 0x6AE18000;

但我不知道如何为其他外设执行该操作。

此致、感谢您的帮助、

François μ A

默认资源表创建以下映射:

Cortex M4使用的虚拟地址 Unicache MMU 输出的地址 IOMMU 输出端的地址 尺寸 注释
0x6A000000 0x6A000000 0x4A000000 16 MB L4CFG + L4WKUP
0x68000000 0x68000000 0x48000000 2 MB L4PER1
0x68400000 0x68400000 0x48400000 4 MB L4PER2
0x68800000 0x68800000 0x48800000 8 MB L4PER3
0x74000000 0x74000000 0x54000000 16 MB L3_INSTR + CT_TBR

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 François、

    您可以按照 wiki 页面 processors.wiki.ti.com/.../IPC_Resource_customTable 在 资源表中添加其他外设存储器映射。

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

    您好!

    感谢你的帮助。 我已使用 IPC 定义修改了基址。 如下所示:

    /* I2C 配置*/
    #define I2C_instance (2)
    #define I2C_SLAVE_ADDR ((0x50U)>>1)
    #define I2C_TRANSACTION _TIMEOUT (200U)
    
    Log_Print1 (Diags_entry | Diags_info、"->I2C base ad:0x%x"、i2c_cfg.baseAddr);
    icfg_cfg.baseAddr = i2c_cfg.baseAddr % L4 _peripheral_L4PER1 + IPU_peripheral_L4PER1;Log_1(0x2c_baseAdr)x
    、i_Addr = i2c_Log_Addr、i_Log_Addr、i_Log_Addr、i_Log_Log_Addr_Log_Inituation_4+ iAdr_Dion_Dion_D 

    现在我在下一行中失败了:


    boardCfg = Board_init_PINMUX_CONFIG | Board_init_module_clock;/*| Board_init_uart_stdio */ status = Board_init (boardCfg); Log_Print1 (Diags_entry | Diags_info、"->"Board status:%d"、status); Board_IDInfo; Board_getinfo (&getinfo;board_getinfo (&getinfo)

    我们是否需要调用这些函数? 如果我删除 了对这些函数(Board_init 和 Board_getIDInfo)的调用,则固件在调用函数 I2C_Open 时崩溃:

    I2C_init ();
    
    I2C_Params_init (&i2cParams);
    handle = I2C_open (I2C_instance、&i2cParams);
    
    I2C_transactionInit(&i2cTransaction);
    i2cTransaction.slaveAddress = I2C_SLAVE_ADDR;
    i2cTransaction.writeBuf =(uint8_t *)&txTconBuf[0];
    i2cTransaction.writeCount = 2;
    i2cTransaction.readBuf =(uint8_t *)&rxTconBuf[0];i2cTransaction
    
    
    = i2cTransaction.readtimeout =(i2cTransaction = i2cTransfer_translit = i2c.readBut);i2c.timeout =(i2cTransit =(i2cTransaction_transfer_translit = 

    谢谢、此致、

    François μ A

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

    尊敬的 TI:

    请您知道为什么我的固件在从 Linux 加载时崩溃? I2C3是免费的、Linux 不使用...  

    修改 i2c 基址是否足够了?

    谢谢、此致、

    François μ A

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

    您必须调用 Board_init()来配置 pinmux 和时钟。 根据您的帖子、您不清楚您是否已更新资源表或只是在应用程序中修改了 i2c_cfg.baseAddr。

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

    您好、Garrett。

    感谢你的帮助。

    我需要添加一些精度。 我们正在尝试从 Linux 端加载 IPU1_C0上的固件。 在调试会话中,函数 Board_Init()的调用正在工作。 在加载固件期间、同一调用会使 Linux 崩溃。

    因此、我们认为 Board_moduleClockInit 与我们使用的 Linux 配置不兼容。

    函数 Board_moduleClockInit 真的很大、您能帮助我们只保留必要的行吗? 或者、给我们一些线索、以删除某一行、使其具有与 Linux 兼容的固件。

    谢谢、此致、

    François μ A

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

    您好、Garret、

    我们已 使用特殊的 pinmux 重建了 ti.board.aem4库、但在加载简单固件时、我们仍然会遇到 Linux 崩溃:

    /* xdctools 头文件*/
    #include 
    #include 
    #include 
    #include 
    #include 
    
    /*软件包头文件*/
    #include 
    #include 
    #include 
    
    #include 
    #include 
    
    #include 
    #include 
    
    /* I2C 配置*/
    #define I2C_instance (2)
    #define I2C_SLAVE_ADDR ((0x50U)>>1)
    #define I2C_TRANSACTION _TIMEOUT (200U)
    
    
    静态空 Board_initI2C (void)
    {
    board_initCfg boardCfg;
    
    boardCfg = Board_init_PINMUX_CONFIG |
    Board_init_module_clock;
    board_init (boardCfg);
    }
    
    
    
    /*
    ===== main ====
    //
    int main (int argc、char* argv[]){
    
    Board_initI2C();
    
    返回0;
    } 

    配置:

    * PDK 1_0_5 /编译器版本 TI v16.9.1.LTS

    * Linux 版本:4.4.12

    [8.818363] remoteproc0:远程处理器5882000.IPU 现已启动
    [8.824555] OMAP-rproc 588200.IPU:OMAP rproc 588200.IPU 崩溃
    [8.835324] virtio_rpmsg_bus virtio0:rpmsg 主机处于联机状态
    [8.836968] remoteproc0:在5882000.IPU 中检测到崩溃:键入 device exceptn
    [8.837241] remoteproc0:处理5882000.IPU 中的碰撞#1
    [8.837244] remoteproc0:正在恢复588200.IPU
    [8.861489] remoteproc0:无法取消映射187695104/201326592
    [8.862437] EXT4-FS (mmcblk1p2):恢复完成
    [8.862450] EXT4-FS (mmcblk1p2):已安装的文件系统,具有有序数据模式。)
    [8.881869] remoteproc0:无法取消映射16777216/0
    [8.894566] omap_hwmod:MMU_ipu1:_wait_target_disable 失败
    [8.900805] remoteproc0:已停止远程处理器588200.IPU
    [8.916084] remoteproc0:为5882000.IPU 加电
    [8.924565] remoteproc0:引导 FW 映像 dra7-ipu1-fw.xem4、大小为4308692
    [8.931918] OMAP-iommu 588820.MMU:588820.MMU:版本2.1
    [8.942012] remoteproc0:远程处理器588200.IPU 现已启动
    [8.948554] virtio_rpmsg_bus virtio0:rpmsg 主机处于联机状态
    [8.954120] remoteproc0:registered virtio0 (类型7)
    [8.959652] OMAP-rproc 588200.IPU:OMAP rproc 588200.IPU 崩溃
    [8.966071] remoteproc0:在5882000.IPU 中检测到崩溃:键入 device exceptn
    [8.973499] remoteproc0:处理5882000.IPU 中的碰撞#2
    [8.979096] remoteproc0:正在恢复588200.IPU
    [8.985535] remoteproc0:无法取消映射187695104/201326592
    [8.991340] remoteproc0:无法取消映射16777216/0
    [9.003975] omap_hwmod:MMU_ipu1:_wait_target_disable 失败
    [9.009787] remoteproc0:已停止远程处理器588200.IPU
    [9.022600] remoteproc0:为5882000.IPU 加电
    [9.027435] remoteproc0:引导 FW 映像 dra7-ipu1-fw.xem4,大小为4308692
    [9.034478] OMAP-IMU 588820.MMU:588820.MMU:2.1版
    [9.046213] remoteproc0:远程处理器588200.IPU 现已启动
    [9.052632] OMAP-rproc 588200.IPU:OMAP rproc 588200.IPU 崩溃
    [9.059016] remoteproc0:在5882000.IPU 中检测到崩溃:键入 device exceptn
    [9.066748] virtio_rpmsg_bus virtio0:rpmsg 主机处于联机状态
    [9.072292] remoteproc0:registered virtio0 (类型7)
    [9.077798] remoteproc0:处理5882000.IPU 中的碰撞#3
    [9.083417] remoteproc0:正在恢复588200.IPU
    [9.089204] remoteproc0:无法取消映射187695104/201326592
    [9.095004] remoteproc0:无法取消映射16777216/0
    [9.107366] OMAP_hwmod:MMU_ipu1:_wait_target_disable 失败
    [9.113168] remoteproc0:已停止远程处理器588200.IPU
    [9.127128] remoteproc0:为5882000.IPU 加电
    [9.131994] remoteproc0:引导 FW 映像 dra7-ipu1-fw.xem4,大小为4308692
    [9.138997] OMAP-IMU 588820.MMU:588820.MMU:2.1版
    [9.152543] remoteproc0:远程处理器5882000.IPU 现已启动
    [9.158892] OMAP-rproc 588200.IPU:OMAP rproc 588200.IPU 崩溃
    [9.165559] remoteproc0:在5882000.IPU 中检测到崩溃:键入 device exceptn

    (笑声)

    您是否知道 TI 是否已经在一个 AM572X 平台上测试了 I2C 示例(MAIN_TEMP_SENSOR)?

    谢谢、此致、

    François μ A  

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

    我们在 PDK 封装中提供了温度传感器的 I2C 示例/ti/drv/i2c/example/tempensor/src/main_tempensor.c (另请 参阅 processors.wiki.ti.com/.../AM572x_General_Purpose_EVM_HW_User_Guide)、但我不确定是否有 M4示例并从 Linux 加载。

    您是否在 AM572x IDK 或 GPEVM 上尝试过上述简单固件? 实际上、如果不涉及"特殊引脚多路复用"或时钟、则不必在 M4中重新配置、因为引脚多路复用和时钟已经由 u-boot 处理。 还建议将任何特殊的引脚多路复用器和时钟移入 u-boot。 我应该在一开始就清楚说明这一点。

    默认情况下、AM57x 的 Linux 器件树中的 I2C3配置为连接实时时钟"兼容="microchip、mcp7941x"、您是否删除了此条目?

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

    您好、Garret、

    我在该主题上添加了一个外观:

    适用于 M4的 AM57x RTOS GPIO 驱动程序

    然后、我在调用用户函数期间尝试更改 I2C 的基址。 因此我 以平坦的方式重写 I2C_init() FCT 和 I2C_open()。

    我的代码:

    I2C_HwAttrs i2c_cfg_test;
    
    I2C_Params i2cParams;
    I2C_Handle handle = NULL;
    
    I2C_HwAttrs i2cInitCfg_[1]=
    {
    
    (CSL_IPU_I2C3_regs%L4_PERIPS_L4PER1)+ IPU_PERIPS_L4PER1、
    43、
    87、
    CSL_I2C_2_MODULE_FREQ、
    对、
    {
    0x72、0x0、0x0、0x0
    }、
    }、
    };
    
    I2C_v1_Object I2cObjects_[1];
    
    CSL_public_const I2C_CONFIG_list I2C_CONFIG_={
    
    &I2C_v1_FxnTable、
    I2c 对象_[0]、
    &i2cInitCfg_[0]
    }、
    };
    
    
    void i2c_open()
    {
    if (NULL == handle){
    log_print0 (Diags_entry | Diags_info、"->I2C_init");
    /*由于 IPU (M4)中的位段功能,应替换 I2C_open,*/
    /*I2C_init();*/
    I2C_CONFIG_[0].fxnTablePtr->initFxn ((I2C_Handle)&(I2C_CONFIG_[0]));
    
    I2C_Params_init (&i2cParams);
    i2cParams.bitrate = I2C_400kHz;
    
    句柄=(I2C_Handle)&(I2C_CONFIG_[0]);
    
    /*由于 IPU (M4)中的位段功能,应替换 I2C_open,*/
    /*handle = I2C_open (I2C_instance、&i2cParams);*/
    
    memcpy (&i2c_cfg_test、handle->hwAttrs、sizeof (I2C_HwAttrs));
    log_Print1 (Diags_entry | Diags_info、"->I2C baseAddr modified:0x%x"、i2c_cfg_test.baseAddr);
    
    handle->fxnTablePtr ->openFxn (handle、&i2cParams);
    }
    } 

    在使用此固件运行 Linux 之前、我修改了 DTS 文件以禁用 i2c3实例:

    i2c3{(&I)
    -状态="正常";
    + STATUS ="禁用";
    };

    我假设 i2c3在 uboot 上激活。

    然后、我在启动期间遇到此崩溃:

    e2e.ti.com/.../2746.log.txt

    我们正在使用 Phytec 的 SOM 模块、但我们在 TI 提供的 EVM 上已经完成了一些类似的经验。

    您能给我建议如何从 IPU1控制 i2c 外设吗?

    此致、

    François μ A

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

    从您提到的线程中可以看到、关键点是在从 Linux 加载 M4映像时在应用程序/库中添加地址映射(通常是添加0x20000000)。

    您可以使用基本 GPIO 示例从 TI EVM 开始、然后验证它在 SOM 模块上是否仍然有效、以确认使用 pimux 重建的 ti.board.aem4不会中断任何操作。 您不应只看到 Board_init()发生任何崩溃。

    然后从 PDK 转到 I2C 示例、您将需要覆盖需要地址映射的字段的 i2cInitCfg 结构、例如 CSL_IPU_I2C1_regs、然后再使用它们、同样、您也可以在 SOM 模块上尝试相同的结构。

    您发布的日志显示了在 DSP 而不是 IPU 中发生的崩溃。 DSP 资源表中没有地址偏移量。
    remoteproc 2:在40800000中检测到崩溃。dsp:类型 mmmufault

    此致、Garrett
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    目前、此处提供了使用 PDK UART LLD 和 IPC 创建 IPU 固件的说明、以使用 Remoteproc 加载:
    processors.wiki.ti.com/.../Linux_IPC_on_AM57xx

    您可以使用 I2C 示例并以 I2C LLD 示例作为起点来执行同样的操作。

    此致、
    Rahul
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    I2C_HwAttrs i2cInitCfg_[1]=
    {
    
    /*(CSL_IPU_I2C3_regs%L4_PERIPS_L4PER1)+ IPU_PERIPS_L4PER1、*/
    (CSL_IPU_I2C3_regs + 0x20000000)、
    43、
    87、
    CSL_I2C_2_MODULE_FREQ、
    对、
    {
    0x72、0x0、0x0、0x0
    }、
    }、
    };
    
    I2C_v1_Object I2cObjects_[1];
    
    CSL_public_const I2C_CONFIG_list I2C_CONFIG_={
    
    &I2C_v1_FxnTable、
    I2c 对象_[0]、
    &i2cInitCfg_[0]
    }、
    };
    
    void i2c_open()
    {
    if (NULL == handle){
    log_print0 (Diags_entry | Diags_info、"->I2C_init");
    /*由于 IPU (M4)中的位段功能,应替换 I2C_open,*/
    /*I2C_init();*/
    I2C_CONFIG_[0].fxnTablePtr->initFxn ((I2C_Handle)&(I2C_CONFIG_[0]));
    
    I2C_Params_init (&i2cParams);
    i2cParams.bitrate = I2C_400kHz;
    
    句柄=(I2C_Handle)&(I2C_CONFIG_[0]);
    
    /*由于 IPU (M4)中的位段功能,应替换 I2C_open,*/
    /*handle = I2C_open (I2C_instance、&i2cParams);*/
    
    memcpy (&i2c_cfg_test、handle->hwAttrs、sizeof (I2C_HwAttrs));
    log_Print1 (Diags_entry | Diags_info、"->I2C baseAddr modified:0x%x"、i2c_cfg_test.baseAddr);
    
    handle->fxnTablePtr ->openFxn (handle、&i2cParams);
    }
    } 

    当我调用此 i2c_open 函数时、我重拨了基址、但固件仍会崩溃。

    [10.007062]警告:CPU:0 PID:1 at /home/francois/workspace/yocto/build/arago-tmp-external-linaro-toolchain/work-shared/am57xx-phycore-rdk/kernel-)
    [10.007066] 44000000.OCP:L3自定义错误:主 IPU1目标 L4_PER1_P3 (读取):在功能访问期间以用户模式进行数据访问
    [10.007113]链接的模块:virtio_rpmsg_bus (+) ECB SHA512_generic SHA512_arm SHA256_generic HMAC MD5 SHA1_generic SHA1_arm_NEON SHA1_arm omap_aesl
    [10.007119] CPU:0 PID:1 Comm:systemd 被污染:G O 4.4.32 #1
    [10.007121]硬件名称:通用 DRA74X (平展器件树)

    我不认为我应该使用此更新:

    cSL_l4per_cm_core_componentRegs * l4PerCmReg =
    (cSL_l4per_cm_core_componentRegs *) 0x6a009700;/CSL_MPU_L4PER_CM_CORE_regs; 

    因为它仅用于  Board_init 的 Board_moduleClockInit 调用、我们不需要初始化板、因为它已经由 Linux 完成...

    感谢您的回答和致以最诚挚的问候、

    François μ A

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

    [引用 user="user4902492"]

    我不认为我应该使用此更新:

    cSL_l4per_cm_core_componentRegs * l4PerCmReg =
    (cSL_l4per_cm_core_componentRegs *) 0x6a009700;/CSL_MPU_L4PER_CM_CORE_regs; 

    因为它仅用于  Board_init 的 Board_moduleClockInit 调用、我们不需要初始化板、因为它已经由 Linux 完成...

    [/报价]

    在 UART LLD 示例中需要执行此操作、因为我们在 Linux 器件树中禁用了 UART3。 这会导致 PRCM 寄存器中的 UART3实例断电、因此我们必须使用该代码启用 UART。  

    请确保在 ARM Linux 中 使用器件树禁用 I2C 实例、以便 IPU 可以使用该实例。

    http://processors.wiki.ti.com/index.php/Linux_IPC_on_AM57xx#Update_Linux_Kernel_device_tree_to_remove_UART_that_will_be_controlled_by_M4。

    您可以在 i2c_open 之前放置以下代码

    volatile int exitSpinLock = 0;
    while (exitSpinLock = 0){} 

    加载固件后连接到 IPU、将 exitSpinLock 更改为1、并找到导致 i2c_open 内崩溃的代码行。

    此致、

    Rahul

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

    您好、Rahul、

    感谢您的帮助,它现在就能正常工作!!! 我刚刚禁用了 dtsi 文件上的 i2c3:

    i2c3{(&I)
       STATUS ="禁用";
       TI、空闲;
       pinctrl-names ="default"、"sleep";
       pinctrl-0 =<&i2c3_PINS_DEFAULT>;
       pinctrl-1 =<&i2c3_PINs_sleep>;
       时钟频率=<400000>;
    };

    您是否知道为什么只有在以下情况下才会更新跟踪上的命令 tail:

    ~#tail -f /sys/kernel/debug/remoteproc/remoteproc0/trace

    谢谢、此致、

    François μ A

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

    Francois、

    感谢您的更新、我很高兴您能使用此更新来完成您的设置。

    关于 remoteproc 跟踪、我与 remoteproc 开发人员进行了检查、他提到、remoteproc 跟踪是使用循环缓冲区实现的、因此当循环缓冲区绕过跟踪时、可能会影响尾部日志。 此外、tail 命令仅显示出现在日志中的最后几个跟踪日志、而不是完整日志、因此如果固件在 IPU 上加载并运行后有更多条目、则不会看到这些日志。 我们建议使用 dmesg 或 cat 来查看轨迹、而不是尾部。 我们将了解这种尾灯行为、并告诉您是否可以改进。

    您能否将此问题标记为已解决、以便我们可以在跟踪中解决此问题。

    此致、
    Rahul