1. 概述
i.MX8QXP Android Automotive12 默认 M4 触发倒车影像方式是通过 M4 串口输入方式,输入 gear 2 触发打开倒车影像应用显示,输入 gear 4 关闭倒车影像应用显示。本文章介绍如何使用 M4 控制的 GPIO 触发倒车影像功能。
2. 代码修改
2.1 SCFW 资源分配
本文使用 ESAI0_TX3_RX2 引脚做此 GPIO 功能,修改 SCFW 源码,把 GPIO0 和 ESAI0_TX3_RX2 资源从 A 核释放到 M4,如下所示:
--- a/platform/board/mx8qx_mek/board.c
+++ b/platform/board/mx8qx_mek/board.c
@@ -778,6 +778,8 @@ sc_err_t mark_shared_resources(sc_rm_pt_t pt_src, sc_bool_t movable)
// SC_R_LVDS_1, movable));
BRD_ERR(rm_set_resource_movable(pt_src, SC_R_ISI_CH0,
SC_R_ISI_CH0, movable));
+ BRD_ERR(rm_set_resource_movable(pt_src, SC_R_GPIO_0,
+ SC_R_GPIO_0, SC_TRUE));
/* Move some pads not in the M4_0 subsystem */
BRD_ERR(rm_set_pad_movable(pt_src, SC_P_MIPI_CSI0_GPIO0_00,
@@ -786,6 +788,8 @@ sc_err_t mark_shared_resources(sc_rm_pt_t pt_src, sc_bool_t movable)
SC_P_MIPI_DSI0_I2C0_SDA, movable));
//BRD_ERR(rm_set_pad_movable(pt_src, SC_P_MIPI_DSI1_I2C0_SCL,
// SC_P_MIPI_DSI1_I2C0_SDA, movable));
+ BRD_ERR(rm_set_pad_movable(pt_src, SC_P_ESAI0_TX3_RX2,
+ SC_P_ESAI0_TX3_RX2, movable));
return err;
}
2.2 M4 源码修改
文件 1:
boards/mekmimx8qx/demo_apps/rear_view_camera/automotive.c
--- a/boards/mekmimx8qx/demo_apps/rear_view_camera/automotive.c
+++ b/boards/mekmimx8qx/demo_apps/rear_view_camera/automotive.c
@@ -14,6 +14,7 @@
#include "automotive.h"
#include "app_srtm.h"
+#include "fsl_gpio.h"
#define APP_REAR_VIEW_CAMERA_TASK_PRIO (4U)
#define APP_AP_POWER_MONITOR_TASK_PRIO (3U)
@@ -22,6 +23,8 @@
#define APP_VIRTUAL_CONTROL_CONSOLE_TASK_PRIO (2U)
#define APP_HVAC_UI_EVENT_TASK_PRIO (4U)
+#define CAMERA_REAR_GPIO LSIO__GPIO0
+#define CAMERA_REAR_GPIO_PIN 7
EventGroupHandle_t g_xAutoUiEvent = NULL;
EventGroupHandle_t g_xUIResourceBits = NULL;
EventGroupHandle_t g_xAPStatus = NULL;
@@ -711,8 +714,12 @@ static void virtual_control_console_task(void *pvParameters)
int ctrl_char_index;
uint8_t *hist_str;
uint8_t str_buf[MAX_COMMAND_STR_LENGTH];
+ uint8_t send2_buf[]="gear 2";
+ uint8_t send4_buf[]="gear 4";
int ctrl_char_len = 0;
+ uint8_t gpio_valve=3,flag2_send=0,flag4_send=0,flag_res2=0;
+
edit_flag = false;
PRINTF("Rear View Camera Demo\r\n=====================\r\n");
@@ -734,6 +741,22 @@ static void virtual_control_console_task(void *pvParameters)
while (true)
{
status = DbgConsole_TryGetchar(ptr);
+ gpio_valve = GPIO_PinRead(CAMERA_REAR_GPIO,CAMERA_REAR_GPIO_PIN);
+ if((gpio_valve == 1) && (kStatus_Fail == status) && (flag2_send == 0))
+ {
+ strcpy(str_buf,send2_buf);
+ flag2_send = 1;
+ flag4_send = 1;
+ break;
+ }
+ else if ((gpio_valve == 0) && (kStatus_Fail == status)&& (flag4_send == 1))
+ {
+ strcpy(str_buf,send4_buf);
+ flag2_send = 0;
+ flag4_send = 0;
+ break;
+ }
+
if (kStatus_Fail == status)
{
vTaskDelay(5);
文件 2:
pin_mux.c、pin_mux.h
--- a/boards/mekmimx8qx/demo_apps/rear_view_camera/pin_mux.c
+++ b/boards/mekmimx8qx/demo_apps/rear_view_camera/pin_mux.c
@@ -231,6 +231,11 @@ void BOARD_InitPins(sc_ipc_t ipc) /*!< Function assigne
{
assert(false);
}
+pad_set_all(ipc, BOARD_INITPINS_BB_CSI_REAR_B_PIN_FUNCTION_ID, 4U, SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF, 0x0 ,SC_PAD_WAKEUP_OFF);/* IOMUXD_CSI_RESET register modification value */
+ if (SC_ERR_NONE != err)
+ {
+ assert(false);
+ }
}
/***********************************************************************************************************************
diff --git a/boards/mekmimx8qx/demo_apps/rear_view_camera/pin_mux.h b/boards/mekmimx8qx/demo_apps/rear_view_camera/pin_mux.h
index f4237ba..35ad5cb 100644
--- a/boards/mekmimx8qx/demo_apps/rear_view_camera/pin_mux.h
+++ b/boards/mekmimx8qx/demo_apps/rear_view_camera/pin_mux.h
@@ -269,6 +269,14 @@
#define BOARD_INITPINS_BB_CSI_RST_B_PIN_FUNCTION_ID SC_P_CSI_RESET /*!< Pin function id */
#define BOARD_INITPINS_BB_CSI_RST_B_LABEL "BB_CSI_RST_B/J13E[37]" /*!< Label */
#define BOARD_INITPINS_BB_CSI_RST_B_NAME "BB_CSI_RST_B" /*!< Identifier name */
+
+/* andrew add */
+#define BOARD_INITPINS_BB_CSI_REAR_B_GPIO LSIO__GPIO0 /*!< GPIO device name: LSIO__GPIO1 */
+#define BOARD_INITPINS_BB_CSI_REAR_B_GPIO_PIN 7U /*!< LSIO__GPIO3 pin index: 3 */
+#define BOARD_INITPINS_BB_CSI_REAR_B_PIN_NAME CSI_REAR /*!< Pin name */
+#define BOARD_INITPINS_BB_CSI_REAR_B_PIN_FUNCTION_ID SC_P_ESAI0_TX3_RX2 /*!< Pin function id */
+#define BOARD_INITPINS_BB_CSI_REAR_B_LABEL "BB_CSI_REAR_B" /*!< Label */
+#define BOARD_INITPINS_BB_CSI_REAR_B_NAME "BB_CSI_REAR_B" /*!< Identifier name */
/*!
* @addtogroup pin_mux
* @{
文件 3:boards/mekmimx8qx/demo_apps/rear_view_camera/rear_view_camera.c
--- a/boards/mekmimx8qx/demo_apps/rear_view_camera/rear_view_camera.c
+++ b/boards/mekmimx8qx/demo_apps/rear_view_camera/rear_view_camera.c
@@ -31,6 +31,8 @@
#include "nxp_logo.h"
+#include "fsl_gpio.h"
+
/*******************************************************************************
* Definitions
******************************************************************************/
@@ -59,6 +61,9 @@
#define APP_INVALID_PARTITION (0xFF)
+#define CAMERA_REAR_GPIO LSIO__GPIO0
+#define CAMERA_REAR_GPIO_PIN 7
+gpio_pin_config_t rear_gpio_config = {kGPIO_DigitalInput, 0,};
@@ -153,6 +165,12 @@ void BOARD_InitHardware(void)
PRINTF("Error: sc_pm_clock_enable failed\r\n");
}
+ ret1 = sc_pm_set_resource_power_mode(ipc, SC_R_GPIO_0, SC_PM_PW_MODE_ON);
+ /* Power on Peripherals. */
+ if (ret1 != SC_ERR_NONE)
+ {
+ PRINTF("Error: Failed to power on GPIO0 ret1 = %d\r\n",ret1);
+ }
/*
* * LPI2C1
@@ -178,36 +196,38 @@ void BOARD_InitHardware(void)
platform_scu_mu_init();
SOC_BootupAPCore();
+ /* Init CAMERA_REAR_GPIO GPIO. */
+ GPIO_PinInit(CAMERA_REAR_GPIO, CAMERA_REAR_GPIO_PIN, &rear_gpio_config);
}
3. 测试结果
编译烧录启动后,把 ESAI0_TX3_RX2 引脚接 VCC 触发倒车影像应用显示,显示图像,如下所示:
编译烧录启动后,把 ESAI0_TX3_RX2 引脚接 VCC 触发倒车影像应用显示,显示图像,如下所示:
以上为 i.MX8QXP Android Automotive12 增加 M4 GPIO 触发倒车影像功能!!!
参考文献《Android_User's_Guide.pdf》
《Android_Quick_Start_Guide.pdf》
评论