forked from len0rd/rockbox
H300: Roughly 20% faster LCD updates with DMA
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8271 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
b2295a4afb
commit
c70eb572c1
3 changed files with 18 additions and 7 deletions
|
|
@ -434,7 +434,7 @@ irq_handler:
|
||||||
/* Chip select 1 - LCD controller */
|
/* Chip select 1 - LCD controller */
|
||||||
move.l #0xf0000000,%d0 /* CSAR1 - Base = 0xf0000000 */
|
move.l #0xf0000000,%d0 /* CSAR1 - Base = 0xf0000000 */
|
||||||
move.l %d0,(0x08c,%a0)
|
move.l %d0,(0x08c,%a0)
|
||||||
moveq.l #0x75,%d0 /* CSMR1 - 64K, Only data access */
|
moveq.l #0x1,%d0 /* CSMR1 - 64K */
|
||||||
move.l %d0,(0x090,%a0)
|
move.l %d0,(0x090,%a0)
|
||||||
move.l #0x00000180,%d0 /* CSCR1 - no wait states, 16 bits, no bursts */
|
move.l #0x00000180,%d0 /* CSCR1 - no wait states, 16 bits, no bursts */
|
||||||
move.l %d0,(0x094,%a0)
|
move.l %d0,(0x094,%a0)
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@
|
||||||
#define SCROLLABLE_LINES 26
|
#define SCROLLABLE_LINES 26
|
||||||
|
|
||||||
/*** globals ***/
|
/*** globals ***/
|
||||||
fb_data lcd_framebuffer[LCD_HEIGHT][LCD_WIDTH] __attribute__ ((aligned (4)));
|
fb_data lcd_framebuffer[LCD_HEIGHT][LCD_WIDTH] __attribute__ ((aligned (16)));
|
||||||
|
|
||||||
static unsigned fg_pattern IDATA_ATTR = LCD_DEFAULT_FG;
|
static unsigned fg_pattern IDATA_ATTR = LCD_DEFAULT_FG;
|
||||||
static unsigned bg_pattern IDATA_ATTR = LCD_DEFAULT_BG;
|
static unsigned bg_pattern IDATA_ATTR = LCD_DEFAULT_BG;
|
||||||
|
|
|
||||||
|
|
@ -89,12 +89,20 @@ inline void lcd_begin_write_gram(void)
|
||||||
*(volatile unsigned short *)0xf0000000 = R_WRITE_DATA_2_GRAM;
|
*(volatile unsigned short *)0xf0000000 = R_WRITE_DATA_2_GRAM;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* called very frequently - inline! */
|
void lcd_write_data(const unsigned short* p_bytes, int count) ICODE_ATTR;
|
||||||
inline void lcd_write_data(const unsigned short* p_bytes, int count) ICODE_ATTR;
|
void lcd_write_data(const unsigned short* p_bytes, int count)
|
||||||
inline void lcd_write_data(const unsigned short* p_bytes, int count)
|
|
||||||
{
|
{
|
||||||
while(count--)
|
SAR1 = (unsigned long)p_bytes; /* Destination address */
|
||||||
*(volatile unsigned short *)0xf0000002 = *p_bytes++;
|
while(count)
|
||||||
|
{
|
||||||
|
int cnt = MIN(count, 256);
|
||||||
|
DAR1 = (unsigned long)0xf0000002; /* Destination address */
|
||||||
|
BCR1 = cnt*2; /* Bytes to transfer */
|
||||||
|
DCR1 = 0x02000000 | DMA_SINC | (2 << 20) | (2 << 17) | DMA_START;
|
||||||
|
while(!(DSR1 & 1)) {};
|
||||||
|
DSR1 = 1;
|
||||||
|
count -= cnt;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*** hardware configuration ***/
|
/*** hardware configuration ***/
|
||||||
|
|
@ -131,6 +139,9 @@ void lcd_roll(int lines)
|
||||||
/* LCD init */
|
/* LCD init */
|
||||||
void lcd_init_device(void)
|
void lcd_init_device(void)
|
||||||
{
|
{
|
||||||
|
MPARK = 0x81; /* PARK[1,0]=10 + BCR24BIT */
|
||||||
|
DSR1 = 1;
|
||||||
|
|
||||||
/* GPO46 is LCD RESET */
|
/* GPO46 is LCD RESET */
|
||||||
or_l(0x00004000, &GPIO1_OUT);
|
or_l(0x00004000, &GPIO1_OUT);
|
||||||
or_l(0x00004000, &GPIO1_ENABLE);
|
or_l(0x00004000, &GPIO1_ENABLE);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue