// change tv mode and show logo immediatly when hdmi pluged int set_mode_and_show_logo(int hpd_state) { int value; logo_object_t* plogo = get_current_logo_obj(); if((plogo->para.vout_mode & VMODE_MODE_BIT_MASK) > VMODE_4K2K_SMPTE) { return 0; // MID } printk("hdmi detect: %s.\n", (hpd_state==1)?"plug":"unplug"); // osd2 freescale enable, the logo is shown on osd2, reset freescale. value = aml_read_reg32(P_VPP_OSD_SC_CTRL0) & 0xb; if(value == 0x9) { vmode_t cur_mode; if (hpd_state == 0){ cur_mode = cvbsmode_hdmionly; } else{ cur_mode = hdmimode_hdmionly; } if(tvmode != cur_mode) { tvmode = cur_mode; osd_enable_hw(0, plogo->para.output_dev_type); set_current_vmode(cur_mode); vout_notifier_call_chain(VOUT_EVENT_MODE_CHANGE,&cur_mode) ; set_osd_freescaler(plogo->para.output_dev_type, plogo, cur_mode); } } return 1; }
static int osd_probe(struct platform_device *pdev) { int r; struct fb_info *fbi=NULL; const vinfo_t *vinfo; struct fb_var_screeninfo *var; struct fb_fix_screeninfo *fix; struct resource *mem; int index,Bpp; logo_object_t *init_logo_obj=NULL; int logo_osd_index=0,i; myfb_dev_t *fbdev = NULL; vout_register_client(&osd_notifier_nb); #ifdef CONFIG_AM_LOGO init_logo_obj = get_current_logo_obj(); if( init_logo_obj ) { if(init_logo_obj->para.output_dev_type<LOGO_DEV_VID) //osd0 or osd1 { logo_osd_index= init_logo_obj->para.output_dev_type; }else{ if(init_logo_obj->para.output_dev_type==LOGO_DEV_VID) init_logo_obj=NULL; //if logo device on video layer , } //we cant use it . } #endif if (NULL==init_logo_obj ) { #ifdef CONFIG_AM_LCD_OUTPUT set_current_vmode(VMODE_LCD); #else set_current_vmode(VMODE_720P); #endif osddev_init(); } vinfo = get_current_vinfo(); for (index=0;index<OSD_COUNT;index++) { //platform resource if (!(mem = platform_get_resource(pdev, IORESOURCE_MEM, index))) { amlog_level(LOG_LEVEL_HIGH,"No frame buffer memory define.\n"); r = -EFAULT; goto failed2; } //if we have no resource then no need to create this device. amlog_level(LOG_LEVEL_HIGH,"[osd%d] 0x%x-0x%x\n",index,mem->start,mem->end); if (!mem || mem->start== 0 || mem->end==0 || mem->start==mem->end) { continue ; } fbi = framebuffer_alloc(sizeof(struct myfb_dev), &pdev->dev); if(!fbi) { r = -ENOMEM; goto failed1; } fbdev = (struct myfb_dev *)fbi->par; fbdev->fb_info = fbi; fbdev->dev = pdev; mutex_init(&fbdev->lock); var = &fbi->var; fix = &fbi->fix; gp_fbdev_list[index]=fbdev; fbdev->fb_mem_paddr = mem->start; fbdev->fb_len = mem->end - mem->start + 1; fbdev->fb_mem_vaddr = ioremap_wc(fbdev->fb_mem_paddr, fbdev->fb_len); if (!fbdev->fb_mem_vaddr) { amlog_level(LOG_LEVEL_HIGH,"failed to ioremap framebuffer\n"); r = -ENOMEM; goto failed1; } //clear framebuffer memory amlog_level(LOG_LEVEL_HIGH,"Frame buffer memory assigned at phy:0x%08x, vir:0x%p, size=%dK\n", fbdev->fb_mem_paddr, fbdev->fb_mem_vaddr, fbdev->fb_len >> 10); if(init_logo_obj && index==logo_osd_index ) //adjust default var info { int bpp=init_logo_obj->dev->output_dev.osd.color_depth;//bytes per pixel mydef_var[index].xres=init_logo_obj->dev->vinfo->width; mydef_var[index].yres=init_logo_obj->dev->vinfo->height; mydef_var[index].xres_virtual=init_logo_obj->dev->vinfo->width; mydef_var[index].yres_virtual=init_logo_obj->dev->vinfo->height<<1;//logo always use double buffer mydef_var[index].bits_per_pixel=bpp ; amlog_level(LOG_LEVEL_HIGH,"init fbdev bpp is :%d\r\n",mydef_var[index].bits_per_pixel); if(mydef_var[index].bits_per_pixel>32) { mydef_var[index].bits_per_pixel=32; } } else { amlog_level(LOG_LEVEL_HIGH,"---------------clear framebuffer%d memory \r\n",index); memset((char*)fbdev->fb_mem_vaddr, 0x80, fbdev->fb_len); } _fbdev_set_default(fbdev,index); if(NULL==fbdev->color) { r = -ENOENT; goto failed1; } Bpp=(fbdev->color->color_index >8?(fbdev->color->color_index>16?(fbdev->color->color_index>24?4:3):2):1); fix->line_length=var->xres_virtual*Bpp; fix->smem_start = fbdev->fb_mem_paddr; fix->smem_len = fbdev->fb_len; if (fb_alloc_cmap(&fbi->cmap, 16, 0) != 0) { amlog_level(LOG_LEVEL_HIGH,"unable to allocate color map memory\n"); r = -ENOMEM; goto failed2; } if (!(fbi->pseudo_palette = kmalloc(sizeof(u32) * 16, GFP_KERNEL))) { amlog_level(LOG_LEVEL_HIGH,"unable to allocate pseudo palette memory\n"); r = -ENOMEM; goto failed2; } memset(fbi->pseudo_palette, 0, sizeof(u32) * 16); fbi->fbops = &osd_ops; fbi->screen_base = (char __iomem *)fbdev->fb_mem_vaddr ; fbi->screen_size = fix->smem_len; set_default_display_axis(&fbdev->fb_info->var,&fbdev->osd_ctl,vinfo); osd_check_var(var, fbi); register_framebuffer(fbi); if(NULL==init_logo_obj )//if we have init a logo object ,then no need to setup hardware . { osddev_set(fbdev); } for(i=0;i<ARRAY_SIZE(osd_attrs);i++) r=device_create_file(fbi->dev, &osd_attrs[i]); } index=0; #ifdef CONFIG_HAS_EARLYSUSPEND early_suspend.level = EARLY_SUSPEND_LEVEL_STOP_DRAWING; early_suspend.suspend = osd_early_suspend; early_suspend.resume = osd_late_resume; register_early_suspend(&early_suspend); #endif amlog_level(LOG_LEVEL_HIGH,"osd probe ok \r\n"); return 0; failed2: fb_dealloc_cmap(&fbi->cmap); failed1: amlog_level(LOG_LEVEL_HIGH,"Driver module insert failed.\n"); return r; }