798 lines
23 KiB
C
798 lines
23 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <assert.h>
|
|
#include <unistd.h>
|
|
#include <getopt.h>
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
#include <errno.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/ioctl.h>
|
|
#include <inttypes.h>
|
|
|
|
#include "sample_comm.h"
|
|
#include "mipi_tx.h"
|
|
#include "sample_panel.h"
|
|
|
|
static int fd;
|
|
|
|
#define MAX_OPTIONS 128
|
|
#define LANE_MAX_NUM 5
|
|
|
|
typedef enum _ARG_TYPE_ {
|
|
ARG_INT = 0,
|
|
ARG_UINT,
|
|
ARG_STRING,
|
|
} ARG_TYPE;
|
|
|
|
typedef struct _optionExt_ {
|
|
struct option opt;
|
|
int type;
|
|
int64_t min;
|
|
int64_t max;
|
|
const char *help;
|
|
} optionExt;
|
|
|
|
typedef enum {
|
|
DSI_PANEL_3AML069LP01G,
|
|
DSI_PANEL_GM8775C,
|
|
DSI_PANEL_HX8394_EVB,
|
|
DSI_PANEL_MILKV_8HD,
|
|
DSI_PANEL_HX8399_1080P,
|
|
DSI_PANEL_ICN9707,
|
|
DSI_PANEL_ILI9881C,
|
|
DSI_PANEL_ILI9881D,
|
|
DSI_PANEL_JD9366AB,
|
|
DSI_PANEL_LT9611_1920x1080_60,
|
|
DSI_PANEL_LT9611_1920x1080_30,
|
|
DSI_PANEL_LT9611_1280x720_60,
|
|
DSI_PANEL_LT9611_1024x768_60,
|
|
DSI_PANEL_LT9611_1280x1024_60,
|
|
DSI_PANEL_LT9611_1600x1200_60,
|
|
DSI_PANEL_NT35521,
|
|
DSI_PANEL_OTA7290B_1920,
|
|
DSI_PANEL_OTA7290B,
|
|
DSI_PANEL_ST7701,
|
|
LVDS_PANEL_LCM185X56,
|
|
BT_PANEL_TP2803_BT656_1280x720_25FPS_72M,
|
|
BT_PANEL_NVP6021_BT1120_1920x1080_25FPS_72M,
|
|
I80_PANEL_ST7789V3_HW_MCU_240x320_60FPS,
|
|
PANEL_MAX
|
|
} PANEL_MODEL;
|
|
|
|
typedef struct _inputPara_ {
|
|
enum mipi_tx_lane_id lane_id[LANE_MAX_NUM];
|
|
bool lane_pn_swap[LANE_MAX_NUM];
|
|
bool lane_id_flag;
|
|
bool pn_swap_flag;
|
|
PANEL_MODEL panel_model;
|
|
} inputPara;
|
|
|
|
inputPara g_input_para = {
|
|
.panel_model = DSI_PANEL_HX8394_EVB,
|
|
};
|
|
|
|
static struct panel_desc_s g_panel_desc = {
|
|
.panel_mode = "HX8394_EVB",
|
|
.panel_type = PANEL_MODE_DSI,
|
|
.stdsicfg.dev_cfg = &dev_cfg_hx8394_720x1280,
|
|
.stdsicfg.hs_timing_cfg = &hs_timing_cfg_hx8394_720x1280,
|
|
.stdsicfg.dsi_init_cmds = dsi_init_cmds_hx8394_720x1280,
|
|
.stdsicfg.dsi_init_cmds_size = ARRAY_SIZE(dsi_init_cmds_hx8394_720x1280)
|
|
};
|
|
|
|
static optionExt long_option_ext[] = {
|
|
{{"panel", optional_argument, NULL, 'm'}, ARG_STRING, 0, 0,
|
|
"choose diaply panel model"},
|
|
{{"laneid", optional_argument, NULL, 'l'}, ARG_STRING, 0, 0,
|
|
"laneid sequence by order"},
|
|
{{"pnswap", optional_argument, NULL, 'p'}, ARG_STRING, 0, 0,
|
|
"pnswap sequence by order"},
|
|
{{"dsi-control", no_argument, NULL, 'd'}, ARG_STRING, 0, 0,
|
|
"set/get dsi status or settings." },
|
|
{{"show-pattern", optional_argument, NULL, 's'}, ARG_STRING, 0, 0,
|
|
"show colorbar or snow or rgb color pattern." },
|
|
{{"help", no_argument, NULL, 'h'}, ARG_STRING, 0, 0,
|
|
"print usage."},
|
|
{{NULL, 0, NULL, 0}, ARG_INT, 0, 0, "no param: just init the panel."}
|
|
};
|
|
|
|
static char *s_panel_model_type_arr[] = {
|
|
"3AML069LP01G",
|
|
"GM8775C",
|
|
"HX8394_EVB",
|
|
"MILKV_8HD",
|
|
"HX8399_1080P",
|
|
"ICN9707",
|
|
"ILI9881C",
|
|
"ILI9881D",
|
|
"JD9366AB",
|
|
"LT9611_1920x1080_60",
|
|
"LT9611_1920x1080_30",
|
|
"LT9611_1280x720_60",
|
|
"LT9611_1024x768_60",
|
|
"LT9611_1280x1024_60",
|
|
"LT9611_1600x1200_60",
|
|
"NT35521",
|
|
"OTA7290B_1920",
|
|
"OTA7290B",
|
|
"ST7701",
|
|
"LCM185X56",
|
|
"TP2803_BT656_1280x720_25FPS_72M",
|
|
"BT_PANEL_NVP6021_BT1120_1920x1080_25FPS_72M",
|
|
"ST7789V3_HW_MCU_RGB565_240x320_60FPS",
|
|
};
|
|
|
|
void printdsiHelp(void)
|
|
{
|
|
printf("\n// ------------------------dsi-control------------------------\n");
|
|
printf(" 0: dcs send\n");
|
|
printf(" 1: dcs get\n");
|
|
printf(" 2: switch to lp\n");
|
|
printf(" 3: switch to hs\n");
|
|
printf(" 4: get hs settle settings\n");
|
|
printf(" 5: set hs settle settings\n");
|
|
}
|
|
|
|
void printPatternHelp(void)
|
|
{
|
|
printf("\n// ------------------------show-pattern------------------------\n");
|
|
printf(" 0: VO_PAT_OFF\n");
|
|
printf(" 1: VO_PAT_SNOW\n");
|
|
printf(" 2: VO_PAT_AUTO\n");
|
|
printf(" 3: VO_PAT_RED\n");
|
|
printf(" 4: VO_PAT_GREEN\n");
|
|
printf(" 5: VO_PAT_BLUE\n");
|
|
printf(" 6: VO_PAT_COLORBAR\n");
|
|
printf(" 7: VO_PAT_GRAY_GRAD_H\n");
|
|
printf(" 8: VO_PAT_GRAY_GRAD_V\n");
|
|
printf(" 9: VO_PAT_BLACK\n");
|
|
}
|
|
|
|
void printHelp(char **argv)
|
|
{
|
|
CVI_U32 idx;
|
|
|
|
printf("// ------------------------help------------------------\n");
|
|
printf("\noptional panel mode support list:\n");
|
|
for (idx = 0; idx < sizeof(s_panel_model_type_arr) / sizeof(char *); idx++) {
|
|
printf(" %s\n", s_panel_model_type_arr[idx]);
|
|
}
|
|
|
|
printf("\n.for mipi/lvds panel you can cfg lane seq or pnswap");
|
|
printf("\nEX.\n");
|
|
printf(" %s --panel=HX8394_EVB --laneid=1,2,0,3,4 --pnswap=0,0,0,0,0\n", argv[0]);
|
|
printf("\n.for mipi panel You can also manually set the dsi by -d");
|
|
printf("\nEX.\n");
|
|
printf(" %s -d\n", argv[0]);
|
|
printf("\n.After initializing panel, to show specific pattern by --show-pattern");
|
|
printf("\nEX.\n");
|
|
printf(" %s --panel=HX8394_EVB --show-pattern=6\n", argv[0]);
|
|
printf("\n.After initializing panel, to show any kind of pattern by -s");
|
|
printf("\nEX.\n");
|
|
printf(" %s --panel=HX8394_EVB -s\n\n", argv[0]);
|
|
|
|
for (idx = 0; idx < sizeof(long_option_ext) / sizeof(optionExt); idx++) {
|
|
if (long_option_ext[idx].opt.name == NULL) {
|
|
break;
|
|
}
|
|
|
|
printf("--%s\n", long_option_ext[idx].opt.name);
|
|
printf(" %s\n", long_option_ext[idx].help);
|
|
}
|
|
|
|
printf("// ------------------------------------------------\n");
|
|
}
|
|
|
|
int dsi_init(int devno, const struct dsc_instr *cmds, int size)
|
|
{
|
|
int ret;
|
|
|
|
if (cmds == NULL) {
|
|
return CVI_FAILURE;
|
|
}
|
|
|
|
for (int i = 0; i < size; i++) {
|
|
const struct dsc_instr *instr = &cmds[i];
|
|
struct cmd_info_s cmd_info = {
|
|
.devno = devno,
|
|
.cmd_size = instr->size,
|
|
.data_type = instr->data_type,
|
|
.cmd = (void *)instr->data
|
|
};
|
|
|
|
ret = mipi_tx_send_cmd(fd, &cmd_info);
|
|
if (instr->delay)
|
|
usleep(instr->delay * 1000);
|
|
|
|
if (ret) {
|
|
printf("dsi init failed at %d instr.\n", i);
|
|
return ret;
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
CVI_S32 SAMPLE_MIPI_TX_ENABLE(void)
|
|
{
|
|
CVI_S32 ret = 0;
|
|
|
|
fd = open(MIPI_TX_NAME, O_RDWR | O_NONBLOCK, 0);
|
|
if (fd == -1) {
|
|
printf("Cannot open '%s': %d, %s\n", MIPI_TX_NAME, errno, strerror(errno));
|
|
return CVI_FAILURE;
|
|
}
|
|
|
|
ret = mipi_tx_disable(fd);
|
|
if (ret != CVI_SUCCESS) {
|
|
printf("mipi_tx_disable fail!\n");
|
|
return CVI_FAILURE;
|
|
}
|
|
|
|
ret = mipi_tx_cfg(fd, (struct combo_dev_cfg_s *)g_panel_desc.stdsicfg.dev_cfg);
|
|
if (ret != CVI_SUCCESS) {
|
|
printf("mipi_tx_cfg fail!\n");
|
|
return CVI_FAILURE;
|
|
}
|
|
ret = dsi_init(0, g_panel_desc.stdsicfg.dsi_init_cmds, g_panel_desc.stdsicfg.dsi_init_cmds_size);
|
|
if (ret != CVI_SUCCESS) {
|
|
printf("dsi_init fail!\n");
|
|
return CVI_FAILURE;
|
|
}
|
|
|
|
ret = mipi_tx_set_hs_settle(fd, g_panel_desc.stdsicfg.hs_timing_cfg);
|
|
if (ret != CVI_SUCCESS) {
|
|
printf("mipi_tx_set_hs_settle fail!\n");
|
|
return CVI_FAILURE;
|
|
}
|
|
|
|
ret = mipi_tx_enable(fd);
|
|
if (ret != CVI_SUCCESS) {
|
|
printf("mipi_tx_enable fail!\n");
|
|
return CVI_FAILURE;
|
|
}
|
|
|
|
printf("Init for MIPI-Driver-%s\n", g_panel_desc.panel_mode);
|
|
|
|
close(fd);
|
|
|
|
return CVI_SUCCESS;
|
|
}
|
|
|
|
CVI_S32 SAMPLE_PANEL_ShowPattern(CVI_S32 patern_cmd)
|
|
{
|
|
CVI_S32 ret = 0;
|
|
VO_DEV VoDev = 0;
|
|
|
|
if (patern_cmd >= 0 && patern_cmd < VO_PAT_MAX) {
|
|
ret = CVI_VO_ShowPattern(VoDev, patern_cmd);
|
|
if (ret != CVI_SUCCESS) {
|
|
printf("CVI_VO_ShowPattern failed with %#x!\n", ret);
|
|
return ret;
|
|
}
|
|
sleep(2);
|
|
} else if (patern_cmd == VO_PAT_MAX) {
|
|
do {
|
|
printPatternHelp();
|
|
printf(" others: exit\n");
|
|
scanf("%d", &patern_cmd);
|
|
if (patern_cmd >= 0 && patern_cmd < VO_PAT_MAX) {
|
|
ret = CVI_VO_ShowPattern(VoDev, patern_cmd);
|
|
if (ret != CVI_SUCCESS) {
|
|
printf("CVI_VO_ShowPattern failed with %#x!\n", ret);
|
|
return CVI_FAILURE;
|
|
}
|
|
} else {
|
|
break;
|
|
}
|
|
} while (1);
|
|
} else {
|
|
printf("invalid pattern mode parameter\n");
|
|
return ret;
|
|
}
|
|
|
|
ret = CVI_VO_ShowPattern(VoDev, VO_PAT_OFF);
|
|
if (ret != CVI_SUCCESS) {
|
|
printf("CVI_VO_ShowPattern failed with %#x!\n", ret);
|
|
return CVI_FAILURE;
|
|
}
|
|
|
|
return CVI_SUCCESS;
|
|
}
|
|
|
|
CVI_S32 SAMPLE_PANEL_ENABLE(void)
|
|
{
|
|
CVI_S32 ret = 0;
|
|
VO_DEV VoDev = 0;
|
|
|
|
if (g_panel_desc.panel_type == PANEL_MODE_DSI) {
|
|
ret = SAMPLE_MIPI_TX_ENABLE();
|
|
if (ret != CVI_SUCCESS) {
|
|
printf("SAMPLE_MIPI_TX_ENABLE fail!\n");
|
|
return CVI_FAILURE;
|
|
}
|
|
} else {
|
|
ret = CVI_VO_SetPubAttr(VoDev, &g_panel_desc.stVoPubAttr);
|
|
if (ret != CVI_SUCCESS) {
|
|
printf("failed with %#x!\n", ret);
|
|
return CVI_FAILURE;
|
|
}
|
|
printf("Init for Driver-%s\n", g_panel_desc.panel_mode);
|
|
}
|
|
|
|
return CVI_SUCCESS;
|
|
}
|
|
|
|
void SAMPLE_DSI_CONTROLE(void)
|
|
{
|
|
CVI_U32 tmp;
|
|
|
|
fd = open(MIPI_TX_NAME, O_RDWR | O_NONBLOCK, 0);
|
|
if (fd == -1) {
|
|
printf("Cannot open '%s': %d, %s\n", MIPI_TX_NAME, errno, strerror(errno));
|
|
}
|
|
|
|
do {
|
|
printdsiHelp();
|
|
printf(" others: exit\n");
|
|
scanf("%d", &tmp);
|
|
if (tmp == 0) {
|
|
struct cmd_info_s cmd_info;
|
|
CVI_U8 data[16] = { 0 };
|
|
int len = 0;
|
|
|
|
printf("data size:\n");
|
|
scanf("%d", &tmp);
|
|
cmd_info.cmd_size = tmp;
|
|
|
|
printf("data type: 0x\n");
|
|
scanf("%x", &tmp);
|
|
cmd_info.data_type = tmp;
|
|
|
|
do {
|
|
printf("data[%d]: 0x\n", len);
|
|
scanf("%x", &tmp);
|
|
data[len++] = tmp;
|
|
} while (len < cmd_info.cmd_size);
|
|
cmd_info.cmd = data;
|
|
mipi_tx_send_cmd(fd, &cmd_info);
|
|
} else if (tmp == 1) {
|
|
struct get_cmd_info_s cmd_info;
|
|
CVI_U8 data[4] = { 0 };
|
|
|
|
printf("get data size:\n");
|
|
scanf("%d", &tmp);
|
|
cmd_info.get_data_size = tmp;
|
|
|
|
printf("data type: 0x\n");
|
|
scanf("%x", &tmp);
|
|
cmd_info.data_type = tmp;
|
|
|
|
printf("data param: 0x\n");
|
|
scanf("%x", &tmp);
|
|
cmd_info.data_param = tmp;
|
|
|
|
cmd_info.get_data = data;
|
|
mipi_tx_recv_cmd(fd, &cmd_info);
|
|
printf("data[0]: %#x [1]: %#x [2]: %#x [3]: %#x\n"
|
|
, cmd_info.get_data[0], cmd_info.get_data[1]
|
|
, cmd_info.get_data[2], cmd_info.get_data[3]);
|
|
} else if (tmp == 2) {
|
|
mipi_tx_disable(fd);
|
|
} else if (tmp == 3) {
|
|
mipi_tx_enable(fd);
|
|
} else if (tmp == 4) {
|
|
struct hs_settle_s hs_cfg;
|
|
|
|
mipi_tx_get_hs_settle(fd, &hs_cfg);
|
|
printf("prepare(%d) zero(%d) trail(%d)\n",
|
|
hs_cfg.prepare, hs_cfg.zero, hs_cfg.trail);
|
|
} else if (tmp == 5) {
|
|
struct hs_settle_s hs_cfg;
|
|
|
|
printf("prepare:\n");
|
|
scanf("%d", &tmp);
|
|
hs_cfg.prepare = tmp;
|
|
|
|
printf("zero:\n");
|
|
scanf("%d", &tmp);
|
|
hs_cfg.zero = tmp;
|
|
|
|
printf("trail:\n");
|
|
scanf("%d", &tmp);
|
|
hs_cfg.trail = tmp;
|
|
|
|
mipi_tx_set_hs_settle(fd, &hs_cfg);
|
|
} else
|
|
break;
|
|
} while (1);
|
|
|
|
close(fd);
|
|
}
|
|
|
|
void SAMPLE_SET_PANEL_DESC(void)
|
|
{
|
|
switch (g_input_para.panel_model) {
|
|
case DSI_PANEL_ILI9881C:
|
|
g_panel_desc.panel_type = PANEL_MODE_DSI;
|
|
g_panel_desc.stdsicfg.dev_cfg = &dev_cfg_ili9881c_720x1280;
|
|
g_panel_desc.stdsicfg.hs_timing_cfg = &hs_timing_cfg_ili9881c_720x1280;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds = dsi_init_cmds_ili9881c_720x1280;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds_size = ARRAY_SIZE(dsi_init_cmds_ili9881c_720x1280);
|
|
break;
|
|
case DSI_PANEL_ILI9881D:
|
|
g_panel_desc.panel_type = PANEL_MODE_DSI;
|
|
g_panel_desc.stdsicfg.dev_cfg = &dev_cfg_ili9881d_720x1280;
|
|
g_panel_desc.stdsicfg.hs_timing_cfg = &hs_timing_cfg_ili9881d_720x1280;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds = dsi_init_cmds_ili9881d_720x1280;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds_size = ARRAY_SIZE(dsi_init_cmds_ili9881d_720x1280);
|
|
break;
|
|
case DSI_PANEL_JD9366AB:
|
|
g_panel_desc.panel_type = PANEL_MODE_DSI;
|
|
g_panel_desc.stdsicfg.dev_cfg = &dev_cfg_jd9366ab_800x1280;
|
|
g_panel_desc.stdsicfg.hs_timing_cfg = &hs_timing_cfg_jd9366ab_800x1280;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds = dsi_init_cmds_jd9366ab_800x1280;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds_size = ARRAY_SIZE(dsi_init_cmds_jd9366ab_800x1280);
|
|
break;
|
|
case DSI_PANEL_NT35521:
|
|
g_panel_desc.panel_type = PANEL_MODE_DSI;
|
|
g_panel_desc.stdsicfg.dev_cfg = &dev_cfg_nt35521_800x1280;
|
|
g_panel_desc.stdsicfg.hs_timing_cfg = &hs_timing_cfg_nt35521_800x1280;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds = dsi_init_cmds_nt35521_800x1280;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds_size = ARRAY_SIZE(dsi_init_cmds_nt35521_800x1280);
|
|
break;
|
|
case DSI_PANEL_OTA7290B:
|
|
g_panel_desc.panel_type = PANEL_MODE_DSI;
|
|
g_panel_desc.stdsicfg.dev_cfg = &dev_cfg_ota7290b_320x1280;
|
|
g_panel_desc.stdsicfg.hs_timing_cfg = &hs_timing_cfg_ota7290b_320x1280;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds = dsi_init_cmds_ota7290b_320x1280;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds_size = ARRAY_SIZE(dsi_init_cmds_ota7290b_320x1280);
|
|
break;
|
|
case DSI_PANEL_OTA7290B_1920:
|
|
g_panel_desc.panel_type = PANEL_MODE_DSI;
|
|
g_panel_desc.stdsicfg.dev_cfg = &dev_cfg_ota7290b_440x1920;
|
|
g_panel_desc.stdsicfg.hs_timing_cfg = &hs_timing_cfg_ota7290b_440x1920;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds = dsi_init_cmds_ota7290b_440x1920;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds_size = ARRAY_SIZE(dsi_init_cmds_ota7290b_440x1920);
|
|
break;
|
|
case DSI_PANEL_ICN9707:
|
|
g_panel_desc.panel_type = PANEL_MODE_DSI;
|
|
g_panel_desc.stdsicfg.dev_cfg = &dev_cfg_icn9707_480x1920;
|
|
g_panel_desc.stdsicfg.hs_timing_cfg = &hs_timing_cfg_icn9707_480x1920;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds = dsi_init_cmds_icn9707_480x1920;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds_size = ARRAY_SIZE(dsi_init_cmds_icn9707_480x1920);
|
|
break;
|
|
case DSI_PANEL_3AML069LP01G:
|
|
g_panel_desc.panel_type = PANEL_MODE_DSI;
|
|
g_panel_desc.stdsicfg.dev_cfg = &dev_cfg_3AML069LP01G_600x1024;
|
|
g_panel_desc.stdsicfg.hs_timing_cfg = &hs_timing_cfg_3AML069LP01G_600x1024;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds = dsi_init_cmds_3AML069LP01G_600x1024;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds_size = ARRAY_SIZE(dsi_init_cmds_3AML069LP01G_600x1024);
|
|
break;
|
|
case DSI_PANEL_ST7701:
|
|
g_panel_desc.panel_type = PANEL_MODE_DSI;
|
|
g_panel_desc.stdsicfg.dev_cfg = &dev_cfg_st7701_480x800;
|
|
g_panel_desc.stdsicfg.hs_timing_cfg = &hs_timing_cfg_st7701_480x800;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds = dsi_init_cmds_st7701_480x800;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds_size = ARRAY_SIZE(dsi_init_cmds_st7701_480x800);
|
|
break;
|
|
case DSI_PANEL_HX8399_1080P:
|
|
g_panel_desc.panel_type = PANEL_MODE_DSI;
|
|
g_panel_desc.stdsicfg.dev_cfg = &dev_cfg_hx8399_1080x1920;
|
|
g_panel_desc.stdsicfg.hs_timing_cfg = &hs_timing_cfg_hx8399_1080x1920;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds = dsi_init_cmds_hx8399_1080x1920;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds_size = ARRAY_SIZE(dsi_init_cmds_hx8399_1080x1920);
|
|
break;
|
|
case DSI_PANEL_GM8775C:
|
|
g_panel_desc.panel_type = PANEL_MODE_DSI;
|
|
g_panel_desc.stdsicfg.dev_cfg = &dev_cfg_gm8775c;
|
|
g_panel_desc.stdsicfg.hs_timing_cfg = &hs_timing_cfg_gm8775c;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds = dsi_init_cmds_gm8775c;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds_size = ARRAY_SIZE(dsi_init_cmds_gm8775c);
|
|
break;
|
|
case DSI_PANEL_LT9611_1920x1080_60:
|
|
g_panel_desc.panel_type = PANEL_MODE_DSI;
|
|
g_panel_desc.stdsicfg.dev_cfg = &dev_cfg_lt9611_1920x1080_60Hz;
|
|
g_panel_desc.stdsicfg.hs_timing_cfg = &hs_timing_cfg_lt9611;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds = NULL;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds_size = 0;
|
|
break;
|
|
case DSI_PANEL_LT9611_1920x1080_30:
|
|
g_panel_desc.panel_type = PANEL_MODE_DSI;
|
|
g_panel_desc.stdsicfg.dev_cfg = &dev_cfg_lt9611_1920x1080_30Hz;
|
|
g_panel_desc.stdsicfg.hs_timing_cfg = &hs_timing_cfg_lt9611;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds = NULL;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds_size = 0;
|
|
break;
|
|
case DSI_PANEL_LT9611_1280x720_60:
|
|
g_panel_desc.panel_type = PANEL_MODE_DSI;
|
|
g_panel_desc.stdsicfg.dev_cfg = &dev_cfg_lt9611_1280x720_60Hz;
|
|
g_panel_desc.stdsicfg.hs_timing_cfg = &hs_timing_cfg_lt9611;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds = NULL;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds_size = 0;
|
|
break;
|
|
case DSI_PANEL_LT9611_1024x768_60:
|
|
g_panel_desc.panel_type = PANEL_MODE_DSI;
|
|
g_panel_desc.stdsicfg.dev_cfg = &dev_cfg_lt9611_1024x768_60Hz;
|
|
g_panel_desc.stdsicfg.hs_timing_cfg = &hs_timing_cfg_lt9611;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds = NULL;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds_size = 0;
|
|
break;
|
|
case DSI_PANEL_LT9611_1280x1024_60:
|
|
g_panel_desc.panel_type = PANEL_MODE_DSI;
|
|
g_panel_desc.stdsicfg.dev_cfg = &dev_cfg_lt9611_1280x1024_60Hz;
|
|
g_panel_desc.stdsicfg.hs_timing_cfg = &hs_timing_cfg_lt9611;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds = NULL;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds_size = 0;
|
|
break;
|
|
case DSI_PANEL_LT9611_1600x1200_60:
|
|
g_panel_desc.panel_type = PANEL_MODE_DSI;
|
|
g_panel_desc.stdsicfg.dev_cfg = &dev_cfg_lt9611_1600x1200_60Hz;
|
|
g_panel_desc.stdsicfg.hs_timing_cfg = &hs_timing_cfg_lt9611;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds = NULL;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds_size = 0;
|
|
break;
|
|
case DSI_PANEL_HX8394_EVB:
|
|
g_panel_desc.panel_type = PANEL_MODE_DSI;
|
|
g_panel_desc.stdsicfg.dev_cfg = &dev_cfg_hx8394_720x1280;
|
|
g_panel_desc.stdsicfg.hs_timing_cfg = &hs_timing_cfg_hx8394_720x1280;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds = dsi_init_cmds_hx8394_720x1280;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds_size = ARRAY_SIZE(dsi_init_cmds_hx8394_720x1280);
|
|
break;
|
|
case DSI_PANEL_MILKV_8HD:
|
|
g_panel_desc.panel_type = PANEL_MODE_DSI;
|
|
g_panel_desc.stdsicfg.dev_cfg = &dev_cfg_milkv_8hd_800x1280;
|
|
g_panel_desc.stdsicfg.hs_timing_cfg = &hs_timing_cfg_milkv_8hd_800x1280;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds = dsi_init_cmds_milkv_8hd_800x1280;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds_size = ARRAY_SIZE(dsi_init_cmds_milkv_8hd_800x1280);
|
|
break;
|
|
case LVDS_PANEL_LCM185X56:
|
|
g_panel_desc.panel_type = PANEL_MODE_LVDS;
|
|
g_panel_desc.stVoPubAttr.enIntfType = VO_INTF_LCD_24BIT;
|
|
g_panel_desc.stVoPubAttr.enIntfSync = VO_OUTPUT_USER;
|
|
VO_SYNC_INFO_S stLcm185x56_SyncInfo = {.bSynm = 1, .bIop = 1, .u16FrameRate = 60
|
|
, .u16Vact = 768, .u16Vbb = 20, .u16Vfb = 10
|
|
, .u16Hact = 1366, .u16Hbb = 100, .u16Hfb = 88
|
|
, .u16Vpw = 2, .u16Hpw = 20, .bIdv = 0, .bIhs = 0, .bIvs = 0};
|
|
g_panel_desc.stVoPubAttr.stSyncInfo = stLcm185x56_SyncInfo;
|
|
g_panel_desc.stVoPubAttr.stLvdsAttr = lvds_lcm185x56_cfg;
|
|
break;
|
|
case BT_PANEL_TP2803_BT656_1280x720_25FPS_72M:
|
|
g_panel_desc.panel_type = PANEL_MODE_BT;
|
|
g_panel_desc.stVoPubAttr.enIntfType = VO_INTF_BT656;
|
|
g_panel_desc.stVoPubAttr.enIntfSync = VO_OUTPUT_USER;
|
|
VO_SYNC_INFO_S stTp2803_SyncInfo = {.bSynm = 1, .bIop = 1, .u16FrameRate = 25
|
|
, .u16Vact = 720, .u16Vbb = 20, .u16Vfb = 5
|
|
, .u16Hact = 1280, .u16Hbb = 200, .u16Hfb = 400
|
|
, .u16Vpw = 5, .u16Hpw = 40, .bIdv = 0, .bIhs = 0, .bIvs = 0};
|
|
g_panel_desc.stVoPubAttr.stSyncInfo = stTp2803_SyncInfo;
|
|
g_panel_desc.stVoPubAttr.stBtAttr = stTP2803Cfg;
|
|
break;
|
|
case BT_PANEL_NVP6021_BT1120_1920x1080_25FPS_72M:
|
|
g_panel_desc.panel_type = PANEL_MODE_BT;
|
|
g_panel_desc.stVoPubAttr.enIntfType = VO_INTF_BT1120;
|
|
g_panel_desc.stVoPubAttr.enIntfSync = VO_OUTPUT_USER;
|
|
VO_SYNC_INFO_S stNvp6021_SyncInfo = {.bSynm = 1, .bIop = 1, .u16FrameRate = 25
|
|
, .u16Vact = 1080, .u16Vbb = 36, .u16Vfb = 4
|
|
, .u16Hact = 1920, .u16Hbb = 148, .u16Hfb = 528
|
|
, .u16Vpw = 5, .u16Hpw = 44, .bIdv = 0, .bIhs = 0, .bIvs = 0};
|
|
g_panel_desc.stVoPubAttr.stSyncInfo = stNvp6021_SyncInfo;
|
|
g_panel_desc.stVoPubAttr.stBtAttr = stNVP6021Cfg;
|
|
break;
|
|
case I80_PANEL_ST7789V3_HW_MCU_240x320_60FPS:
|
|
g_panel_desc.panel_type = PANEL_MODE_MCU;
|
|
g_panel_desc.stVoPubAttr.enIntfType = VO_INTF_HW_MCU;
|
|
g_panel_desc.stVoPubAttr.enIntfSync = VO_OUTPUT_USER;
|
|
VO_SYNC_INFO_S st7789V3_SyncInfo = {.bSynm = 1, .bIop = 1, .u16FrameRate = 60
|
|
, .u16Vact = 320, .u16Vbb = 0, .u16Vfb = 32
|
|
, .u16Hact = 240, .u16Hbb = 0, .u16Hfb = 16
|
|
, .u16Vpw = 2, .u16Hpw = 2, .bIdv = 0, .bIhs = 1, .bIvs = 1};
|
|
g_panel_desc.stVoPubAttr.stSyncInfo = st7789V3_SyncInfo;
|
|
g_panel_desc.stVoPubAttr.stMcuCfg = st7789v3Cfg;
|
|
break;
|
|
default:
|
|
printf("default\n");
|
|
g_panel_desc.panel_type = PANEL_MODE_DSI;
|
|
g_panel_desc.stdsicfg.dev_cfg = &dev_cfg_hx8394_720x1280;
|
|
g_panel_desc.stdsicfg.hs_timing_cfg = &hs_timing_cfg_hx8394_720x1280;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds = dsi_init_cmds_hx8394_720x1280;
|
|
g_panel_desc.stdsicfg.dsi_init_cmds_size = ARRAY_SIZE(dsi_init_cmds_hx8394_720x1280);
|
|
break;
|
|
}
|
|
if (g_input_para.pn_swap_flag) {
|
|
if (g_panel_desc.panel_type == PANEL_MODE_LVDS) {
|
|
for (CVI_U32 i = 0; i < LANE_MAX_NUM; i++) {
|
|
g_panel_desc.stVoPubAttr.stLvdsAttr.lane_pn_swap[i] =
|
|
(enum VO_LVDS_LANE_ID)g_input_para.lane_pn_swap[i];
|
|
}
|
|
} else if (g_panel_desc.panel_type == PANEL_MODE_DSI) {
|
|
for (CVI_U32 i = 0; i < LANE_MAX_NUM; i++) {
|
|
g_panel_desc.stdsicfg.dev_cfg->lane_pn_swap[i] = g_input_para.lane_pn_swap[i];
|
|
}
|
|
}
|
|
}
|
|
if (g_input_para.lane_id_flag) {
|
|
if (g_panel_desc.panel_type == PANEL_MODE_LVDS) {
|
|
for (CVI_U32 i = 0; i < LANE_MAX_NUM; i++) {
|
|
g_panel_desc.stVoPubAttr.stLvdsAttr.lane_id[i] =
|
|
(enum VO_LVDS_LANE_ID)g_input_para.lane_id[i];
|
|
}
|
|
} else if (g_panel_desc.panel_type == PANEL_MODE_DSI) {
|
|
for (CVI_U32 i = 0; i < LANE_MAX_NUM; i++) {
|
|
g_panel_desc.stdsicfg.dev_cfg->lane_id[i] = g_input_para.lane_id[i];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
CVI_S32 SAMPLE_SET_PANEL_MODEL(char *pinput_str)
|
|
{
|
|
CVI_S32 i = 0;
|
|
bool is_find = false;
|
|
PANEL_MODEL panel_model = DSI_PANEL_HX8394_EVB;
|
|
|
|
for (i = 0; i < PANEL_MAX; i++) {
|
|
if (strcmp(pinput_str, s_panel_model_type_arr[i]) == 0) {
|
|
is_find = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (is_find) {
|
|
panel_model = (PANEL_MODEL)i;
|
|
} else {
|
|
return CVI_FAILURE;
|
|
}
|
|
|
|
g_input_para.panel_model = panel_model;
|
|
g_panel_desc.panel_mode = s_panel_model_type_arr[i];
|
|
return CVI_SUCCESS;
|
|
}
|
|
|
|
CVI_S32 SAMPLE_SET_LANEID(char *pLaneid)
|
|
{
|
|
CVI_S32 lane_id[] = {0, 0, 0, 0, 0};
|
|
|
|
if (pLaneid == NULL)
|
|
return CVI_FAILURE;
|
|
|
|
CVI_S32 n = sscanf(pLaneid, "%02d,%02d,%02d,%02d,%02d",
|
|
&lane_id[0], &lane_id[1], &lane_id[2], &lane_id[3], &lane_id[4]);
|
|
|
|
if (n != sizeof(lane_id)/sizeof(CVI_S32)) {
|
|
return CVI_FAILURE;
|
|
}
|
|
g_input_para.lane_id_flag = true;
|
|
for (CVI_U32 i = 0; i < sizeof(lane_id)/sizeof(CVI_S32); i++) {
|
|
if (lane_id[i] < -1 || lane_id[i] > 5) {
|
|
return CVI_FAILURE;
|
|
}
|
|
g_input_para.lane_id[i] = lane_id[i];
|
|
}
|
|
|
|
return CVI_SUCCESS;
|
|
}
|
|
|
|
CVI_S32 SAMPLE_SET_PNSWAP(char *pPnswap)
|
|
{
|
|
CVI_U32 pnswap[] = {0, 0, 0, 0, 0};
|
|
|
|
if (pPnswap == NULL)
|
|
return CVI_FAILURE;
|
|
|
|
CVI_S32 n = sscanf(pPnswap, "%02d,%02d,%02d,%02d,%02d",
|
|
&pnswap[0], &pnswap[1], &pnswap[2], &pnswap[3], &pnswap[4]);
|
|
|
|
if (n != sizeof(pnswap)/sizeof(CVI_U32)) {
|
|
return CVI_FAILURE;
|
|
}
|
|
g_input_para.pn_swap_flag = true;
|
|
for (CVI_U32 i = 0; i < sizeof(pnswap)/sizeof(CVI_U32); i++) {
|
|
if ((pnswap[i] != 0) && (pnswap[i] != 1)) {
|
|
return CVI_FAILURE;
|
|
}
|
|
g_input_para.lane_pn_swap[i] = (bool)(pnswap[i]);
|
|
}
|
|
|
|
return CVI_SUCCESS;
|
|
}
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
if (argc == 1) {
|
|
printHelp(argv);
|
|
return CVI_SUCCESS;
|
|
}
|
|
|
|
struct option long_options[MAX_OPTIONS + 1];
|
|
CVI_S32 ch, idx, ret, patern_cmd = VO_PAT_MAX;
|
|
bool is_pattern = false;
|
|
|
|
memset((void *)long_options, 0, sizeof(long_options));
|
|
|
|
for (idx = 0; idx < MAX_OPTIONS; idx++) {
|
|
if (long_option_ext[idx].opt.name == NULL)
|
|
break;
|
|
|
|
if (idx >= MAX_OPTIONS) {
|
|
printf("too many options\n");
|
|
return -1;
|
|
}
|
|
|
|
memcpy(&long_options[idx], &long_option_ext[idx].opt, sizeof(struct option));
|
|
}
|
|
|
|
optind = 0;
|
|
while ((ch = getopt_long(argc, argv, "dhs", long_options, &idx)) != -1) {
|
|
switch (ch) {
|
|
case 'l':
|
|
ret = SAMPLE_SET_LANEID(optarg);
|
|
if (ret != CVI_SUCCESS) {
|
|
printf("invalid laneid parameter\n");
|
|
return ret;
|
|
}
|
|
break;
|
|
case 'p':
|
|
ret = SAMPLE_SET_PNSWAP(optarg);
|
|
if (ret != CVI_SUCCESS) {
|
|
printf("invalid pnswap parameter\n");
|
|
return ret;
|
|
}
|
|
break;
|
|
case 'm':
|
|
ret = SAMPLE_SET_PANEL_MODEL(optarg);
|
|
if (ret != CVI_SUCCESS) {
|
|
printf("invalid input panel model\n");
|
|
return ret;
|
|
}
|
|
break;
|
|
case 'd':
|
|
if (argc > 2) {
|
|
printf("usage:%s -d. -d can't use in the same time with other command\n", argv[0]);
|
|
return CVI_FAILURE;
|
|
}
|
|
SAMPLE_DSI_CONTROLE();
|
|
break;
|
|
case 's':
|
|
is_pattern =true;
|
|
if (optarg != NULL){
|
|
sscanf(optarg, "%02d", &patern_cmd);
|
|
if (patern_cmd == VO_PAT_MAX)
|
|
patern_cmd = -1;
|
|
}
|
|
break;
|
|
case 'h':
|
|
printHelp(argv);
|
|
goto EXIT1;
|
|
default:
|
|
printf("ch = %c\n", ch);
|
|
printHelp(argv);
|
|
goto EXIT1;
|
|
}
|
|
}
|
|
|
|
if (optind < argc) {
|
|
printHelp(argv);
|
|
}
|
|
|
|
SAMPLE_SET_PANEL_DESC();
|
|
SAMPLE_PANEL_ENABLE();
|
|
|
|
if (is_pattern) {
|
|
ret = SAMPLE_PANEL_ShowPattern(patern_cmd);
|
|
if (ret != CVI_SUCCESS) {
|
|
printf("Show pattern failed\n");
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
EXIT1:
|
|
if (ret == CVI_SUCCESS)
|
|
SAMPLE_PRT("sample_panel exit success!\n");
|
|
else
|
|
SAMPLE_PRT("sample_panel exit abnormally!\n");
|
|
|
|
return CVI_SUCCESS;
|
|
}
|