diff --git a/firmware/target/coldfire/iriver/h300/lcd-h300.c b/firmware/target/coldfire/iriver/h300/lcd-h300.c index 312bd70ccc..c415ed6c37 100644 --- a/firmware/target/coldfire/iriver/h300/lcd-h300.c +++ b/firmware/target/coldfire/iriver/h300/lcd-h300.c @@ -35,11 +35,13 @@ static bool display_on = false; /* Is the display turned on? */ static bool display_flipped = false; static int xoffset = 0; /* Needed for flip */ +#ifndef BOOTLOADER static struct mutex lcd_mtx; /* The update functions use DMA and yield */ unsigned long dma_addr IBSS_ATTR; unsigned int dma_len IBSS_ATTR; volatile int dma_count IBSS_ATTR; +#endif /* register defines */ #define R_START_OSC 0x00 @@ -139,9 +141,13 @@ void lcd_set_flip(bool yesno) if (display_on) { +#ifndef BOOTLOADER mutex_lock(&lcd_mtx); +#endif flip_lcd(yesno); +#ifndef BOOTLOADER mutex_unlock(&lcd_mtx); +#endif } } @@ -262,6 +268,7 @@ void lcd_init_device(void) or_l(0x00004000, &GPIO1_OUT); sleep(1); +#ifndef BOOTLOADER DAR3 = 0xf0000002; /* Configure DMA channel 3 */ DSR3 = 1; DIVR3 = 57; /* DMA3 is mapped into vector 57 in system.c */ @@ -269,6 +276,7 @@ void lcd_init_device(void) coldfire_imr_mod(0, 1 << 17); mutex_init(&lcd_mtx); +#endif _display_on(); } @@ -276,7 +284,9 @@ void lcd_enable(bool on) { if (display_on != on) { +#ifndef BOOTLOADER mutex_lock(&lcd_mtx); +#endif if (on) { _display_on(); @@ -304,7 +314,9 @@ void lcd_enable(bool on) display_on=false; } +#ifndef BOOTLOADER mutex_unlock(&lcd_mtx); +#endif } } @@ -340,7 +352,9 @@ void lcd_blit_yuv(unsigned char * const src[3], if (!display_on) return; +#ifndef BOOTLOADER mutex_lock(&lcd_mtx); +#endif width &= ~1; /* stay on the safe side */ height &= ~1; @@ -372,9 +386,12 @@ void lcd_blit_yuv(unsigned char * const src[3], vsrc += stride >> 1; } while (ysrc < ysrc_max); +#ifndef BOOTLOADER mutex_unlock(&lcd_mtx); +#endif } +#ifndef BOOTLOADER /* LCD DMA ISR */ void DMA3(void) __attribute__ ((interrupt_handler, section(".icode"))); void DMA3(void) @@ -390,6 +407,7 @@ void DMA3(void) | DMA_DSIZE(DMA_SIZE_WORD) | DMA_START; } } +#endif /* Update the display. This must be called after all other LCD functions that change the display. */ @@ -397,7 +415,9 @@ void lcd_update(void) { if (display_on) { +#ifndef BOOTLOADER mutex_lock(&lcd_mtx); +#endif lcd_write_reg(R_ENTRY_MODE, R_ENTRY_MODE_VERT); /* set start position window */ @@ -407,8 +427,9 @@ void lcd_update(void) lcd_begin_write_gram(); +#ifndef BOOTLOADER dma_count = 1; - SAR3 = (unsigned long)FBADDR(0,0); + SAR3 = (unsigned long)FBADDR(0, 0); BCR3 = LCD_WIDTH*LCD_HEIGHT*sizeof(fb_data); DCR3 = DMA_INT | DMA_AA | DMA_BWC(1) | DMA_SINC | DMA_SSIZE(DMA_SIZE_LINE) @@ -418,6 +439,17 @@ void lcd_update(void) yield(); mutex_unlock(&lcd_mtx); +#else + DAR3 = 0xf0000002; + SAR3 = (unsigned long)FBADDR(0, 0); + BCR3 = LCD_WIDTH*LCD_HEIGHT*sizeof(fb_data); + DCR3 = DMA_AA | DMA_BWC(1) + | DMA_SINC | DMA_SSIZE(DMA_SIZE_LINE) + | DMA_DSIZE(DMA_SIZE_WORD) | DMA_START; + + while (!(DSR3 & 1)); + DSR3 = 1; +#endif } } @@ -434,7 +466,9 @@ void lcd_update_rect(int x, int y, int width, int height) if (width <= 0 || height <= 0) /* nothing to do */ return; +#ifndef BOOTLOADER mutex_lock(&lcd_mtx); +#endif lcd_write_reg(R_ENTRY_MODE, R_ENTRY_MODE_VERT); /* set update window */ @@ -444,6 +478,7 @@ void lcd_update_rect(int x, int y, int width, int height) lcd_begin_write_gram(); +#ifndef BOOTLOADER if (width == LCD_WIDTH) { dma_count = 1; @@ -453,7 +488,7 @@ void lcd_update_rect(int x, int y, int width, int height) else { dma_count = height; - SAR3 = dma_addr = (unsigned long)FBADDR(x,y); + SAR3 = dma_addr = (unsigned long)FBADDR(x, y); BCR3 = dma_len = width * sizeof(fb_data); } DCR3 = DMA_INT | DMA_AA | DMA_BWC(1) @@ -464,5 +499,24 @@ void lcd_update_rect(int x, int y, int width, int height) yield(); mutex_unlock(&lcd_mtx); +#else + DAR3 = 0xf0000002; + unsigned long dma_addr = (unsigned long)FBADDR(x, y); + width *= sizeof(fb_data); + + for (; height > 0; height--) + { + SAR3 = dma_addr; + BCR3 = width; + DCR3 = DMA_AA | DMA_BWC(1) + | DMA_SINC | DMA_SSIZE(DMA_SIZE_LINE) + | DMA_DSIZE(DMA_SIZE_WORD) | DMA_START; + + dma_addr += LCD_WIDTH*sizeof(fb_data); + + while (!(DSR3 & 1)); + DSR3 = 1; + } +#endif } }