| /******************************************************************************* |
| * Copyright (C) Marvell International Ltd. and its affiliates |
| * |
| * Marvell GPL License Option |
| * |
| * If you received this File from Marvell, you may opt to use, redistribute and/or |
| * modify this File in accordance with the terms and conditions of the General |
| * Public License Version 2, June 1991 (the "GPL License"), a copy of which is |
| * available along with the File in the license.txt file or by writing to the Free |
| * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or |
| * on the worldwide web at http://www.gnu.org/licenses/gpl.txt. |
| * |
| * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED |
| * WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY |
| * DISCLAIMED. The GPL License provides additional details about this warranty |
| * disclaimer. |
| ********************************************************************************/ |
| |
| #include "fastlogo.h" |
| |
| #include "galois_io.h" |
| #include "api_dhub.h" |
| #include "api_avio_dhub.h" |
| #include "Galois_memmap.h" |
| #include "gicDiag.h" |
| #include "pic.h" |
| |
| #include "thinvpp.h" |
| |
| #include "error_logo_data.h" |
| #include "normal_logo_data.h" |
| #include "avpll.h" |
| |
| #ifndef bTST |
| #define bTST(x, b) (((x) >> (b)) & 1) |
| #endif |
| |
| #ifndef BFM_HOST_Bus_Write32 |
| #define BFM_HOST_Bus_Write32 GA_REG_WORD32_WRITE |
| #endif |
| |
| volatile unsigned logo_isr_count; |
| |
| #define printf(fmt...) |
| |
| #ifndef EMMC_BOOT |
| extern void IRQ_Handler(void); |
| static void InstallHighHandler(unsigned int handlerAddr, unsigned int vector) |
| { |
| //load PC with content at current PC + 0x38, |
| //since current PC is vector+0x8, the handler should be at vector+0x40 |
| BFM_HOST_Bus_Write32(vector, 0xE59FF038); |
| BFM_HOST_Bus_Write32(vector+0x40, handlerAddr); |
| } |
| |
| static void EnableIRQ(void) |
| { |
| __asm__ |
| __volatile__( |
| "MRS r0, CPSR" "\n\t" |
| "BIC r0, r0, #0x80" "\n\t" |
| "MSR CPSR, r0" "\n\t" |
| : |
| : |
| :"r0" |
| ); |
| } |
| #endif |
| |
| static void showlogo_init_irq(void) |
| { |
| unsigned cpu_id=0; |
| |
| #ifdef EMMC_BOOT |
| //bootloader.c should have called do_emmcinit() to setup the irq |
| #else |
| //printf("%s, InstallHighHandler\n", __FUNCTION__) ; |
| InstallHighHandler((unsigned int)IRQ_Handler, MEMMAP_HIGH_EXCEPT_IRQ_REG); |
| |
| //GIC distribution interface is only needed to be initialized once |
| //but the CPU interface needs to be initalized by both CPU cores |
| //CPU interface registers are banked (same address) |
| //So we will have both first and second CPU to call the same funtion |
| //printf("%s, initMPGIC\n", __FUNCTION__) ; |
| initMPGIC(); |
| |
| //printf("%s, EnableIRQ\n", __FUNCTION__) ; |
| EnableIRQ(); |
| #endif |
| |
| printf("[showlogo] Enable IRQ_dHubIntrAvio0(0x%x) for cpu %u\n", MP_BERLIN_INTR_ID(IRQ_dHubIntrAvio0), cpu_id); |
| diag_GICSetInt(cpu_id, MP_BERLIN_INTR_ID(IRQ_dHubIntrAvio0), INT_ENABLE); |
| } |
| |
| |
| static VBUF_INFO vbuf; |
| int showlogo_start(int error) |
| { |
| VPP_WIN_ATTR showlogo_attr; |
| VPP_WIN showlogo_win; |
| int yuv_logo_width, yuv_logo_height, yuv_logo_stride; |
| void *yuv_logo; |
| |
| if (error) { |
| yuv_logo_width = error_yuv_logo_width; |
| yuv_logo_height = error_yuv_logo_height; |
| yuv_logo = error_yuv_logo; |
| } else { |
| yuv_logo_width = normal_yuv_logo_width; |
| yuv_logo_height = normal_yuv_logo_height; |
| yuv_logo = normal_yuv_logo; |
| } |
| yuv_logo_stride = yuv_logo_width * 2; |
| |
| printf("[showlogo] start"); |
| logo_isr_count = 0; |
| showlogo_init_irq(); |
| |
| vbuf.m_disp_offset = 0; |
| vbuf.m_active_left = (720 - yuv_logo_width)/2; // at center |
| vbuf.m_active_top = (480 - yuv_logo_height)/2; // at center |
| // adjust the following three fields to reflect the actual logo dimensions |
| vbuf.m_buf_stride = yuv_logo_stride; |
| vbuf.m_active_width = yuv_logo_width; |
| vbuf.m_active_height = yuv_logo_height; |
| |
| vbuf.alpha = 255; |
| vbuf.bgcolor = 0x00800080; // black |
| vbuf.m_pbuf_start = (void *) yuv_logo; |
| printf("[showlogo] frame start at 0x%x\n", vbuf.m_pbuf_start) ; |
| MV_THINVPP_SetMainDisplayFrame(&vbuf); |
| |
| showlogo_win.x = 0; |
| showlogo_win.y = 0; |
| showlogo_win.width = 720; |
| showlogo_win.height = 480; |
| showlogo_attr.bgcolor = vbuf.bgcolor; |
| showlogo_attr.alpha = vbuf.alpha; |
| MV_THINVPP_OpenDispWindow(PLANE_MAIN, &showlogo_win, &showlogo_attr); |
| return 0; |
| } |
| |
| int showlogo_stop() |
| { |
| printf("[showlogo] isr_count=%u\n", logo_isr_count) ; |
| |
| MV_THINVPP_CloseDispWindow(); |
| MV_THINVPP_Stop(); |
| MV_THINVPP_Destroy(); |
| |
| MV_THINVPP_Create(MEMMAP_VPP_REG_BASE, THINVPP_OPTION_DEFAULT); |
| MV_THINVPP_Reset(); |
| MV_THINVPP_Config(); |
| MV_THINVPP_SetCPCBOutputResolution(CPCB_1, RES_525P5994, OUTPUT_BIT_DEPTH_8BIT); |
| |
| printf("[showlogo] stopped\n"); |
| return 0; |
| } |
| |
| void showlogo_isr(void) |
| { |
| int instat; |
| HDL_semaphore *pSemHandle; |
| |
| ++logo_isr_count; |
| |
| /* VPP interrupt handling */ |
| pSemHandle = dhub_semaphore(&VPP_dhubHandle.dhub); |
| instat = semaphore_chk_full(pSemHandle, -1); |
| |
| if (bTST(instat, avioDhubSemMap_vpp_vppCPCB0_intr)) |
| { |
| semaphore_pop(pSemHandle, avioDhubSemMap_vpp_vppCPCB0_intr, 1); |
| semaphore_clr_full(pSemHandle, avioDhubSemMap_vpp_vppCPCB0_intr); |
| THINVPP_CPCB_ISR_service(thinvpp_obj, CPCB_1); |
| } |
| } |
| |
| void fastlogo_init(void) |
| { |
| printf("[fastlogo] init."); |
| |
| AVPLL_Enable(); |
| |
| DhubInitialization(0, VPP_DHUB_BASE, VPP_HBO_SRAM_BASE, |
| &VPP_dhubHandle, VPP_config, VPP_NUM_OF_CHANNELS); |
| DhubInitialization(0, AG_DHUB_BASE, AG_HBO_SRAM_BASE, |
| &AG_dhubHandle, AG_config, AG_NUM_OF_CHANNELS); |
| |
| MV_THINVPP_Create(MEMMAP_VPP_REG_BASE, THINVPP_OPTION_SHOWLOGO); |
| MV_THINVPP_Reset(); |
| MV_THINVPP_Config(); |
| MV_THINVPP_SetCPCBOutputResolution(CPCB_1, RES_525P5994, OUTPUT_BIT_DEPTH_8BIT); |
| |
| printf("[fastlogo] started.\n"); |
| } |