nt9856x/BSP/u-boot/board/novatek/common/nvt_logo/cmd_bootlogo.c
2023-03-28 15:07:53 +08:00

261 lines
9.3 KiB
C
Executable File

#include <common.h>
#include <command.h>
#include <asm/byteorder.h>
#include <asm/io.h>
#include <part.h>
#include <asm/hardware.h>
#include <asm/nvt-common/nvt_types.h>
#include <asm/nvt-common/nvt_common.h>
#include <asm/nvt-common/shm_info.h>
#include <stdlib.h>
#include <linux/arm-smccc.h>
#include "cmd_bootlogo.h"
#include "nvt_gpio.h"
#include "nvt_display_common.h"
#include <asm/arch/display.h>
#include <asm/arch/top.h>
#include <linux/libfdt.h>
#include <asm/arch/gpio.h>
#include <asm/arch/IOAddress.h>
#include <pwm.h>
#include "logo.dat" //jpg bitstream binary
UINT32 dma_getDramBaseAddr(DMA_ID id);
UINT32 dma_getDramCapacity(DMA_ID id);
static UINT32 chip_id = 0x0;
static int do_bootlogo(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
PDISP_OBJ p_emu_disp_obj;
DISPCTRL_PARAM emu_disp_ctrl;
DISPDEV_PARAM emu_disp_dev;
DISPLAYER_PARAM emu_disp_lyr;
ulong logo_addr, logo_size;
unsigned int img_width, img_height;
int ret=0;
int nodeoffset; /* next node offset from libfdt */
const u32 *nodep; /* property node pointer */
int len;
int clock_source = 1;
int clock_freq = 300000000;
UINT32 ui_reg_offset;
int logo_fdt_offset = 0;
int memcfg_fdt_offset = 0;
uint8_t *nvt_orig_fdt_buffer = NULL;
_W_LOG("do_bootlogo\r\n");
memcfg_fdt_offset = fdt_path_offset(nvt_fdt_buffer, "/nvt_memory_cfg/fdt");
if (memcfg_fdt_offset < 0) {
printf("nvt_memory_cfg node isn't existed\r\n");
} else {
nodep = (u32 *)fdt_getprop(nvt_fdt_buffer, memcfg_fdt_offset, "reg", NULL);
if (nodep > 0) {
nvt_orig_fdt_buffer = ( uint8_t *)be32_to_cpu(nodep[0]);
if (nvt_orig_fdt_buffer > 0) {
printf("do_bootlogo: nvt_orig_fdt_buffer = 0x%08x\r\n", (uint32_t)nvt_orig_fdt_buffer);
logo_fdt_offset = fdt_path_offset(nvt_orig_fdt_buffer, "/logo");
if (logo_fdt_offset < 0) {
printf("mem-tbi.dtsi fdt logo node isn't existed\r\n");
} else {
fdt_setprop_u32(nvt_orig_fdt_buffer, logo_fdt_offset, "enable", 0x1); // 0x1 -> enable logo display
}
}
}
}
logo_fdt_offset = fdt_path_offset(nvt_fdt_buffer, "/logo");
if (logo_fdt_offset < 0) {
printf("logo node isn't existed\r\n");
} else {
fdt_setprop_u32(nvt_fdt_buffer, logo_fdt_offset, "enable", 0x1); // 0x1 -> enable logo display
}
nvt_pinmux_probe();
#if 1 //hy5137_st7701s dsi lcd
nvt_gpio_setDir(P_GPIO(2), GPIO_DIR_OUTPUT),
nvt_gpio_setPin(P_GPIO(2));
mdelay(2);
nvt_gpio_clearPin(P_GPIO(2));
mdelay(5);
nvt_gpio_setPin(P_GPIO(2));
nvt_gpio_setDir(P_GPIO(0), GPIO_DIR_OUTPUT),
nvt_gpio_setPin(P_GPIO(0));
#else //y817_st7701s dsi lcd
nvt_gpio_setDir(C_GPIO(7), GPIO_DIR_OUTPUT),
nvt_gpio_setPin(C_GPIO(7));
mdelay(2);
nvt_gpio_clearPin(C_GPIO(7));
mdelay(5);
nvt_gpio_setPin(C_GPIO(7));
nvt_gpio_setDir(L_GPIO(1), GPIO_DIR_OUTPUT),
nvt_gpio_setPin(L_GPIO(1));
nvt_gpio_setDir(P_GPIO(11), GPIO_DIR_OUTPUT),
nvt_gpio_setPin(P_GPIO(11));
#endif
nvt_display_dsi_reset();//only for DSI LCD
p_emu_disp_obj = disp_get_display_object(DISP_1);
p_emu_disp_obj->open();
nodeoffset = fdt_path_offset((const void *)nvt_fdt_buffer, "/ide@f0800000");
if (nodeoffset < 0) {
printf("no find node ide@f0800000\n");
} else {
nodep = fdt_getprop((const void *)nvt_fdt_buffer, nodeoffset, "clock-source", &len);
if (len > 0) {
clock_source = be32_to_cpu(nodep[0]);
} else {
printf("no ide clock_source info, used default PLL\n");
}
nodep = fdt_getprop((const void *)nvt_fdt_buffer, nodeoffset, "source-frequency", &len);
if (len > 0) {
clock_freq = be32_to_cpu(nodep[0]);
} else {
printf("no ide source-frequency info, used default \n");
}
//printf("lcd clk src:%d freq:%d : 0x%x : %d\n", clock_source, clock_freq, *nodep, len);
}
emu_disp_dev.SEL.HOOK_DEVICE_OBJECT.dev_id = DISPDEV_ID_PANEL;
emu_disp_dev.SEL.HOOK_DEVICE_OBJECT.p_disp_dev_obj = dispdev_get_lcd1_dev_obj();
p_emu_disp_obj->dev_ctrl(DISPDEV_HOOK_DEVICE_OBJECT, &emu_disp_dev);
pll_set_ideclock_rate(clock_source, clock_freq);
emu_disp_ctrl.SEL.SET_SRCCLK.src_clk = (DISPCTRL_SRCCLK)clock_source;//DISPCTRL_SRCCLK_PLL6;
p_emu_disp_obj->disp_ctrl(DISPCTRL_SET_SRCCLK, &emu_disp_ctrl);
////////////////////////////DISP-1//////////////////////////////////////////////////
emu_disp_dev.SEL.SET_REG_IF.lcd_ctrl = DISPDEV_LCDCTRL_GPIO;
emu_disp_dev.SEL.SET_REG_IF.ui_sif_ch = SIF_CH2;
emu_disp_dev.SEL.SET_REG_IF.ui_gpio_sen = L_GPIO(22);
emu_disp_dev.SEL.SET_REG_IF.ui_gpio_clk = L_GPIO(23);
emu_disp_dev.SEL.SET_REG_IF.ui_gpio_data = L_GPIO(24);
p_emu_disp_obj->dev_ctrl(DISPDEV_SET_REG_IF, &emu_disp_dev);
p_emu_disp_obj->dev_ctrl(DISPDEV_CLOSE_DEVICE, NULL);
emu_disp_dev.SEL.GET_PREDISPSIZE.dev_id = DISPDEV_ID_PANEL;
p_emu_disp_obj->dev_ctrl(DISPDEV_GET_PREDISPSIZE, &emu_disp_dev);
_Y_LOG("Pre Get Size =%d, %d\r\n", (int)(emu_disp_dev.SEL.GET_PREDISPSIZE.ui_buf_width), (int)(emu_disp_dev.SEL.GET_PREDISPSIZE.ui_buf_height));
p_emu_disp_obj->dev_ctrl(DISPDEV_GET_LCDMODE, &emu_disp_dev);
_Y_LOG("LCD mode =%d\r\n", (int)(emu_disp_dev.SEL.GET_LCDMODE.mode));
emu_disp_dev.SEL.OPEN_DEVICE.dev_id = DISPDEV_ID_PANEL;
p_emu_disp_obj->dev_ctrl(DISPDEV_OPEN_DEVICE, &emu_disp_dev);;
p_emu_disp_obj->dev_ctrl(DISPDEV_GET_DISPSIZE, &emu_disp_dev);
emu_disp_lyr.SEL.SET_WINSIZE.ui_win_width = emu_disp_dev.SEL.GET_DISPSIZE.ui_buf_width;;
emu_disp_lyr.SEL.SET_WINSIZE.ui_win_height = emu_disp_dev.SEL.GET_DISPSIZE.ui_buf_height;
emu_disp_lyr.SEL.SET_WINSIZE.i_win_ofs_x = 0;
emu_disp_lyr.SEL.SET_WINSIZE.i_win_ofs_y = 0;
p_emu_disp_obj->disp_lyr_ctrl(DISPLAYER_VDO1, DISPLAYER_OP_SET_WINSIZE, &emu_disp_lyr);
_W_LOG(fmt,args...)("DISPLAYER_OP_SET_WINSIZE %d %d\r\n",emu_disp_lyr.SEL.SET_WINSIZE.ui_win_width,emu_disp_lyr.SEL.SET_WINSIZE.ui_win_height);
ret = nvt_getfdt_logo_addr_size((ulong)nvt_fdt_buffer, &logo_addr, &logo_size);
if(ret!=0) {
printf("err:%d\r\n",ret);
return -1;
}
_Y_LOG("logo_addr %x logo_size %x\r\n",logo_addr,logo_size);
{
_Y_LOG("start JPEG decode size: %x\n",sizeof(inbuf));
jpeg_setfmt(1);
jpeg_decode(inbuf, (unsigned char*)logo_addr);
jpeg_getdim(&img_width, &img_height);
_Y_LOG("image size: %d x %d\n", img_width, img_height);
if(logo_size < img_width*img_height*2) {
printf("(%d,%d) size small 0x%x\r\n",img_width,img_height,logo_size);
return -1;
}
flush_dcache_range((unsigned long)logo_addr,(unsigned long)(logo_addr+logo_size));
}
printf("do_bootlogo: img_width = %d\r\n", img_width);
printf("do_bootlogo: img_height = %d\r\n", img_height);
{
UINT32 buf_w = img_width;
UINT32 buf_h = img_height;
UINT32 uiVDO_YAddr = logo_addr;
UINT32 VDO_BUF_SIZE = buf_w*buf_h;
UINT32 uiVDO_UVAddr = uiVDO_YAddr+VDO_BUF_SIZE;
UINT32 i,j, lineoffset = img_width;
UINT32 pixeloffset = 0;
_W_LOG("show logo %x %x\r\n",uiVDO_YAddr,uiVDO_UVAddr);
emu_disp_lyr.SEL.SET_MODE.buf_format = DISPBUFFORMAT_YUV422PACK;
emu_disp_lyr.SEL.SET_MODE.buf_mode = DISPBUFMODE_BUFFER_REPEAT;
emu_disp_lyr.SEL.SET_MODE.buf_number = DISPBUFNUM_3;
p_emu_disp_obj->disp_lyr_ctrl(DISPLAYER_VDO1, DISPLAYER_OP_SET_MODE, &emu_disp_lyr);
_W_LOG("DISPLAYER_OP_SET_MODE\r\n");
emu_disp_lyr.SEL.SET_BUFSIZE.ui_buf_width = buf_w;
emu_disp_lyr.SEL.SET_BUFSIZE.ui_buf_height = buf_h;
emu_disp_lyr.SEL.SET_BUFSIZE.ui_buf_line_ofs = buf_w;
p_emu_disp_obj->disp_lyr_ctrl(DISPLAYER_VDO1, DISPLAYER_OP_SET_BUFSIZE, &emu_disp_lyr);
_W_LOG("DISPLAYER_OP_SET_BUFSIZE %d %d\r\n",buf_w,buf_h);
#if 0 //fill YUV color for test
memset((void *)uiVDO_YAddr, 0x4C, VDO_BUF_SIZE/2);
memset((void *)uiVDO_YAddr+VDO_BUF_SIZE/2, 0x67, VDO_BUF_SIZE/2);
memset((void *)uiVDO_UVAddr, 0x4C, VDO_BUF_SIZE/2);
memset((void *)uiVDO_UVAddr+VDO_BUF_SIZE/2, 0xAD, VDO_BUF_SIZE/2);
#endif
memset((void *)&emu_disp_lyr,0,sizeof(DISPLAYER_PARAM));
emu_disp_lyr.SEL.SET_VDOBUFADDR.buf_sel = DISPBUFADR_0;
emu_disp_lyr.SEL.SET_VDOBUFADDR.ui_addr_y0 = uiVDO_YAddr;
emu_disp_lyr.SEL.SET_VDOBUFADDR.ui_addr_cb0 = uiVDO_UVAddr;
emu_disp_lyr.SEL.SET_VDOBUFADDR.ui_addr_cr0 = uiVDO_UVAddr;
p_emu_disp_obj->disp_lyr_ctrl(DISPLAYER_VDO1,DISPLAYER_OP_SET_VDOBUFADDR,&emu_disp_lyr);
_W_LOG("DISPLAYER_OP_SET_VDOBUFADDR\r\n");
emu_disp_ctrl.SEL.SET_ALL_LYR_EN.b_en = TRUE;
emu_disp_ctrl.SEL.SET_ALL_LYR_EN.disp_lyr = DISPLAYER_VDO1;
p_emu_disp_obj->disp_ctrl(DISPCTRL_SET_ALL_LYR_EN, &emu_disp_ctrl);
p_emu_disp_obj->load(TRUE);
p_emu_disp_obj->wait_frm_end(TRUE);
_W_LOG("DISPCTRL_SET_ALL_LYR_EN\r\n");
#if 0 //test for progresive bar
mdelay(1000);
for (i=0; i < 10; i++) {
//printf("do_bootlogo: i = %d\r\n", i);
for (j=0; j < 20; j++) {
pixeloffset = 320*200 + 80 + i*16 + j*lineoffset;
//pixeloffset = i*16 + j*lineoffset;
printf("do_bootlogo: pixeloffset = %d\r\n", pixeloffset);
memset((void *)(uiVDO_YAddr+pixeloffset), 0x4C, 16);
memset((void *)(uiVDO_UVAddr+pixeloffset) , 0x4C, 16);
}
flush_dcache_range((unsigned long)logo_addr,(unsigned long)(logo_addr+logo_size));
mdelay(500);
}
#endif
}
return 0;
}
U_BOOT_CMD(
bootlogo, 2, 1, do_bootlogo,
"show lcd bootlogo",
"no argument means LCD output only, \n"
);