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.

[参考译文] TMDS62LEVM:请求获得一个函数、该函数将传入焊球名称并返回一个包含信号名称、GPIO 基地址、GPIO 引脚编号的结构体

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1486293/tmds62levm-request-to-have-a-function-that-will-pass-in-ball-name-and-return-a-struct-that-contains-signal-name-gpio-base-address-gpio-pin-number

器件型号:TMDS62LEVM
主题中讨论的其他器件:AM62L

工具/软件:

您好、

作为一个硬件验证团队、我们希望能够 根据 焊球名称而不是来自用户输入的信号名称(UART 的 char*类型)来初始化 GPIO。 对于 AM62L RTOS SDK、TI 能否为此类目的提供一项功能?

以下是一些想法:

结构 GPIO_INFO_t

    uint32_t  SIGNAL_NAME;

    uint32_t baseAddr;
    uint32_t pinNum;

GPIO_INFO_t;

下面是我们的独立 GPIO_Init()函数和 GPIO_output()函数

void gpio_Init(int16_t signal_name, uint32_t pin_mux_mode, uint32_t pin_settings, uint32_t domainId)
{
    Pinmux_PerCfg_t pin_config[] = 
    {
        {signal_name, (PIN_MODE(pin_mux_mode) | pin_settings) },
        {PINMUX_END, 0U}
    };

    Pinmux_config(pin_config, domainId);
}

void gpio_SetOutput(uint32_t baseAddr, uint32_t pinNum, uint32_t pinState)
{
    GPIO_setDirMode(baseAddr, pinNum, GPIO_DIRECTION_OUTPUT);

    if(pinState == 1)
    {
        GPIO_pinWriteHigh(baseAddr, pinNum);
    }

    else
    {
        GPIO_pinWriteLow(baseAddr, pinNum);
    }
}

例如、 要将信号 MMC0_CLK (B2)设置为高电平、代码流程为

struct gpio_info_t   gpio_info;

gpio_info = gpio_FindGpioInfo("B2");

gpio_Init(gpio_info.signal_name, x, x, x);

gpio_SetOutput(gpio_info.baseAddr, gpio_info.pinNum, x);

由于设计仍在进行中、因此我们目前无法提供引脚分配。 但为了实现灵活性、我们希望涵盖尽可能多的引脚。

