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.

[参考译文] RTOS/AM5728:I2C、存储器映射、来自 IPU 的中断

Guru**** 2618835 points

Other Parts Discussed in Thread: SYSBIOS, AM5728

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/650125/rtos-am5728-i2c-memory-mapping-interrupts-from-ipu

器件型号:AM5728
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

您好!

我在 A15内核上引导 Linux、IPU 和 DSP 都运行 SYSBIOS。 所有内核使用 IPC MessageQueue 进行通信、CMEM 用作共享存储器。

现在、我想将 IPU 用于一些 I2C 访问(也计划了 UART、GPIO)。

关于议会联盟,我解决了以下问题:

-接口时钟未激活。 我手动执行它:*((uint32_t*) 0x6a0097b0)=2;这可能不是推荐的方法 、最好使用 XDC 配置文件中的某些行来完成。 我修改了 Linux 器件树、使 Linux 不使用 I2C 实例。

->如何在 SYSBIOS 中激活接口时钟?

—M4上的位带区使用与 L3上的外设相同的位置。 IOMMU 将0x6800.0000重新映射到0x48000.000、因此 I2C 器件显示在0x6806.0000 (phys 0x4806.0000)。 SYSBIOS 仍在0x4806.0000处查找它。 这是我的权变措施:

   I2C_HwAttrs  i2c_attributes;
   I2C_socGetInitCfg (DI2C_bus、&i2c_attributes);
   I2C_attributes.baseAddr=0x68060000;
   I2C_socSetInitCfg (DI2C_bus、&i2c_attributes);
尽管我已经将 OSAL 和 CSL 的 socType 设置为"am572x"。

->如何告知 SYSBIOS 所用外设的正确地址?

下一步是为 IPU 使用硬件中断。

->如果 A15正在运行 Linux、是否有一个如何使用它们的示例?

在 DSP 上使用 VPDMA 也是一个好处、但我担心神秘的 xdctools 配置。

我针对不同的用例测试了一些示例、但将 xs 配置文件正确用于混合用例并不容易。  是否有办法让 xs/xdctools 专家查看我的 DSP 和 IPU 配置文件?

此致、

