📄 pm3fb.c
字号:
fbgen_install_cmap(0, &l_fb_info->gen); if (register_framebuffer(&l_fb_info->gen.info) < 0) { DPRINTK(1, "Couldn't register framebuffer\n"); return; } PM3_WRITE_DAC_REG(PM3RD_CursorMode, PM3RD_CursorMode_CURSOR_DISABLE); PM3_SHOW_CUR_MODE; pm3fb_write_mode(l_fb_info); printk("fb%d: %s, using %uK of video memory (%s)\n", GET_FB_IDX(l_fb_info->gen.info.node), permedia3_name, (u32) (l_fb_info->fb_size >> 10), cardbase[l_fb_info->board_type].cardname);}/* **************************************************** *//* ***** accelerated permedia3-specific functions ***** *//* **************************************************** */#ifdef PM3FB_USE_ACCELstatic void pm3fb_wait_pm3(struct pm3fb_info *l_fb_info){ DTRACE; PM3_SLOW_WRITE_REG(PM3FilterMode, PM3FilterModeSync); PM3_SLOW_WRITE_REG(PM3Sync, 0); mb(); do { while ((PM3_READ_REG(PM3OutFIFOWords)) == 0); rmb(); } while ((PM3_READ_REG(PM3OutputFifo)) != PM3Sync_Tag);}static void pm3fb_init_engine(struct pm3fb_info *l_fb_info){ PM3_SLOW_WRITE_REG(PM3FilterMode, PM3FilterModeSync); PM3_SLOW_WRITE_REG(PM3StatisticMode, 0x0); PM3_SLOW_WRITE_REG(PM3DeltaMode, 0x0); PM3_SLOW_WRITE_REG(PM3RasterizerMode, 0x0); PM3_SLOW_WRITE_REG(PM3ScissorMode, 0x0); PM3_SLOW_WRITE_REG(PM3LineStippleMode, 0x0); PM3_SLOW_WRITE_REG(PM3AreaStippleMode, 0x0); PM3_SLOW_WRITE_REG(PM3GIDMode, 0x0); PM3_SLOW_WRITE_REG(PM3DepthMode, 0x0); PM3_SLOW_WRITE_REG(PM3StencilMode, 0x0); PM3_SLOW_WRITE_REG(PM3StencilData, 0x0); PM3_SLOW_WRITE_REG(PM3ColorDDAMode, 0x0); PM3_SLOW_WRITE_REG(PM3TextureCoordMode, 0x0); PM3_SLOW_WRITE_REG(PM3TextureIndexMode0, 0x0); PM3_SLOW_WRITE_REG(PM3TextureIndexMode1, 0x0); PM3_SLOW_WRITE_REG(PM3TextureReadMode, 0x0); PM3_SLOW_WRITE_REG(PM3LUTMode, 0x0); PM3_SLOW_WRITE_REG(PM3TextureFilterMode, 0x0); PM3_SLOW_WRITE_REG(PM3TextureCompositeMode, 0x0); PM3_SLOW_WRITE_REG(PM3TextureApplicationMode, 0x0); PM3_SLOW_WRITE_REG(PM3TextureCompositeColorMode1, 0x0); PM3_SLOW_WRITE_REG(PM3TextureCompositeAlphaMode1, 0x0); PM3_SLOW_WRITE_REG(PM3TextureCompositeColorMode0, 0x0); PM3_SLOW_WRITE_REG(PM3TextureCompositeAlphaMode0, 0x0); PM3_SLOW_WRITE_REG(PM3FogMode, 0x0); PM3_SLOW_WRITE_REG(PM3ChromaTestMode, 0x0); PM3_SLOW_WRITE_REG(PM3AlphaTestMode, 0x0); PM3_SLOW_WRITE_REG(PM3AntialiasMode, 0x0); PM3_SLOW_WRITE_REG(PM3YUVMode, 0x0); PM3_SLOW_WRITE_REG(PM3AlphaBlendColorMode, 0x0); PM3_SLOW_WRITE_REG(PM3AlphaBlendAlphaMode, 0x0); PM3_SLOW_WRITE_REG(PM3DitherMode, 0x0); PM3_SLOW_WRITE_REG(PM3LogicalOpMode, 0x0); PM3_SLOW_WRITE_REG(PM3RouterMode, 0x0); PM3_SLOW_WRITE_REG(PM3Window, 0x0); PM3_SLOW_WRITE_REG(PM3Config2D, 0x0); PM3_SLOW_WRITE_REG(PM3SpanColorMask, 0xffffffff); PM3_SLOW_WRITE_REG(PM3XBias, 0x0); PM3_SLOW_WRITE_REG(PM3YBias, 0x0); PM3_SLOW_WRITE_REG(PM3DeltaControl, 0x0); PM3_SLOW_WRITE_REG(PM3BitMaskPattern, 0xffffffff); PM3_SLOW_WRITE_REG(PM3FBDestReadEnables, PM3FBDestReadEnables_E(0xff) | PM3FBDestReadEnables_R(0xff) | PM3FBDestReadEnables_ReferenceAlpha(0xff)); PM3_SLOW_WRITE_REG(PM3FBDestReadBufferAddr0, 0x0); PM3_SLOW_WRITE_REG(PM3FBDestReadBufferOffset0, 0x0); PM3_SLOW_WRITE_REG(PM3FBDestReadBufferWidth0, PM3FBDestReadBufferWidth_Width(l_fb_info-> current_par-> width)); PM3_SLOW_WRITE_REG(PM3FBDestReadMode, PM3FBDestReadMode_ReadEnable | PM3FBDestReadMode_Enable0); PM3_SLOW_WRITE_REG(PM3FBSourceReadBufferAddr, 0x0); PM3_SLOW_WRITE_REG(PM3FBSourceReadBufferOffset, 0x0); PM3_SLOW_WRITE_REG(PM3FBSourceReadBufferWidth, PM3FBSourceReadBufferWidth_Width(l_fb_info-> current_par-> width)); PM3_SLOW_WRITE_REG(PM3FBSourceReadMode, PM3FBSourceReadMode_Blocking | PM3FBSourceReadMode_ReadEnable); { unsigned long rm = 1; switch (l_fb_info->current_par->depth) { case 8: PM3_SLOW_WRITE_REG(PM3PixelSize, PM3PixelSize_GLOBAL_8BIT); break; case 12: case 15: case 16: PM3_SLOW_WRITE_REG(PM3PixelSize, PM3PixelSize_GLOBAL_16BIT); break; case 32: PM3_SLOW_WRITE_REG(PM3PixelSize, PM3PixelSize_GLOBAL_32BIT); break; default: DPRINTK(1, "Unsupported depth %d\n", l_fb_info->current_par->depth); break; } PM3_SLOW_WRITE_REG(PM3RasterizerMode, rm); } PM3_SLOW_WRITE_REG(PM3FBSoftwareWriteMask, 0xffffffff); PM3_SLOW_WRITE_REG(PM3FBWriteMode, PM3FBWriteMode_WriteEnable | PM3FBWriteMode_OpaqueSpan | PM3FBWriteMode_Enable0); PM3_SLOW_WRITE_REG(PM3FBWriteBufferAddr0, 0x0); PM3_SLOW_WRITE_REG(PM3FBWriteBufferOffset0, 0x0); PM3_SLOW_WRITE_REG(PM3FBWriteBufferWidth0, PM3FBWriteBufferWidth_Width(l_fb_info-> current_par-> width)); PM3_SLOW_WRITE_REG(PM3SizeOfFramebuffer, 0x0); { unsigned long sofb = (8UL * l_fb_info->fb_size) / ((depth2bpp(l_fb_info->current_par->depth)) * l_fb_info->current_par->width); /* size in lines of FB */ if (sofb > 4095) PM3_SLOW_WRITE_REG(PM3SizeOfFramebuffer, 4095); else PM3_SLOW_WRITE_REG(PM3SizeOfFramebuffer, sofb); PM3_SLOW_WRITE_REG(PM3FBHardwareWriteMask, 0xffffffff); switch (l_fb_info->current_par->depth) { case 8: PM3_SLOW_WRITE_REG(PM3DitherMode, (1 << 10) | (2 << 3)); break; case 12: case 15: case 16: PM3_SLOW_WRITE_REG(PM3DitherMode, (1 << 10) | (1 << 3)); break; case 32: PM3_SLOW_WRITE_REG(PM3DitherMode, (1 << 10) | (0 << 3)); break; default: DPRINTK(1, "Unsupported depth %d\n", l_fb_info->current_par->depth); break; } } PM3_SLOW_WRITE_REG(PM3dXDom, 0x0); PM3_SLOW_WRITE_REG(PM3dXSub, 0x0); PM3_SLOW_WRITE_REG(PM3dY, (1 << 16)); PM3_SLOW_WRITE_REG(PM3StartXDom, 0x0); PM3_SLOW_WRITE_REG(PM3StartXSub, 0x0); PM3_SLOW_WRITE_REG(PM3StartY, 0x0); PM3_SLOW_WRITE_REG(PM3Count, 0x0); /* Disable LocalBuffer. better safe than sorry */ PM3_SLOW_WRITE_REG(PM3LBDestReadMode, 0x0); PM3_SLOW_WRITE_REG(PM3LBDestReadEnables, 0x0); PM3_SLOW_WRITE_REG(PM3LBSourceReadMode, 0x0); PM3_SLOW_WRITE_REG(PM3LBWriteMode, 0x0); pm3fb_wait_pm3(l_fb_info);}#ifdef FBCON_HAS_CFB32static void pm3fb_cfb32_clear(struct vc_data *conp, struct display *p, int sy, int sx, int height, int width){ struct pm3fb_info *l_fb_info = (struct pm3fb_info *) p->fb_info; u32 c; DTRACE; sx = sx * fontwidth(p); width = width * fontwidth(p); sy = sy * fontheight(p); height = height * fontheight(p); c = ((u32 *) p->dispsw_data)[attr_bgcol_ec(p, conp)]; if (l_fb_info->current_par->width > 1600) { PM3_WAIT(4); PM3_WRITE_REG(PM3Config2D, PM3Config2D_UseConstantSource | PM3Config2D_ForegroundROPEnable | (PM3Config2D_ForegroundROP(0x3)) | /* Ox3 is GXcopy */ PM3Config2D_FBWriteEnable); PM3_WRITE_REG(PM3ForegroundColor, c); PM3_WRITE_REG(PM3RectanglePosition, (PM3RectanglePosition_XOffset(sx)) | (PM3RectanglePosition_YOffset(sy))); PM3_WRITE_REG(PM3Render2D, PM3Render2D_XPositive | PM3Render2D_YPositive | PM3Render2D_Operation_Normal | PM3Render2D_SpanOperation | (PM3Render2D_Width(width)) | (PM3Render2D_Height(height))); } else { /* block fills in 32bpp are hard, but in low res (width <= 1600 :-) we can use 16bpp operations */ PM3_WAIT(8); PM3_WRITE_REG(PM3FBBlockColor, c); PM3_WRITE_REG(PM3PixelSize, PM3PixelSize_GLOBAL_16BIT); PM3_WRITE_REG(PM3FBWriteBufferWidth0, PM3FBWriteBufferWidth_Width(l_fb_info-> current_par-> width << 1)); PM3_WRITE_REG(PM3Config2D, PM3Config2D_UseConstantSource | PM3Config2D_ForegroundROPEnable | (PM3Config2D_ForegroundROP(0x3)) | /* Ox3 is GXcopy */ PM3Config2D_FBWriteEnable); PM3_WRITE_REG(PM3RectanglePosition, (PM3RectanglePosition_XOffset(sx << 1)) | (PM3RectanglePosition_YOffset(sy))); PM3_WRITE_REG(PM3Render2D, PM3Render2D_XPositive | PM3Render2D_YPositive | PM3Render2D_Operation_Normal | (PM3Render2D_Width(width << 1)) | (PM3Render2D_Height(height))); PM3_WRITE_REG(PM3FBWriteBufferWidth0, PM3FBWriteBufferWidth_Width(l_fb_info-> current_par-> width)); PM3_WRITE_REG(PM3PixelSize, PM3PixelSize_GLOBAL_32BIT); } pm3fb_wait_pm3(l_fb_info);}static void pm3fb_cfb32_clear_margins(struct vc_data *conp, struct display *p, int bottom_only){ struct pm3fb_info *l_fb_info = (struct pm3fb_info *) p->fb_info; int sx, sy; u32 c; DTRACE; sx = conp->vc_cols * fontwidth(p); /* right margin */ sy = conp->vc_rows * fontheight(p); /* bottom margin */ c = ((u32 *) p->dispsw_data)[attr_bgcol_ec(p, conp)]; if (!bottom_only) { /* right margin top->bottom */ PM3_WAIT(4); PM3_WRITE_REG(PM3Config2D, PM3Config2D_UseConstantSource | PM3Config2D_ForegroundROPEnable | (PM3Config2D_ForegroundROP(0x3)) | /* Ox3 is GXcopy */ PM3Config2D_FBWriteEnable); PM3_WRITE_REG(PM3ForegroundColor, c); PM3_WRITE_REG(PM3RectanglePosition, (PM3RectanglePosition_XOffset (p->var.xoffset + sx)) | (PM3RectanglePosition_YOffset(p-> var. yoffset))); PM3_WRITE_REG(PM3Render2D, PM3Render2D_XPositive | PM3Render2D_YPositive | PM3Render2D_Operation_Normal | PM3Render2D_SpanOperation | (PM3Render2D_Width(p->var.xres - sx)) | (PM3Render2D_Height(p->var.yres))); } /* bottom margin left -> right */ PM3_WAIT(4); PM3_WRITE_REG(PM3Config2D, PM3Config2D_UseConstantSource | PM3Config2D_ForegroundROPEnable | (PM3Config2D_ForegroundROP(0x3)) | /* Ox3 is GXcopy */ PM3Config2D_FBWriteEnable); PM3_WRITE_REG(PM3ForegroundColor, c); PM3_WRITE_REG(PM3RectanglePosition, (PM3RectanglePosition_XOffset(p->var.xoffset)) | (PM3RectanglePosition_YOffset(p->var.yoffset + sy))); PM3_WRITE_REG(PM3Render2D, PM3Render2D_XPositive | PM3Render2D_YPositive | PM3Render2D_Operation_Normal | PM3Render2D_SpanOperation | (PM3Render2D_Width(p->var.xres)) | (PM3Render2D_Height(p->var.yres - sy))); pm3fb_wait_pm3(l_fb_info);}#endif /* FBCON_HAS_CFB32 */#ifdef FBCON_HAS_CFB16static void pm3fb_cfb16_clear(struct vc_data *conp, struct display *p, int sy, int sx, int height, int width){ struct pm3fb_info *l_fb_info = (struct pm3fb_info *) p->fb_info; u32 c; DTRACE; sx = sx * fontwidth(p); width = width * fontwidth(p); sy = sy * fontheight(p); height = height * fontheight(p); c = ((u16 *) p->dispsw_data)[attr_bgcol_ec(p, conp)]; c = c | (c << 16); PM3_WAIT(4); PM3_WRITE_REG(PM3FBBlockColor, c); PM3_WRITE_REG(PM3Config2D, PM3Config2D_UseConstantSource | PM3Config2D_ForegroundROPEnable | (PM3Config2D_ForegroundROP(0x3)) | /* Ox3 is GXcopy */ PM3Config2D_FBWriteEnable); PM3_WRITE_REG(PM3RectanglePosition, (PM3RectanglePosition_XOffset(sx)) | (PM3RectanglePosition_YOffset(sy))); PM3_WRITE_REG(PM3Render2D, PM3Render2D_XPositive | PM3Render2D_YPositive | PM3Render2D_Operation_Normal | (PM3Render2D_Width(width)) | (PM3Render2D_Height(height))); pm3fb_wait_pm3(l_fb_info);}static void pm3fb_cfb16_clear_margins(struct vc_data *conp, struct display *p, int bottom_only){ struct pm3fb_info *l_fb_info = (struct pm3fb_info *) p->fb_info; int sx, sy;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -