Files
gk-sdk/source/bootloader/product/driver/vo/cmd_vo.c
T

250 lines
7.3 KiB
C
Executable File

/*
* Copyright (c) XMEDIA. All rights reserved.
*/
#include <common.h>
#include <command.h>
#include "drv_vo.h"
#include "xmedia_vo.h"
#ifndef CFG_MAXARGS
#define CFG_MAXARGS 10
#endif
#define CFG_MAXARGS_SETVOBG 3
#define CFG_MAXARGS_STARTVO 4
#define CFG_MAXARGS_STOPVO 2
#define CFG_MAXARGS_STARTVL 8
#define CFG_MAXARGS_STOPVL 2
#define CFG_MAXARGS_STARTGX 9
#define CFG_MAXARGS_STOPGX 2
#define CMD_VO_ARGS_BASE10 10
#define CMD_VO_ARGS_BASE16 16
#define CMD_VO_ARGS_BASE_ALL 0
extern int init_vo(xmedia_void);
extern int deinit_vo(xmedia_void);
extern int set_vobg(unsigned int dev, unsigned int rgb);
extern int start_vo(unsigned int dev, xmedia_s32 screen_type);
extern int stop_vo(unsigned int dev);
extern int start_videolayer(unsigned int layer, unsigned long addr, unsigned int strd, xmedia_video_rect layer_rect);
extern int stop_videolayer(unsigned int layer);
extern int start_gx(unsigned int layer, unsigned long addr, unsigned int strd, xmedia_video_rect gx_rect);
extern int stop_gx(unsigned int layer);
extern int check_vo_support(unsigned int dev, xmedia_s32 screen_type);
static int do_initvo(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
init_vo();
return 0;
}
static int do_deinitvo(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
deinit_vo();
return 0;
}
static int do_startvo(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
xmedia_vo_dev dev = 0;
xmedia_s32 screen_type;
if (argc < 3) {
printf("insufficient parameter!\n");
printf("usage:\n%s\n", cmdtp->usage);
return -1;
}
dev = (unsigned int)simple_strtoul(argv[1], NULL, CMD_VO_ARGS_BASE10);
screen_type = (unsigned int)simple_strtoul(argv[2], NULL, CMD_VO_ARGS_BASE10);
if (check_vo_support(dev, screen_type)) {
printf("unsupported parameter!\n");
return -1;
}
start_vo(dev, screen_type);
return 0;
}
static int do_stopvo(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
xmedia_vo_dev dev = 0;
if (argc < 2) {
printf("insufficient parameter!\n");
printf("usage:\n%s\n", cmdtp->usage);
return -1;
}
dev = (unsigned int)simple_strtoul(argv[1], NULL, CMD_VO_ARGS_BASE10);
stop_vo(dev);
return 0;
}
static int start_layer_parse(char *const argv[], unsigned int *layer,
unsigned long *addr, unsigned int *strd, xmedia_video_rect *layer_rect)
{
int ret;
unsigned long layer_tmp, addr_tmp, strd_tmp, x_tmp, y_tmp, width_tmp, height_tmp;
ret = strict_strtoul(argv[1], CMD_VO_ARGS_BASE10, &layer_tmp); /* 1st arg */
if (ret != 0) {
printf("parse layer failed.\n");
return -1;
}
ret = strict_strtoul(argv[2], CMD_VO_ARGS_BASE16, &addr_tmp); /* 2nd arg */
if (ret != 0) {
printf("parse addr failed.\n");
return -1;
}
ret = strict_strtoul(argv[3], CMD_VO_ARGS_BASE10, &strd_tmp); /* 3rd arg */
if (ret != 0) {
printf("parse strd failed.\n");
return -1;
}
ret = strict_strtoul(argv[4], CMD_VO_ARGS_BASE10, &x_tmp); /* 4th arg */
if (ret != 0) {
printf("parse x failed.\n");
return -1;
}
ret = strict_strtoul(argv[5], CMD_VO_ARGS_BASE10, &y_tmp); /* 5th arg */
if (ret != 0) {
printf("parse y failed.\n");
return -1;
}
ret = strict_strtoul(argv[6], CMD_VO_ARGS_BASE10, &width_tmp); /* 6th arg */
if (ret != 0) {
printf("parse width failed.\n");
return -1;
}
ret = strict_strtoul(argv[7], CMD_VO_ARGS_BASE10, &height_tmp); /* 7th arg */
if (ret != 0) {
printf("parse height failed.\n");
return -1;
}
*layer = (unsigned int)layer_tmp;
*addr = addr_tmp;
*strd = (unsigned int)strd_tmp;
layer_rect->x = (unsigned int)x_tmp;
layer_rect->y = (unsigned int)y_tmp;
layer_rect->width = (unsigned int)width_tmp;
layer_rect->height = (unsigned int)height_tmp;
return 0;
}
static int do_startvl(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
int ret;
unsigned int layer, strd;
unsigned long addr;
xmedia_video_rect layer_rect;
if (argc < 8) { /* max 8 args */
printf("insufficient parameter!\n");
printf("usage:\n%s\n", cmdtp->usage);
return -1;
}
ret = start_layer_parse(argv, &layer, &addr, &strd, &layer_rect);
if (ret != 0) {
printf("insufficient parameter!\n");
return -1;
}
ret = start_videolayer(layer, addr, strd, layer_rect);
if (ret != 0) {
printf("start_videolayer error!\n");
return -1;
}
printf("video layer %u opened!\n", layer);
return 0;
}
static int do_stopvl(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
int ret;
unsigned long layer_tmp;
if (argc < 2) { /* max 8 args */
printf("insufficient parameter!\n");
printf("usage:\n%s\n", cmdtp->usage);
return -1;
}
ret = strict_strtoul(argv[1], CMD_VO_ARGS_BASE10, &layer_tmp); /* 1st arg */
if (ret != 0) {
printf("strict_strtoul error\n");
return -1;
}
stop_videolayer(layer_tmp);
return 0;
}
static int do_startgx(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
//todo
return 0;
}
static int do_stopgx(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
//todo
return 0;
}
U_BOOT_CMD(initvo, CFG_MAXARGS, 1, do_initvo,
"initvo", "initvo");
U_BOOT_CMD(deinitvo, CFG_MAXARGS, 1, do_deinitvo,
"deinitvo", "deinitvo");
U_BOOT_CMD(startvo, CFG_MAXARGS, 1, do_startvo,
"startvo - open vo device with a certain output interface.\n"
"\t- startvo [dev screen_type]",
"\nargs: [dev screen_type]\n"
"\t-<dev> : 0: DHD0, 1: DHD1\n"
"\t-<screen_type>: 0:MICROTECH_MTF050_LCD_800X480\n"
"\t-<screen_type>: 1:SATOZ_SAT935_MIPI_800X1280_RGB8888_24BIT\n"
"\t-<screen_type>: 2:SIL9024_BT1120_1920X1080P60\n"
"\t-<screen_type>: 3:MICROTECH_MTF101_FT01_LVDS_800X1280_RGB666_18BIT\n"
"\t-<screen_type>: 4:MICROTECH_MTF101_FS16_LVDS_1280X800_RGB888_24BIT\n"
"\t- ....");
U_BOOT_CMD(stopvo, CFG_MAXARGS, 1, do_stopvo,
"stopvo - close interface of vo device.\n"
"\t- stopvo [dev]",
"\nargs: [dev]\n"
"\t-<dev> : 0(HD0), 1: DHD1\n");
U_BOOT_CMD(startvl, CFG_MAXARGS, 1, do_startvl,
"startvl - open video layer.\n"
"\t- startvl [layer addr stride x y w h]\n",
"\nargs: [layer, addr, stride, x, y, w, h]\n"
"\t-<layer> : 0(V0)\n"
"\t-<addr> : picture address\n"
"\t-<stride> : picture stride\n"
"\t-<x,y,w,h> : display area\n");
U_BOOT_CMD(stopvl, CFG_MAXARGS, 1, do_stopvl,
"stopvl - close video layer.\n"
"\t- stopvl [layer]",
"\nargs: [layer]\n"
"\t-<layer> : 0(V0) 1(V1)\n");
U_BOOT_CMD(startgx, CFG_MAXARGS, 1, do_startgx,
"startgx - open graphics layer.\n"
"\t- startgx [layer addr stride x y w h]\n",
"\nargs: [layer, addr, stride, x, y, w, h]\n"
"\t-<layer> : 0(G0)\n"
"\t-<addr> : picture address\n"
"\t-<stride> : picture stride\n"
"\t-<x,y,w,h> : display area\n");
U_BOOT_CMD(stopgx, CFG_MAXARGS, 1, do_stopgx,
"stopgx - close graphics layer.\n"
"\t- stopgx [layer]",
"\nargs: [layer]\n"
"\t-<layer> : 0(G0)\n");