谢谢您、
Dazong

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

    您好、Dazong、

    我做的分析你的要求.

    您可能会得到 EOD 的回复。

    此致、

    Anil.

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

    您好、Dazong、

    下面介绍的查找表方法应满足您的要求。

    请查看该方法、并告知我其是否与您的用例一致、或者是否需要进行任何修改。

    以下方法概述:

    •使用此方法、您可以将焊球名称作为输入传递给 GET_GPIO_INFO () API。
    •该函数随后会搜索 GPIO_MAP 用于确定焊球名称是否存在的查找表。
    •如果找到匹配项、您可以检索所有相关的引脚详细信息、包括
     引脚编号、Padcfg 寄存器地址 、域 ID、GPIO 基址和引脚多路复用器设置。

    主要注意事项:

    •所需的唯一手动操作是填充 GPIO_MAP 设置一次查找表。
    •在 AM62L SoC 上、每个引脚可以在多种功能模式下运行、例如 UART、GPIO、I2C、SPI 等
    •由于每个引脚最多支持8种不同的多路复用模式、因此为多路复用模式缓冲器分配了8字节大小、以适应所有可能的配置。

    后续步骤

    请查看此方法并告诉我:
    •该方法是否适用于您的用例?
    •您是否需要任何其他修改或增强功能?

    注释 :我还没有测试这个代码,但我已经做了必要的更改基于分析。 如果您遇到任何问题、我们可以进一步改进。

    期待您的反馈。

    typedef struct
    {
    int8_t ball_name[5];         // Ball name (e.g., "B2")
    int32_t padcfg_offset;      // Pad configuration register offset
    uint32_t baseAddr;           // GPIO base address
    uint8_t domain_Id;           // Domain ID  WKUP or MAINDOMAIN
    uint8_t pinNum;              // Pin number (0-132)
    uint8_t muxModes[8];         // Mux modes (GPIO, UART, SPI, etc.)
    uint32_t Pin_Muxsettings[8]; // Pin Mux settings
    } gpio_info;
    
    
    // Lookup table with predefined pin mappings
    gpio_info gpio_map[] =
    {
      {"D6", 0x4238, 0x600000UL, 0x00, 123, {0U,1U,2U,3U,4U,5U,6U,7U}, {0U,1U,2U,3U,4U,5U,6U,7U}},
      {"R23", 0x4104, 0x600000UL, 0x00, 49, {0U,1U,2U,3U,4U,5U,6U,7U}, {0U,1U,2U,3U,4U,5U,6U,7U}},
      // Add remaining pins...
    };
    
    #define TOTAL_PINS (sizeof(gpio_map) / sizeof(gpio_map[0]))
    
    
    gpio_info * get_gpio_info(const int8_t* ball_name)
    {
    
        for (uint32_t i = 0; i < TOTAL_PINS; i++)
        {
            const int8_t * stored_name = gpio_map[i].ball_name;
            uint8_t match = 1;
    
            // string comparison
            for (uint32_t j = 0; j < 5; j++)
            {
                if (ball_name[j] != stored_name[j])
                {
                    match = 0;
                    break;
                }
                if (ball_name[j] == '\0')
                {
                    break;  // Stop at null terminator
                }
            }
    
            if (match)
            {
                return (&gpio_map[i]);  // Return pointer if names match
            }
        }
        return NULL; // Return NULL if not found
    }
    
    void configure_pin(const int8_t* ball_name, uint32_t function, uint8_t enable_pullup)
    {
    
        uint8_t mux_mode;
        uint32_t pin_mux_settings;
        uint8_t domainId;
        uint32_t pin_mux_Result;
        int32_t pin_mux_offset;
        uint32_t    baseAddr;
        uint8_t    pin_num;
    
    
        Pinmux_PerCfg_t PinMuxMainDomainCfg[2];
    
        gpio_info* gpio = get_gpio_info(ball_name);
    
        if (!gpio)
        {
            DebugP_log("Error: Ball name %s not found!\n", ball_name);
            return;
        }
    
    
        if (function > 8U)
        {
            DebugP_log("Error: Function %d not supported on pin %s\n", function, ball_name);
            return;
        }
    
        mux_mode          = gpio->muxModes[function];
        pin_mux_settings  = gpio->Pin_Muxsettings[function];
        pin_mux_offset    = gpio->padcfg_offset;
        domainId          = gpio->domain_Id;
        baseAddr          = gpio->baseAddr;
        pin_num           = gpio->pinNum;
    
    
        pin_mux_Result    = mux_mode | pin_mux_settings | enable_pullup;
    
        PinMuxMainDomainCfg[0].offset = pin_mux_offset;
        PinMuxMainDomainCfg[0].settings = pin_mux_Result;
    
        PinMuxMainDomainCfg[1].offset = PINMUX_END;
        PinMuxMainDomainCfg[1].settings = PINMUX_END;
    
        Pinmux_config(PinMuxMainDomainCfg, domainId);
    
    
    
    
    }
    

    此致、

    Anil.

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

    尊敬的 Anil:

    是的、查找表是一个好主意!

     检查 GPIO 中断示例后、我们意识到还需要一个有关 intrNum 的参数

    intrNum = Board_getGpioButtonIntrNum();

    我们还希望能够同时通过小写和大写字母("B2"和"B2")

    我认为 可能不需要 muxModes[8]和 mux[8]、因为所有引脚都有8种引脚模式、无论如何、我们需要查看 Pin_Muxsettings doc 以了解每个引脚是什么。

    如果我们可以避免查找表中的幻数、这将是很好的。

    我们认为这将满足我们的需求。

    typedef struct gpio_info_t
    {
        const char  ball_num_up_case[BALL_NAME_BUFFER_SIZE];   // Ball num uppercase (e.g., "B2")
        const char  ball_num_low_case[BALL_NAME_BUFFER_SIZE];   // Ball num lowercase (e.g., "b2")
        uint8_t     gpio_pin_num;                            // GPIO Pin number (0-132)
        int32_t     signal_name;                        // Signal name (Pad configuration register offset)
        uint32_t    int_num;                            // Interrupt source number
        uint32_t    base_addr;                          // GPIO base address
        uint8_t     domain_id;                          // Domain ID  WKUP or MAINDOMAIN
    } gpio_info_t;
    
    
    {"N19", "n19", 32, PIN_GPMC0_ADVN_ALE, CSLR_GICSS0_SPI_GPIO0_GPIO_BANK_2, CSL_GPIO0_BASE, PINMUX_DOMAIN_ID_MAIN}

    请告诉我您的想法 Slight smile

    谢谢您、

    Dazong

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

    您好、Dazong、

    上述结构似乎正常。

    如果要删除多路复用器模式设置、您需要发送有关多路复用器模式值和引脚设置的详细信息、例如基于 SOC 的输入和输出的 TX 和 RX 缓冲器启用和上拉配置。

    如果您发送这些参数、上述结构解决方案似乎很好。

    还有一件事是用于中断。 在 AM62L 中、 启用中断。 我们必须 在 GIC 级别和 GPIO 模块启用中断位。

    这是您需要处理实现的问题。 更多详细信息、请查看 GPIO 中断示例。

    AM62L SOC 可以支持   用于 GPIO 输入和输出配置的中断。

    您可以看到此用例可能用于硬件验证实现代码。

    此致、

    Anil.

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

    尊敬的 Anil:

    我们了解我们需要在 GIC 中注册中断。

    我们使 gpio_getinfo ()函数正常工作。 我想我们现在想要的是、如果 TI 能为我们填写这个表格、那么所有焊球编号都将是很好的选择。

    {"N19"、"n19"、32、PIN_GPMC0_ADVN_ALE、CSLR_GICSSG0_SPI_GPIO0_GPIO_BANK_2、 CSL_GPIO0_BASE、PINMUX_domain_ID_MAIN}

    谢谢、

    Dazong

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

    您好、Dazong、

    我了解您的要求-您需要所有引脚的查找表。 我将与我的团队成员核实、找到一种更轻松的方法来收集所有详细信息。

    还有一点:对 GPIO 使用相同的中断引脚编号。 向新引脚分配 GPIO 中断号时、请确保禁用或取消构造之前的中断设置。 这样、我们就不需要每个引脚都有唯一的中断号。

    AM62L 支持组中断功能、但最多只能将9组中断路由到 SoC、以供您参考。 更多详细信息、请参阅 TRM 中的"GPIO"一章。

    此致、

    Anil

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

    您好、Dazong、

    在内部、我与硬件团队核实了提供引脚详细信息的任何其他方法。

    我们需要用引脚详细信息填写查找表,这应该只填写数据表 ,而不可能用任何其他方法。

    您能否按照上述方法检查数据表并将所有详细信息添加到查找表中?

    如果您遇到任何问题、我可以在这里提供帮助、并尝试提供快速支持。

    此致、

    Anil.

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

    尊敬的 Anil:

    是的、我们可以自己填充整个表格。 我将保持 TT 打开状态、直到我们完成表格、

    谢谢、

    Dazong

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

    您好、Dazong、

    当然没问题。

    我不是关闭这个线程,也从我的一边...

    此致、

    Anil.

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

    您好、Dazong、

    来自大宗和团队的问题是 :    如果我们在重新构造之前没有析构、GPIO 中会出现什么冲突?

    如果为同一 GPIO 组中的多个引脚启用中断、则不会有任何问题-硬件设计为支持这种功能。 然而、会出现一些软件级的挑战、尤其是在回调处理方面:


    1.共享组中断:
    •一个组中的所有16个 GPIO 引脚共享同一组中断线路。
    •因此、任何引脚中断都将触发同一 ISR。


    2.所有引脚的相同回调:
    •如果为所有16个引脚注册一个通用回调、在该回调中、您需要:
    •读取 GPIO 中断状态寄存器。
    •确定哪个(些)引脚触发了中断。
    •相应地处理每一个。


    3.每个 Pin 图的不同回调:
    •如果您尝试为每个引脚注册不同的回调、并且驱动程序仅支持每个组一个回调、则:
    •上次注册的回调将覆盖之前的所有回调。
    •只有在发生组中断时才会调用最后一个回调。
    •这意味着所有其他回调都将丢失、如果预计每个引脚的行为、这可能会出现问题。


    4、设计含义:
    •要支持每个引脚的不同回调、软件层必须实施调度器:
    •组 ISR 读取中断状态位。
    •将调用分派给相应的每针注册处理程序。

    因此、真正的"冲突"不是与硬件相关的、而是在软件设计中—尤其是在回调注册和 ISR 调度方面。

    此致、

    Anil.

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

    Anil、我们对这些问题没有太担心、因为我们只需要测试几个引脚即可确保中断正常工作。  但是、我在不调用 deinit 函数的情况下测试了在同一组中初始化多个引脚、如下所示: https://software-dl.ti.com/mcu-plus-sdk/esd/AM62LX/11_00_00_05/exports/docs/api_guide_am62lx/DRIVERS_GPIO_PAGE.html。  在我的测试中、我看到最近被调用的任何引脚都将调用中断、但过去的引脚都不会调用。  这在 SDK 中使用的函数基本上与该链路中的函数相同。  这是预料之中的吗?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在我的测试中、我看到最近调用的任何引脚都将调用中断、但过去的引脚不会调用。  这在 SDK 中使用的函数基本上与该链路中的函数相同。  这是预料之中的吗?  [/报价]

    您好、Brody、

    是的、您看到的行为是预期行为、并且与共享组中断的典型工作原理保持一致。

    请参阅下面的我的意见。

    •如果您尝试注册每个 PIN 的不同回调、并且驱动程序仅支持每个银行一个回调、则:
    •上次注册的回调将覆盖之前的所有回调。
    •只有在发生组中断时才会调用最后一个回调。
    •这意味着所有其他回调都将丢失、如果您期望每个引脚的行为、则可能会出现问题。

    当您没有取消注册先前的引脚中断、然后使用同一组中断注册另一个引脚中断时、会发生以下情况:
    •前一个回调被覆盖。
    •ISR 只保留并调用最新的回调。
    •因此、较早的特定于引脚的回调将丢失。

    您的期望是什么?

    您希望系统保留所有先前注册的 PIN 回调、并根据哪个 PIN 导致中断来调用正确的 PIN 回调。

    推荐的方法:组中断调度

    以下是实现这一目标的方法:
    1.不要单独为每个引脚分配相同的组 ISR。
    2.为存储体实施单个 ISR、该存储体:
    •读取中断状态寄存器以确定哪个(些)引脚触发了中断。
    •检查是否为每个引脚启用了中断。
    •调用为该特定引脚注册的正确回调函数。

    这样:
    •您可以为每个引脚注册单独的回调。
    •之前注册的回调都不会丢失。
    •系统高效处理来自同一组的多个引脚中断。

    如果您需要有关此实现的任何帮助、请告诉我、我希望根据您的意见、您希望在同一组中断中也通过新配置的引脚触发对旧引脚的回调。

    此致、

    Anil.

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

    嘿 Anil、  

    我能够实现您推荐的目标。  我做的一件事是为每个银行创建一个类似的 HwiP_Objects 数组

    HwiP_Object       gGpioHwiObject[GPIO_MAX_BANK]

    然后、在中断处理程序中、我读取中断状态寄存器以确定哪个(些)引脚触发了中断。 我能够报告组和引脚信息。  我还将 deinit 分成引脚、并以串行方式存储中断、因此  

    使用以下命令来取消初始化组中断:  
      GPIO_bankIntrDisable (CSL_GPIO0_BASE、BANK_num);
      HwiP_析 构(&gGpioHwiObject[bank_num]);
    并使用以下命令来取消初始化引脚中断:  
      GPIO_setTrigType (CSL_GPIO0_BASE、GPIO_PIN->PIN_Num、GPIO_TRIG_TYPE_NONE);
      GPIO_clearIntrStatus (CSL_GPIO0_BASE、GPIO_pin->pin_num);

    我分开了它们、以便可以取消初始化引脚、而不影响同一组中的其他 GPIO。   

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

    您好、Brody、

    您能否在此处确认您的要求?

    您是否希望旧的 GPIO 引脚中断即使在配置新的 GPIO 引脚中断后也能继续工作?


    是否希望在配置新 GPIO 引脚时完全禁用旧的 GPIO 中断?

    基于您使用的当前顺序:

    这将禁用旧的 GPIO 中断、只有新 GPIO 引脚的中断将处于活动状态并被触发、如果您打算完全处理新的 GPIO 中断、这看起来是正确的。

       HwiP_析 构(&gGpioHwiObject[bank_num]);

       GPIO_setTrigType (CSL_GPIO0_BASE、 GPIO_PIN->PIN_Num、GPIO_TRIG_TYPE_NONE);
       GPIO_clearIntrStatus (CSL_GPIO0_BASE、 GPIO_pin->pin_num);

    此致、

    Anil.