环路2.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好。
    这用于在 SYSBIOS 中启用 I2C3时钟:

    CSL_FINST (l4PerCmReg -> CM_L4PER_I2C3_CLKCTRL_REG、
    L4PER_CM_CORE_COMPONENT_CM_L4PER_I2C3_CLKCTRL_REG_MODULEMODE、ENABLE);

    while (CSL_L4PER_CM_CORE_COMPONENT_CM_L4PER_I2C3_CLKCTRL_REG_IDLEST_FUNC!=
    CSL_FEXT (l4PerCmReg -> CM_L4PER_I2C3_CLKCTRL_REG、
    L4PER_CM_CORE_COMPONENT_CM_L4PER_I2C3_CLKCTRL_REG_IDLEST);

    这用于启用 I2C5时钟:

    CSL_IPU_cm_core_aonRegs * ipuCmReg =
    (CSL_IPU_cm_core_aonRegs *) CSL_MPU_IPU_CM_core_AON_regs;

    ipuCmReg -> CM_IPU_I2C5_CLKCTRL_REG =(ipuCmReg -> CM_IPU_I2C5_CLKCTRL_REG &~CSL_IPU_CM_CORE_AON_CM_IPU_I2C5_CLKCTRL_REG_IDLEST_MASK)|
    (CSL_IPU_CM_CORE_AON_CM_IPU_I2C5_CLKCTRL_REG_IDLEST_FUNC | CSL_IPU_CM_CORE_AON_CM_IPU_I2C5_CLKCTRL_REG_MODULEMODE_ENABLE);

    while (ipuCmReg ->CM_IPU_I2C5_CLKCTRL_REG!=(CSL_IPU_CM_CORE_AON_CM_IPU_I2C5_CLKCTRL_IDLEST_FUNC | CSL_IPU_CM_CORE_ACC5_IPU_I2ON_CLKLEDE_MODE_MOUNC_ENABLE);

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

    您能否上传 DSP 和 M4的配置文件以便我们了解一下? 对于地址映射(例如0x4806_0000至0x6806_0000)、有一个资源表用于: processors.wiki.ti.com/.../IPC_Resource_customTable

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

    在我们等待您的 cfg 文件时、我想确保您已在 AM57xx 上的 Linux IPC 上看到此 wiki 页面:

    processors.wiki.ti.com/.../Linux_IPC_on_AM57xx

    此致、
    Sahin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    位段只是一种无需读-修改-写过程即可修改寄存器某些位的方法、但寄存器始终映射到数据表中报告的地址。 只有寄存器中的位才会按照以下公式重新映射:
    bit_word_offset =(byte_offset x 32)+(bit_number×4)
    bit_word_addr = bit_band _base + bit_word_offset
    如以下链接所述: infocenter.arm.com/.../index.jsp
    但位段不会阻止以规范的方式访问寄存器:因此,在适用于 M4的 Sitara SDK 示例中的 cfg 文件中,您可以找到:
    /*大页*/
    Ammu.largePages [0].pageEnabled = Ammu.Enable_Yes;
    Ammu.largePages [0].logicalAddress = 0x40000000;
    Ammu.largePages [0]。translatedAddress = 0x40000000;

    和更高版本:

    Ammu.largePages [3].pageEnabled = Ammu.Enable_Yes;
    Ammu.largePages [3].logicalAddress = 0x60000000;
    Ammu.largePages [3].translatedAddress = 0x40000000;


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

    您好!


    请找到 IPU 的配置文件随附在此帖子中。

    它们基于 IT 提供的 IPC ex_02 / ex_41示例。 我让 IPC 在 A15 (Linux)和 DSP 以及 IPU (两者都是 SYSBIOS)之间工作。

    我的另一个中描述的问题是由 A15/DSP/M4上不同大小的枚举导致的(sizeof (enum)在 M4上为1)。 这一问题已经解决。


    我尝试扩展工作设置(大约为 EX_41并添加了 CMEM)以使用 PDK 驱动程序、因为我希望 M4使用 I2C、GPIO 和中断。

    我为 am5728添加并配置了 CSL 和 OSAL (根据我得到的情况)以使用 PDK 驱动程序、但 M4映射(如上面所述的 Enzo)仍然不正确。


    我不清楚哪些构建过程部分会受到 xs/xdctools 的影响: 我知道它会生成链接器文件并为配置的设置生成大量代码、但我不清楚哪些器件需要配置、哪些器件受某些标志/设置的影响(或如何调用)。 生成的输出量太大、无法通过试错来检查。

    如果有替代 xs/xdctools/rtsc 的选项、我很乐意尝试一下。

    从 Linux 方面:是否应该设置硬件的电源和时钟域? 还是应该在 SYSBIOS 端完成该操作?

    此致、

    环路2.

    附录:e2e 论坛不允许我附加 cfg、%ld 或 xs 文件。

    e2e.ti.com/.../e2e_5F00_temp.tar.gz

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

    我们现在来看看您的文件。

    此外、我不小心按下了"TI 认为已解决"按钮、您可以单击"否"将其删除吗?

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

    您好!

    我查看了您的资源表和.cfg 文件、我不确定问题与 XDC 或 SYSBIOS 相关的原因。 如果要访问 M4中的 I2C 和 GPIO 驱动程序、则需要在资源表中为它们添加条目。 下面是我们希望访问 M4上的 PCIe 的示例:

    #define PCIe_SS1_CFG_regs      0x51000000
    #define PCIe_SS1_CFG_regs_virt (PCIe_SS1_CFG_regs + 0x20000000)

      {
           TYPE_DEVMEM、
           PCIe_SS1_CFG_regs_virt、PCIe_SS1_CFG_regs、
           SZ_1M、0、0、"PCIe_SS1_CFG_regs"、
       }、
     

    然后在 IPU.cfg 中,我们有:

    /*加载并使用 PCIe 软件包*/
    var socType ="am572x";
    VAR PCIe = XDC.loadPackage ('ti.drv.PCIe');

    我相信 I2C、GPIO 等也是如此 请告诉我这是否对您有效、或者问题是由 XDC 引起的。

    此致、Eric

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

    尊敬的 Eric:

    我已将以下行添加到 RSC_TABLE .h 中:

    #define I2C_CFG_regs           0x48060000
    #define I2C_CFG_regs_virt      (I2C_CFG_regs + 0x20000000)

       {
           TYPE_DEVMEM、
           I2C_CFG_regs_virt、I2C_CFG_regs、
           SZ_1M、0、0、"I2C_regs"、
       }、

    我已经搜索并处理了_CFG_regs 等字符串、但在文档或源代码中找不到任何字符串、因此我假设仅在本地使用、文件本身的命名应该一致、但在外部不引用、对吧?

    访问仍会导致中止:

    [0][0.000]     [t=0x00206aef] xdc.runtime.Main:等待队列 IPU_control 上的消息
    [0][27.129]    [t=0x00000002:94cbd331] ti.sysbios.family.arm.m3/hwi:错误:第1104行:e_hardFault:for
    保护所有人免遭强迫
    [0][27.129]    ti.sysbios.family.arm.m3.hwi:第1104行:e_hardFault:Forced
    [0][27.129]    [t=0x00000002:94ced23b] ti.sysbios.family.arm3.Hwi:错误:第1181行:e_busFault:精密
    ISERR:立即总线故障、确切地址为:480600a4
    [0][27.129]    ti.sysbios.family.arm.m3/h[70.886823]  virtio_rpmsg_bus virtio0:收到 MSG、但没有
    收件人
    WI:第1181行:E_busFault:PRECISERR:Immediate Bus Fault,Exact addr Known,地址:480600a4
    [0][27.129]    在 PC = 0x00024a9c 的后台线程中发生异常。
    [0][27.129]    内核0:ThreadType_Task 中发生异常。
    [0][27.129]    任务名称:SIPUtask、句柄:0x80060300。
    [0][27.129]    任务堆栈基地址:0x80060350。
    [0][27.129]    任务堆栈大小:0x1000。
    [0][27.129]    R0 = 0x48060000 R8 = 0x00000000
    [0][27.129]    R1 = 0x00021e65 R9 = 0x00000001
    [0][27.129]    R2 = 0x00000008 R10 = 0x0001551c
    [0][27.129]    R3 = 0x00000000 R11 = 0xffffffff
    [0][27.129]    R4 = 0x8006c8a8 R12 = 0x800611a0
    [0][27.129]    R5 = 0x8006c67c SP (R13)= 0x80061280
    [0][27.129]    R6 = 0x8006dc14 LR (R14)= 0x000154bf
    [0][27.129]    R7 = 0x00029858 PC (R15)= 0x00024a9c
    [0][27.129]    PSR = 0x81000000
    [0][27.129]    ICSR = 0x00438803
    [0][27.129]    MMFSR = 0x00
    [0][27.129]    BFSR = 0x82
    [0][27.129]    UFSR = 0x0000
    [0][27.129]    HFSR = 0x40000000
    [0][27.129]    DFSR = 0x00000000
    [0][27.129]    MMAR = 0x480600a4
    [0][27.129]    BFAR = 0x480600a4
    [0][27.129]    AFSR = 0x00000000
    [0][27.129]    正在终止执行

    这是 M4上的 C 代码、不强制使用地址:

       I2C_HwAttrs  i2c_attributes;
       I2C_socGetInitCfg (DI2C_bus、&i2c_attributes);
       shst_slLog (3、"i2c_attributes.baseAddr=0x%x"、i2c_attributes.baseAddr);

       I2C_init();
       I2C_Params_init (&i2cParams);
       i2cParams.transferMode = I2C_MODE_BLOCKING;
       i2cHandle = I2C_open (DI2C_BUS、&i2cParams);

    I2C 访问代码:

       I2C_TransactionInit(&i2cTransaction);
       i2cTransaction.masterMode = true;
       i2cTransaction.slaveAddress = ucSlaveId;
       i2cTransaction.writeBuf =空;
       i2cTransaction.writeCount = 0;
       i2cTransaction.readBuf = pucData;
       i2cTransaction.ReadCount = ucSizeData;
       i2cTransaction.timeout  = 2000;
       RetVal = I2C_transfer (i2cHandle、&i2cTransaction);

    日志报告:I2C_attributes.baseAddr=0x48060000

    因此地址正确、但映射仍然不正确。

    您能否提供如何在 M4上使用 PDK I2C 驱动程序的示例代码?

    此致、

    环路2.

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

    我当前的解决方法是:
    I2C_HwAttrs i2c_attributes;
    I2C_socGetInitCfg (DI2C_bus、&i2c_attributes);
    shst_slLog (3、"i2c_attributes.baseAddr=0x%x"、i2c_attributes.baseAddr);
    I2C_attributes.baseAddr=0x68060000;
    I2C_socSetInitCfg (DI2C_bus、&i2c_attributes);

    我强制 SYSBIOS PDK 驱动程序使用偏移量为0x20000000的映射访问。
    在 Linux 端、我设置 GPIO 并在 M4代码开始之前启用 I2C 总线3的接口时钟。
    工作原理:M4读取数据并记录数据。
    因此、我的硬件正常、这只是一个在映射被纠正之前的权变措施。

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

    为了使用 PDK CSL、我需要修复我的存储器映射。 我使用 IPC 示例进行了开发、因此我的 IPU Ammu 配置如下所示:

    TI-processor-sdk-rtos-am57xx-evm-04.01.00.06/IPC_3_46_02_04/examples/DRA7XX_Linux_elf/ex02_MessageQ/ipu1/IpuAmmu.cfg

    根本不映射区域0x4000_0000。

    由于某些外设控件位于0x4a00_0000以上、我想添加一个将0x4000_0000 (逻辑)映射到0x4000_0000 (物理)的转换、最好是一个媒体页类型条目来映射整个块。

    CSL 假设每个外设在其 L3地址可用、因此 I2C IO 多路复用器位于:0x4A003774 / 8、GPIO 中断位于:0x4a00362c、I2C 时钟位于:0x4a0097b0。

    我尝试添加一个中等大小的页面:
    Ammu.mediumPages [1].pageEnabled = Ammu.Enable_Yes;
    Ammu.mediumPages [1].logicalAddress = 0x4A000000;
    Ammu.mediumPages [1].translatedAddress = 0x4A000000;
    Ammu.mediumPages [1].平 方已启用= Ammu.Enable_Yes;
    Ammu.mediumPages [1].size = Ammu.Medium_256K;
    Ammu.mediumPages [1].L1_cacheable = Ammu.cachepolicy_cacheable;
    Ammu.mediumPages [1].L1_posted= Ammu.PostedPolicy_posted;

    但这完全打破了 IPC。

    如何为 IPU 的地址0x4A00_0000执行1:1映射、以便可以使用 CSL?

    XS 生成大量文件。 其中的某个位置是否有存储器映射?

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

    一些其他信息:

    原因是调用了 GPIO_init();我在0x48053130上得到了精确的中止。
    我可以使用 IpuAmmu.cfg "打孔":

    Ammu.smallPages [9].pageEnabled = Ammu.Enable_Yes;
    Ammu.smallPages [9].logicalAddress = 0x48050000;
    Ammu.smallPages [9]。translatedAddress = 0x48050000;
    Ammu.smallPages [9].平 方已启用= Ammu.Enable_Yes;
    Ammu.smallPages [9].size = Ammu.small_4K;

    但显然、我仅限于10个条目(对于小页)。
    IPC 中断、具体取决于我尝试映射的地址。

    IPC 使用哪些地址范围?

    如何添加更多条目?

    网址为 processors.wiki.ti.com/.../Linux_IPC_on_AM57xx

    所有 IO 地址从0x4...映射 (PHY)到0x6…… (逻辑)。 虽然这是有效的、但我想使用它、CSL 引用0x4....上的外设

    如何告知 CSL 使用0x6…… 而不是0x4...?

    然后、我可以使用 IPC 默认的 IpuAmmu.cfg 存储器映射。 看一下这些来源、它看起来是硬编码的。


    此致、

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

    这些 IPC 地址实际上是可配置的、您可以通过写入 ti.sdo.ipc.family.vayu.InterruptIPu 模块中的 mailboxBaseAddr[]数组来覆盖它们。

    有关更多详细信息、请参阅以下 wiki。
    processors.wiki.ti.com/.../IPC_3.x_FAQ