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.

[参考译文] TDA4AL-Q1:如何在视觉应用中控制 GPIO?

Guru**** 2465890 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1472853/tda4al-q1-how-do-i-control-gpios-in-vision-app

器件型号:TDA4AL-Q1

工具与软件:

您好、TI 专家:

我要将 我们定制电路板的一些引脚定义修改为 MAIN_GPIO0、这些引脚将作为摄像头控制、用于视觉应用的电源序列。

谢谢、请帮助我检查如何控制这些 GPIO 并检查设置是否正确。

首先、我将 GPIO 定义添加到 k3-am68-sk-base-board.dts

rpi_header_gpio0_pins_default: rpi-header-gpio0-default-pins {
	pinctrl-single,pins = <
        ...
		J721S2_IOPAD(0x068, PIN_INPUT, 7) /* (U28) MCAN0_RX.GPIO0_26, Camera0_RST, for cam 0 start */
		J721S2_IOPAD(0x06c, PIN_INPUT, 7) /* (V26) MCAN1_TX.GPIO0_27, Camera0_COMREADY */
		J721S2_IOPAD(0x070, PIN_INPUT, 7) /* (R27) MCAN1_RX.GPIO0_28, Camera0_ERRO */
		J721S2_IOPAD(0x074, PIN_INPUT, 7) /* (R28) MCAN2_TX.GPIO0_29, Camera0_TRIGGER */
		J721S2_IOPAD(0x0d8, PIN_INPUT, 7) /* (AG26) SPI0_D0.GPIO0_54, CAM_PWR_EN, */
		J721S2_IOPAD(0x0dc, PIN_INPUT, 7) /* (AH26) SPI0_D1.GPIO0_55, CAM1_LS_EN, for cam 0 end */
	>;
};

其次、我将 GPIO 定义添加到 J721S2_pinmux_data.c

static pinmuxPerCfg_t gGpio0PinCfg[] =
{
    /* MyGPIO0 -> GPIO0_26 -> U28, Camera0_RST, for cam 0 start */
    {
        PIN_MCAN0_RX, PIN_MODE(7) | \
        ((PIN_PULL_DISABLE | PIN_INPUT_ENABLE) & (~PIN_PULL_DIRECTION))
    },
    /* MyGPIO0 -> GPIO0_27 -> V26, Camera0_COMREADY */
    {
        PIN_MCAN1_TX, PIN_MODE(7) | \
        ((PIN_PULL_DISABLE | PIN_INPUT_ENABLE) & (~PIN_PULL_DIRECTION))
    },
    /* MyGPIO0 -> GPIO0_28 -> R27, Camera0_ERRO */
    {
        PIN_MCAN1_RX, PIN_MODE(7) | \
        ((PIN_PULL_DISABLE | PIN_INPUT_ENABLE) & (~PIN_PULL_DIRECTION))
    },
    /* MyGPIO0 -> GPIO0_29 -> R28, Camera0_TRIGGER */
    {
        PIN_MCAN2_TX, PIN_MODE(7) | \
        ((PIN_PULL_DISABLE | PIN_INPUT_ENABLE) & (~PIN_PULL_DIRECTION))
    },
    /* MyGPIO0 -> GPIO0_54 -> AG26, CAM_PWR_EN */
    {
        PIN_SPI0_D0, PIN_MODE(7) | \
        ((PIN_PULL_DISABLE | PIN_INPUT_ENABLE) & (~PIN_PULL_DIRECTION))
    },
    /* MyGPIO0 -> GPIO0_55 -> AH26, CAM1_LS_EN, for cam 0 end */
    {
        PIN_SPI0_D1, PIN_MODE(7) | \
        ((PIN_PULL_DISABLE | PIN_INPUT_ENABLE) & (~PIN_PULL_DIRECTION))
    },
    {PINMUX_END}
};

第三、检查 k3-j721s2-common-proc-board.dts 中的 MAIN_GPIO0状态

&main_gpio0 {
	status = "okay";
};

第四、我要在 run_app_single_cam.sh 中控制用于摄像头电源开启的这些引脚。

(AG26) SPI0_D0.GPIO0_54需要设置为高电平

(AH26) SPI0_D1.gpio0_55需要处于低电平

(U28) MCAN0_RX.GPIO0_26需要高电平

 (R28) MCAN2_TX.GPIO0_29需要为高电平

 (V26) MCAN1_TX.GPIO0_27需要高电平

 (R27) MCAN1_RX.GPIO0_28需要为高电平

