如何显示开机logo?

winamp123 2010-05-18 05:06:11

用的是i.mx35的ARM,怎么显示开机logo,需要在BSP中添加什么代码?
...全文
136 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
AngleBabyHong 2010-06-22
  • 打赏
  • 举报
回复
告诫楼上,买板子还是买评估板吧。我也是开机logo搞不定啊!
AngleBabyHong 2010-06-22
  • 打赏
  • 举报
回复
碰到了同样的问题,买了上海辰汉的一款35开发板,真是垃圾。后悔死了的。碰到问题叫你写邮件,写完邮件给你回复是后续解决完通知你。告诫楼上是不是也买的那家啊。呵呵。
阿布在飘 2010-05-20
  • 打赏
  • 举报
回复
正要研究这个问题呢,收藏了。
InsaneCode 2010-05-19
  • 打赏
  • 举报
回复
static BOOL LCDCInitialize(int width, int height, int bpp)
{
BOOL rc = TRUE;
UINT32 pixelBytes;
UINT32 uLCDRefClk;
CSP_LCDC_REGS *pLCDC;
BSP_ARGS *pBspArgs = (BSP_ARGS *)OALPAtoUA(IMAGE_SHARE_ARGS_RAM_PA_START);

pixelBytes = LCDC_PIXEL_SIZE_BYTES(bpp);
pLCDC = (CSP_LCDC_REGS *)OALPAtoUA(CSP_BASE_REG_PA_LCDC);

// Disable LCDC clock
LCDCEnable(FALSE);

// Disable self refresh
pLCDC->RMCR &= ~CSP_BITFMASK(LCDC_RMCR_SELF_REF);

pLCDC->SSAR = IMAGE_SHARE_FRAMEBUFFER_RAM_PA_START;

pLCDC->SR = CSP_BITFVAL(LCDC_SR_YMAX, BSP_PREF_DISPLAY_HEIGHT) |
CSP_BITFVAL(LCDC_SR_XMAX, (BSP_PREF_DISPLAY_WIDTH / 16) ) |
CSP_BITFVAL(LCDC_SR_BUSSIZE, LCDC_SR_BUSSIZE_32BIT);

pLCDC->VPWR = BSP_PREF_DISPLAY_WIDTH / (4 / pixelBytes);

// disable cursor
pLCDC->CPR = CSP_BITFVAL(LCDC_CPR_OP, LCDC_CPR_OP_DISABLE) |
CSP_BITFVAL(LCDC_CPR_CC, LCDC_CPR_CC_DISABLED);


// Disable cursor blink, all settings default
pLCDC->CWHBR = CSP_BITFVAL(LCDC_CWHBR_BK_EN, LCDC_CWHBR_BK_EN_DISABLE) |
CSP_BITFVAL(LCDC_CWHBR_CW, LCDC_CWHBR_CW_CURSOR_DISABLED) |
CSP_BITFVAL(LCDC_CWHBR_CH, LCDC_CWHBR_CH_CURSOR_DISABLED) |
CSP_BITFVAL(LCDC_CWHBR_BD, LCDC_CWHBR_BD_MAX_DIV);

// CCMR: Default as on reset
pLCDC->CCMR = 0;

// Set Pixel polarity bit since color is inverted in lcd board.
uLCDRefClk = pBspArgs->clockFreq[DDK_CLOCK_SIGNAL_PERDIV3];

#ifdef VGA_DISPLAY
OALMSG(1, (TEXT("VGA_DISPLAY defined\r\n")));
#else
OALMSG(1, (TEXT("VGA_DISPLAY not defined\r\n")));
#endif


pLCDC->PCR =
#ifdef VGA_DISPLAY
CSP_BITFVAL(LCDC_PCR_SHARP, LCDC_PCR_SHARP_DISABLE) |
CSP_BITFVAL(LCDC_PCR_PIXPOL, LCDC_PCR_PIXPOL_ACTIVE_HIGH) |
#else
CSP_BITFVAL(LCDC_PCR_SHARP, LCDC_PCR_SHARP_ENABLE) |
// CSP_BITFVAL(LCDC_PCR_PIXPOL, LCDC_PCR_PIXPOL_ACTIVE_LOW) |
CSP_BITFVAL(LCDC_PCR_PIXPOL, LCDC_PCR_PIXPOL_ACTIVE_HIGH) |
#endif
CSP_BITFVAL(LCDC_PCR_SCLKSEL, LCDC_PCR_SCLKSEL_ENABLE) |
CSP_BITFVAL(LCDC_PCR_ACDSEL, LCDC_PCR_ACDSEL_USE_LPHSYNC) |
CSP_BITFVAL(LCDC_PCR_REV_VS, LCDC_PCR_REV_VS_NORMAL) |
CSP_BITFVAL(LCDC_PCR_SWAP_SEL, LCDC_PCR_SWAP_SEL_16BPP) |
CSP_BITFVAL(LCDC_PCR_END_SEL, LCDC_PCR_END_SEL_LITTLE_ENDIAN) |
CSP_BITFVAL(LCDC_PCR_SCLKIDLE, LCDC_PCR_SCLKIDLE_DISABLE) |
CSP_BITFVAL(LCDC_PCR_OEPOL, LCDC_PCR_OEPOL_ACTIVE_LOW) |
CSP_BITFVAL(LCDC_PCR_CLKPOL, LCDC_PCR_CLKPOL_NEG_EDGE) |
CSP_BITFVAL(LCDC_PCR_LPPOL, LCDC_PCR_LPPOL_ACTIVE_LOW) |
CSP_BITFVAL(LCDC_PCR_FLMPOL, LCDC_PCR_FLMPOL_ACTIVE_HIGH) |
CSP_BITFVAL(LCDC_PCR_PBSIZ, LCDC_PCR_PBSIZ_8BIT) |
CSP_BITFVAL(LCDC_PCR_COLOR, LCDC_PCR_COLOR_COLOR) |
CSP_BITFVAL(LCDC_PCR_TFT, LCDC_PCR_TFT_ACTIVE) |
CSP_BITFVAL(LCDC_PCR_PCD, LCDC_PCD_VALUE(uLCDRefClk, BSP_PIXEL_CLOCK_FREQ));
switch(bpp)
{
case 1:
pLCDC->PCR |= CSP_BITFVAL(LCDC_PCR_BPIX, LCDC_PCR_BPIX_1BPP);
break;
case 2:
pLCDC->PCR |= CSP_BITFVAL(LCDC_PCR_BPIX, LCDC_PCR_BPIX_2BPP);
break;
case 4:
pLCDC->PCR |= CSP_BITFVAL(LCDC_PCR_BPIX, LCDC_PCR_BPIX_4BPP);
break;
case 8:
pLCDC->PCR |= CSP_BITFVAL(LCDC_PCR_BPIX, LCDC_PCR_BPIX_8BPP);
break;
case 12:
pLCDC->PCR |= CSP_BITFVAL(LCDC_PCR_BPIX, LCDC_PCR_BPIX_12BPP);
break;
case 16:
pLCDC->PCR |= CSP_BITFVAL(LCDC_PCR_BPIX, LCDC_PCR_BPIX_16BPP);
break;
case 18:
pLCDC->PCR |= CSP_BITFVAL(LCDC_PCR_BPIX, LCDC_PCR_BPIX_18BPP);
break;
default:
goto cleanup;
}

pLCDC->HCR = CSP_BITFVAL(LCDC_HCR_H_WIDTH, 10) |
CSP_BITFVAL(LCDC_HCR_H_WAIT_1, 8) |
CSP_BITFVAL(LCDC_HCR_H_WAIT_2, 0);

pLCDC->VCR = CSP_BITFVAL(LCDC_VCR_V_WIDTH, 2) |
CSP_BITFVAL(LCDC_VCR_V_WAIT_1, 3) |
CSP_BITFVAL(LCDC_VCR_V_WAIT_2, 4) ;


pLCDC->PCR =0xFA6000C3;
pLCDC->HCR =0x28000400;
pLCDC->VCR =0x08000304;

// POR: 0 as reset default
pLCDC->POR = CSP_BITFVAL(LCDC_POR_POR, 0);

pLCDC->SCR = CSP_BITFVAL(LCDC_SCR_GRAY1, 0) |
CSP_BITFVAL(LCDC_SCR_GRAY2, 0) |
CSP_BITFVAL(LCDC_SCR_REV_TOGGLE_DELAY, 3) |
CSP_BITFVAL(LCDC_SCR_CLS_RISE_DELAY, 18) |
CSP_BITFVAL(LCDC_SCR_PS_RISE_DELAY, 1);

// Enable contrast for backlight control. Initialize to half power
pLCDC->PCCR = CSP_BITFVAL(LCDC_PCCR_PW, LCDC_PCCR_PW_MAX) |
CSP_BITFVAL(LCDC_PCCR_CC_EN, LCDC_PCCR_CC_EN_ENABLE) |
CSP_BITFVAL(LCDC_PCCR_SCR, LCDC_PCCR_SCR_PIXELCLK) |
CSP_BITFVAL(LCDC_PCCR_LDMSK, LCDC_PCCR_LDMSK_DISABLE) |
CSP_BITFVAL(LCDC_PCCR_CLS_HI_WIDTH, 169);


// Settings for heavily loaded bus with SDRAM access.
// dynamic burst, High mark = 3, low mark = 1D (best setting after testing)
pLCDC->DCR = CSP_BITFVAL(LCDC_DCR_BURST, LCDC_DCR_BURST_DYNAMIC) |
CSP_BITFVAL(LCDC_DCR_HM, 0x03) |
CSP_BITFVAL(LCDC_DCR_TM, 0x08);
// Set for interrupt on output of last data to panel, end of graphic window
pLCDC->ICR = CSP_BITFVAL(LCDC_ICR_GW_INT_CON, LCDC_ICR_GW_INT_CON_END) |
CSP_BITFVAL(LCDC_ICR_INTSYN, LCDC_ICR_INTSYN_PANEL) |
CSP_BITFVAL(LCDC_ICR_INTCON, LCDC_ICR_INTCON_BOF);

// Disable All interrupts
pLCDC->IER = 0;

// Setup graphic window DMA
// Don't change unless primary buffer DMA settings are changed
pLCDC->GWDCR = CSP_BITFVAL(LCDC_GWDCR_GWBT, LCDC_GWDCR_GWBT_DYNAMIC) |
CSP_BITFVAL(LCDC_GWDCR_GWHM, 0x02) |
CSP_BITFVAL(LCDC_GWDCR_GWTM, 0x10);

// Disable graphic window.
pLCDC->GWCR = CSP_BITFVAL(LCDC_GWCR_GWE, 0);

// We're done
rc = TRUE;
cleanup:
OALMSG(!rc, (TEXT("LCDCInitialize: rc (%d)\r\n"), rc));
return rc;
}
#else
InsaneCode 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 winamp123 的回复:]
感谢kacyquan的回复。你有没 LCDCInitialize(screenWidth, screenHeight, screenBpp)的代码,

关键是想看下如何设置寄存器,我在SRC\OALlib的文件夹下面没有找到相关代码!


引用 9 楼 kacyquan 的回复:
BOOL OALDisplaySplashScreen(void)
{
int screenWidth……
[/Quote]

你用的是wince5.0还是6.0的啊?如果是5.0应该在src\kernel\oal里面。我这个代码不是mx35的,是27的代码。
winamp123 2010-05-19
  • 打赏
  • 举报
回复

感谢kacyquan的回复。你有没 LCDCInitialize(screenWidth, screenHeight, screenBpp)的代码,

关键是想看下如何设置寄存器,我在SRC\OALlib的文件夹下面没有找到相关代码!

[Quote=引用 9 楼 kacyquan 的回复:]
BOOL OALDisplaySplashScreen(void)
{
int screenWidth, screenHeight, screenBpp, pixelBytes;
int bmpWidth, bmpHeight;
int w, w1;
int h;
int i, j;
BOOL success = FALSE;
BYTE *pfb;

……
[/Quote]
九个太阳2023 2010-05-19
  • 打赏
  • 举报
回复
哈哈~~顶kacyquan!!
InsaneCode 2010-05-19
  • 打赏
  • 举报
回复
BOOL OALDisplaySplashScreen(void)
{
int screenWidth, screenHeight, screenBpp, pixelBytes;
int bmpWidth, bmpHeight;
int w, w1;
int h;
int i, j;
BOOL success = FALSE;
BYTE *pfb;

// OALMSG(OAL_FUNC, (TEXT("+OALDisplaySplashScreen\r\n")));
OALMSG(OAL_INFO, (TEXT("+OALDisplaySplashScreen\r\n")));

screenWidth = BSP_PREF_DISPLAY_WIDTH;
screenHeight = BSP_PREF_DISPLAY_HEIGHT;
screenBpp = BSP_PREF_DISPLAY_BPP;
pixelBytes = LCDC_PIXEL_SIZE_BYTES(screenBpp);

// Initialise display controller
if(!LCDCInitialize(screenWidth, screenHeight, screenBpp))
{
// OALMSG(OAL_WARN, (TEXT("OALDisplaySplashScreen: DisplayInitialize failed.\r\n")));
OALMSG(OAL_INFO, (TEXT("OALDisplaySplashScreen: DisplayInitialize failed.\r\n")));
goto displaycleanup;
}

// bitmap_height, bitmap_width contain the width, height of the splashscreen
// display. See splashscreen.c
bmpWidth = (bitmap_width > screenWidth) ? screenWidth : bitmap_width;
bmpHeight = (bitmap_height > screenHeight) ? screenHeight : bitmap_height;

w = (screenWidth - bmpWidth) / 2;
h = (screenHeight - bmpHeight) / 2;
w1 = ((screenWidth - bmpWidth) % 2 == 0)? w : w + 1;

pfb = (BYTE *)IMAGE_SHARE_FRAMEBUFFER_RAM_UA_START;

// Pre-set the screen background with white color
memset(pfb, 0xff, screenWidth * screenHeight * pixelBytes);

// Copy and centre splash screen in framebuffer.
j = bmpWidth * pixelBytes;
pfb += h * screenWidth * pixelBytes;
for(i = 0; i < bmpHeight; i++)
{
pfb += w * pixelBytes;
memcpy(pfb, &bitmap_data[i * bitmap_width], j);
pfb += j + w1 * pixelBytes;
}

// Enable display controller.
LCDCEnable(TRUE);
success = TRUE;

displaycleanup:
// OALMSG(OAL_FUNC, (TEXT("-DisplaySplashScreen(%d)\r\n"), success));
OALMSG(OAL_INFO, (TEXT("-DisplaySplashScreen(%d)\r\n"), success));
return success;
}

“bitmap_data”这个就是logo的C数组
InsaneCode 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gaoyugaoyugaoyu 的回复:]
引用 2 楼 kacyquan 的回复:
freescale的芯片logo是在EBOOT里面显示的。先把图片换成C语言数组,在eboot中,OEMPlatformInit里面最开始的时候就有刷LCDbuffer的地方。

顶下,没用过,听说freescale很大,编译起来时间很长
[/Quote]

还好吧~~和三星也差不多啊,我觉得。
InsaneCode 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 winamp123 的回复:]
我也知道在OEMPlatformInit函数中实现InitDisplay函数,实现LCD的初始化后填入图片信息。请问有LCD
的初始化代码能贴出来看下吗?


