static void uc_spic_set_buffer( volatile u8 *hwregs, CoreSurfaceBufferLock *lock ) { if (lock) { VIDEO_OUT(hwregs, SUBP_STARTADDR, lock->offset); VIDEO_OUT(hwregs, SUBP_CONTROL_STRIDE, (VIDEO_IN(hwregs, SUBP_CONTROL_STRIDE) & ~SUBP_STRIDE_MASK) | (lock->pitch & SUBP_STRIDE_MASK) | SUBP_AI44 ); } }
static DFBResult uc_ovl_remove(CoreLayer *layer, void *driver_data, void *layer_data, void *region_data) { UcDriverData* ucdrv = (UcDriverData*) driver_data; UcOverlayData* ucovl = (UcOverlayData*) layer_data; volatile u8* vio = ucdrv->hwregs; ucovl->v1.isenabled = false; uc_ovl_vcmd_wait(vio); VIDEO_OUT(vio, V_FIFO_CONTROL, UC_MAP_V1_FIFO_CONTROL(16,12,8)); // VIDEO_OUT(vio, ALPHA_V3_FIFO_CONTROL, 0x0407181f); if (ucovl->hwrev == 0x10) { VIDEO_OUT(vio, V1_ColorSpaceReg_1, ColorSpaceValue_1_3123C0); VIDEO_OUT(vio, V1_ColorSpaceReg_2, ColorSpaceValue_2_3123C0); } else { VIDEO_OUT(vio, V1_ColorSpaceReg_1, ColorSpaceValue_1); VIDEO_OUT(vio, V1_ColorSpaceReg_2, ColorSpaceValue_2); } VIDEO_OUT(vio, HQV_CONTROL, VIDEO_IN(vio, HQV_CONTROL) & ~HQV_ENABLE); VIDEO_OUT(vio, V1_CONTROL, VIDEO_IN(vio, V1_CONTROL) & ~V1_ENABLE); // VIDEO_OUT(vio, V3_CONTROL, VIDEO_IN(vio, V3_CONTROL) & ~V3_ENABLE); VIDEO_OUT(vio, V_COMPOSE_MODE, VIDEO_IN(vio, V_COMPOSE_MODE) | V1_COMMAND_FIRE); ucovl->surface = NULL; return DFB_OK; }
static DFBResult osdSetRegion( CoreLayer *layer, void *driver_data, void *layer_data, void *region_data, CoreLayerRegionConfig *config, CoreLayerRegionConfigFlags updated, CoreSurface *surface, CorePalette *palette, CoreSurfaceBufferLock *lock ) { DFBResult ret; UcDriverData *ucdrv = (UcDriverData*) driver_data; /* call the original function */ ret = ucOldPrimaryFuncs.SetRegion( layer, ucOldPrimaryDriverData, layer_data, region_data, config, updated, surface, palette, lock ); if (ret) return ret; uc_ovl_vcmd_wait(ucdrv->hwregs); /* select pixel based or global alpha */ if (!ucdrv->ovl) // overlay not present return DFB_OK; if (config->options & DLOP_ALPHACHANNEL) ucdrv->ovl->opacity_primary = -1; // use primary alpha for overlay else if (config->options & DLOP_OPACITY) ucdrv->ovl->opacity_primary = config->opacity ^ 0xff; // use inverse for overlay else ucdrv->ovl->opacity_primary = 0x00; // primary opaque == overlay transparent if (ucdrv->ovl->v1.level < 0) // primary on top? { VIDEO_OUT(ucdrv->hwregs, V_ALPHA_CONTROL, uc_ovl_map_alpha(ucdrv->ovl->opacity_primary)); VIDEO_OUT(ucdrv->hwregs, V_COMPOSE_MODE, VIDEO_IN(ucdrv->hwregs, V_COMPOSE_MODE) | V1_COMMAND_FIRE); } return DFB_OK; }
void uc_ovl_vcmd_wait(volatile u8* vio) { while ((VIDEO_IN(vio, V_COMPOSE_MODE) & (V1_COMMAND_FIRE | V3_COMMAND_FIRE))); }
static void uc_spic_enable( volatile u8 *hwregs, bool enable ) { VIDEO_OUT(hwregs, SUBP_CONTROL_STRIDE, (VIDEO_IN(hwregs, SUBP_CONTROL_STRIDE) & ~SUBP_HQV_ENABLE) | (enable ? SUBP_HQV_ENABLE : 0)); }