如何实现以控制 GPIO、谢谢、请帮我指出如何实现。

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

    在  k3-am68-sk-base-board.dts 中添加一条信息

    &main_gpio0 {
    	status = "okay";
    	pinctrl-names = "default";
    	pinctrl-0 = <&rpi_header_gpio0_pins_default>;
    };

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

    那么、您希望从哪个内核来控制它?  

    从 R5F 开始、它非常简单

    -打开 hte GPIO 模块

    -设置 pinmux

    -配置 GPIO 模块。  

    此致、

    Brijesh

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

    您好、Brijesh:

    感谢您的答复。

    是的、它是 R5F 内核。

    您可以帮助逐步提供示例代码来告诉我如何控制您提供的代码吗?

    -打开 hte GPIO 模块

    -设置 pinmux

    -配置 GPIO 模块。  

    非常感谢。

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

    您好、Brijesh:

    您能否帮助在 IMX390_PowerOn 等函数中添加一些 GPIO 设置?

    代码路径:\imaging\sensor_drv\imx390\iss_sensor_imx390.c src

    (AG26) SPI0_D0.GPIO0_54需要设置为高电平
    (AH26) SPI0_D1.gpio0_55需要处于低电平
    (U28) MCAN0_RX.GPIO0_26需要高电平
    (R28) MCAN2_TX.GPIO0_29需要为高电平
    (V26) MCAN1_TX.GPIO0_27需要高电平
    (R27) MCAN1_RX.GPIO0_28需要为高电平

    在 IMX390_POWERON 中、我们要通过高于 GPIO 的方式设置上电序列。

    请帮助我实施。 或者提供我可以参考的任何样本。

    static int32_t IMX390_PowerOn(uint32_t chId, void *pSensorHdl)
    {
        int32_t status = 0;
    
        sp1hGainRegValueOld[chId] = 0;
        redGain_prev[chId] = greenGain_prev[chId] = blueGain_prev[chId] = 512;
    
        issLogPrintf("IMX390_PowerOn : chId = 0x%x \n", chId);
    
        return status;
    }
    

    非常感谢。

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

    您好、Brijesh:

    我尝试  在 iss_sensor_imx390.c 中向 IMX390_PowerOn 添加一个 GPIO_init ()函数

    static int32_t IMX390_PowerOn(uint32_t chId, void *pSensorHdl)
    {
        int32_t status = 0;
    
        sp1hGainRegValueOld[chId] = 0;
        redGain_prev[chId] = greenGain_prev[chId] = blueGain_prev[chId] = 512;
    
        issLogPrintf("IMX390_PowerOn : chId = 0x%x \n", chId);
        GPIO_init(); //add
    
        return status;
    }

    并在 iss_sensor_priv.h 中添加头文件

    #ifndef x86_64
    #if defined (MCU_PLUS_SDK)
    #include <drivers/i2c/v0/i2c.h>
    #include <board/board_control.h>
    #include <drivers/csirx/v1/hw_include/V1/csirx_if.h>
    #include <drivers/csirx/v1/soc/csirx_soc.h>
    #else
    #include <ti/board/src/devices/board_devices.h>
    #include <ti/drv/i2c/i2c.h>
    #include <ti/drv/i2c/soc/i2c_soc.h>
    
    #include <ti/drv/gpio/GPIO.h> //add
    #include <ti/drv/gpio/soc/GPIO_soc.h> //add
    
    #include <ti/board/src/devices/common/common.h>
    #include <ti/board/board.h>
    #include <ti/board/src/devices/board_devices.h>
    #include <ti/board/src/devices/fpd/ds90ub960.h>
    
    #include <app_remote_service.h>
    #include <app_ipc.h>
    
    #include <ti/drv/csirx/soc/V0/csirx_soc.h>
    #endif

    但当我在 sdk_builder $./make_sdk.sh 中运行构建命令时、却需要这样做

    始终打印链接失败。

    Linking /home/fih/Workspace/EddieYLChen/test_file/eag_ti-processor-sdk-rtos-j721s2-evm-10_00_00_05_super1/vision_apps/out/J721S2/R5F/FREERTOS/release/vx_app_rtos_linux_mcu2_0.out
    
     undefined first referenced
      symbol       in file
     --------- ----------------
     GPIO_init /home/fih/Workspace/EddieYLChen/test_file/eag_ti-processor-sdk-rtos-j721s2-evm-10_00_00_05_super1/imaging/lib/J721S2/R5F/FREERTOS/release/ti_imaging_sensordrv.lib<iss_sensor_imx390.obj>
    
    error: unresolved symbols remain
    error: errors encountered during linking;
       "/home/fih/Workspace/EddieYLChen/test_file/eag_ti-processor-sdk-rtos-j721s2-
       evm-10_00_00_05_super1/vision_apps/out/J721S2/R5F/FREERTOS/release/vx_app_rt
       os_linux_mcu2_0.out" not built
    tiarmclang: error: tiarmlnk command failed with exit code 1 (use -v to see invocation)
    make[2]: *** [/home/fih/Workspace/EddieYLChen/test_file/eag_ti-processor-sdk-rtos-j721s2-evm-10_00_00_05_super1/sdk_builder/concerto/finale.mak:216: /home/fih/Workspace/EddieYLChen/test_file/eag_ti-processor-sdk-rtos-j721s2-evm-10_00_00_05_super1/vision_apps/out/J721S2/R5F/FREERTOS/release/vx_app_rtos_linux_mcu2_0.out] Error 1
    make[2]: Leaving directory '/home/fih/Workspace/EddieYLChen/test_file/eag_ti-processor-sdk-rtos-j721s2-evm-10_00_00_05_super1/vision_apps'
    make[1]: Leaving directory '/home/fih/Workspace/EddieYLChen/test_file/eag_ti-processor-sdk-rtos-j721s2-evm-10_00_00_05_super1/sdk_builder'
    make[1]: *** [makerules/makefile_vision_apps.mak:42: vision_apps] Error 2
    make: *** [Makefile:65: sdk] Error 2
    
    real    0m18.542s
    user    0m30.954s
    sys     0m5.679s

    您能帮我检查为什么问题导致这个原因吗?

    非常感谢。

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

    您好!

    您能否参阅以下常见问题解答? 它有一个写入 GPIO 的示例、尽管它集成了 DMA、但您可以忽略这部分代码。  

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1061801/faq-tda4vm-gpio-dma-trigger-in-tda4-and-test-in-sdk7-1

    此致、

    Brijesh

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

    您好、 Brijesh

    YL 是我的客户。

    我这边有几个问题。

    (1)为什么我们需要重新构建 sysfw? 因为我不知道修改 sysfw 的原因、所以我们的 SDK 是基本 PSDK RTOS 10.00.00.05。

    (2)您能否在视觉应用中共享一些用于 GPIO 控制的示例代码。 我们只需要在视觉应用代码中进行简单的 GPIO 输出控制

    (3)我认为客户尝试在视觉应用源代码中使用 CSL 驱动程序进行 GPIO 控制、但他似乎遇到了构建链接错误。 你有什么建议吗? 在视觉应用代码中使用 CSL 是正确的方式吗?

    https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-j721s2/10_00_00_05/exports/docs/pdk_j721s2_10_00_00_27/docs/userguide/j721s2/modules/gpio.html

    非常感谢

    Gibbs

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

    嗨、Gibbs、

    因此无需重新构建 sysfw。  从常见问题解答中、您只需要参加 GPIO 配置部分。 其余都可以忽略。

    FAQ 包含 GPIO 配置、并且集成在视觉应用中。 在 已发布的 SDK 中、没有 GPIO 控制示例。

    不需要使用 CSL 驱动程序。 您可以直接写入寄存器。 GPIO 是一个简单的模块、只需写入几个寄存器即可切换输出。  

    此致、

    Brijesh  

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

    您好、 Brijesh

    谢谢你的答复

    关注此回复、

    >> 无需使用 CSL 驱动程序。 您可以直接写入寄存器。 GPIO 是一个简单的模块、只需写入几个寄存器即可切换输出

    研究贴片后、示例应如下所示。

    +static void App_setupPinmux()
    +{
    +    /* Setup GPIO 37 */
    +    *(volatile uint32_t *)0x11c094 = 0x50007 | (2 << 4);
    +    *(volatile uint32_t *)0x11c098 = 0x50007 | (2 << 4);
    +    *(volatile uint32_t *)0x11c09C = 0x50007 | (2 << 4);
    +}
    +
    +static void App_initGpio()
    +{
    +    uint32_t chIdx, bitpos, gpio_id, bank_id;
    +
    +    for (chIdx = 0; chIdx < APP_NUM_CH; chIdx ++)
    +    {
    +        gpio_id = GPIO_START + chIdx;
    +        bitpos = gpio_id % 32;
    +        bank_id = gpio_id / 16;
    +
    +        *(volatile uint32_t *)0x00620044 = (1u << bitpos);
    +        *(volatile uint32_t *)0x00620038 &= ~(1u << bitpos);
    +
    +        *(volatile uint32_t *)0x0062004C = (1u << bitpos);
    +        *(volatile uint32_t *)0x00620054 = (1u << bitpos);
    +
    +        *(volatile uint32_t *)0x0062005C = (1u << bitpos);
    +
    +        *(volatile uint32_t *)0x00620044 = (1u << bitpos);
    +        *(volatile uint32_t *)0x00620038 &= ~(1u << bitpos);
    +
    +        *(volatile uint32_t *)0x00620008 = (1u << bank_id);
    +
    +        *(volatile uint32_t *)0x0062004C = (1u << bitpos);
    +        *(volatile uint32_t *)0x00620054 = (1u << bitpos);
    +    }
    +}
    +
    +static void App_setupGpioMuxIr()
    +{

    Gibbs

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

    嗨、Gibbs、  

    是的、这是用于 GPIO 配置的正确 API。  

    此致、

    Brijesh