引用 2 楼 kacyquan 的回复:
freescale的芯片logo是在EBOOT里面显示的。先把图片换成C语言数组,在eboot中,OEMPlatformInit里面最开始的时候就有刷LCDbuffer的地方。
[/Quote]

您是说LCD的初始化代码吗?在SRC\OALlib的文件夹下面有。如果楼主需要,把邮箱告诉我,我发给你一个。
winamp123 2010-05-19
  • 打赏
  • 举报
回复

我也知道在OEMPlatformInit函数中实现InitDisplay函数,实现LCD的初始化后填入图片信息。请问有LCD
的初始化代码能贴出来看下吗?

[Quote=引用 2 楼 kacyquan 的回复:]
freescale的芯片logo是在EBOOT里面显示的。先把图片换成C语言数组,在eboot中,OEMPlatformInit里面最开始的时候就有刷LCDbuffer的地方。
[/Quote]
kitein9t 2010-05-18
  • 打赏
  • 举报
回复
学习,mark
StephenGaoYu 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 kacyquan 的回复:]
freescale的芯片logo是在EBOOT里面显示的。先把图片换成C语言数组,在eboot中,OEMPlatformInit里面最开始的时候就有刷LCDbuffer的地方。
[/Quote]
顶下,没用过,听说freescale很大,编译起来时间很长
gooogleman 2010-05-18
  • 打赏
  • 举报
回复
bootloader 或者OAL 在初始化LCD之后。
InsaneCode 2010-05-18
  • 打赏
  • 举报
回复
freescale的芯片logo是在EBOOT里面显示的。先把图片换成C语言数组,在eboot中,OEMPlatformInit里面最开始的时候就有刷LCDbuffer的地方。
wjcapple 2010-05-18
  • 打赏
  • 举报
回复
顶,学习,刷分哈

19,498

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