forked from len0rd/rockbox
Unified usage of lcd transfer code
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4536 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
75b575a750
commit
38e8a117aa
5 changed files with 205 additions and 256 deletions
|
@ -94,7 +94,7 @@ int kbd_input(char* text, int buflen)
|
|||
lcd_puts(0, 0, kbdbuffer);
|
||||
kbd_show_legend(screen);
|
||||
lcd_cursor(cursorpos, 0);
|
||||
lcd_write(true, LCD_BLINKCUR);
|
||||
lcd_write_command(LCD_BLINKCUR);
|
||||
|
||||
pstart = pcursor = kbdbuffer;
|
||||
|
||||
|
@ -140,7 +140,7 @@ int kbd_input(char* text, int buflen)
|
|||
case BUTTON_IR|NEO_IR_BUTTON_STOP:
|
||||
|
||||
/* Remove blinking cursor */
|
||||
lcd_write(true,LCD_OFFCUR);
|
||||
lcd_write_command(LCD_OFFCUR);
|
||||
done = true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -111,6 +111,8 @@ static char lcd_cram;
|
|||
static char lcd_pram;
|
||||
static char lcd_iram;
|
||||
|
||||
static unsigned char lcd_data_byte; /* global write buffer */
|
||||
|
||||
unsigned short buffer_xlcd[11][2];
|
||||
unsigned short buffer_lcd_mirror[11][2];
|
||||
|
||||
|
@ -122,7 +124,7 @@ unsigned char hardware_buffer_lcd[11][2];
|
|||
static void lcd_free_pat(int map_ch)
|
||||
{
|
||||
int x, y;
|
||||
unsigned short substitute_char;
|
||||
unsigned char substitute_char;
|
||||
|
||||
int pat;
|
||||
pat=extended_chars_mapped[map_ch];
|
||||
|
@ -140,8 +142,8 @@ static void lcd_free_pat(int map_ch)
|
|||
#ifdef SIMULATOR
|
||||
hardware_buffer_lcd[x][y]=substitute_char;
|
||||
#else
|
||||
lcd_write(true, LCD_CURSOR(x, y));
|
||||
lcd_write(false, substitute_char);
|
||||
lcd_write_command(LCD_CURSOR(x, y));
|
||||
lcd_write_data(&substitute_char, 1);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
@ -240,8 +242,8 @@ void xlcd_update(void)
|
|||
#ifdef SIMULATOR
|
||||
hardware_buffer_lcd[x][y]=hw_ch;
|
||||
#else
|
||||
lcd_write(true,LCD_CURSOR(x,y));
|
||||
lcd_write(false, hw_ch);
|
||||
lcd_write_command(LCD_CURSOR(x,y));
|
||||
lcd_write_data(&hw_ch, 1);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
@ -274,8 +276,9 @@ bool lcdx_putc(int x, int y, unsigned short ch)
|
|||
#ifdef SIMULATOR
|
||||
hardware_buffer_lcd[x][y]=lcd_char;
|
||||
#else
|
||||
lcd_write(true, LCD_CURSOR(x, y));
|
||||
lcd_write(false, lcd_char);
|
||||
lcd_data_byte = (unsigned char) lcd_char;
|
||||
lcd_write_command(LCD_CURSOR(x, y));
|
||||
lcd_write_data(&lcd_data_byte, 1);
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
@ -405,16 +408,14 @@ void lcd_define_pattern(int pat, char *pattern)
|
|||
#ifndef SIMULATOR
|
||||
void lcd_define_hw_pattern (int which,char *pattern,int length)
|
||||
{
|
||||
int i;
|
||||
lcd_write(true,lcd_pram | which);
|
||||
for (i=0;i<length;i++)
|
||||
lcd_write(false,pattern[i]);
|
||||
lcd_write_command(lcd_pram | which);
|
||||
lcd_write_data(pattern, length);
|
||||
}
|
||||
|
||||
void lcd_double_height(bool on)
|
||||
{
|
||||
if(new_lcd)
|
||||
lcd_write(true,on?9:8);
|
||||
lcd_write_command(on?9:8);
|
||||
}
|
||||
|
||||
static char icon_pos[] =
|
||||
|
@ -463,20 +464,21 @@ void lcd_icon(int icon, bool enable)
|
|||
pos = icon_pos[icon];
|
||||
mask = icon_mask[icon];
|
||||
|
||||
lcd_write(true, LCD_ICON(pos));
|
||||
lcd_write_command(LCD_ICON(pos));
|
||||
|
||||
if(enable)
|
||||
icon_mirror[pos] |= mask;
|
||||
else
|
||||
icon_mirror[pos] &= ~mask;
|
||||
|
||||
lcd_write(false, icon_mirror[pos]);
|
||||
lcd_write_data(&icon_mirror[pos], 1);
|
||||
}
|
||||
|
||||
void lcd_set_contrast(int val)
|
||||
{
|
||||
lcd_write(true, lcd_contrast_set);
|
||||
lcd_write(false, 31-val);
|
||||
lcd_data_byte = (unsigned char) (31 - val);
|
||||
lcd_write_command(lcd_contrast_set);
|
||||
lcd_write_data(&lcd_data_byte, 1);
|
||||
}
|
||||
#endif /* SIMULATOR */
|
||||
|
||||
|
@ -763,7 +765,7 @@ void lcd_cursor(int x, int y)
|
|||
value=0x80|(x+0x54);
|
||||
break;
|
||||
}
|
||||
lcd_write(true,value);
|
||||
lcd_write_command(value);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -143,19 +143,19 @@ void lcd_init (void)
|
|||
PBIOR |= 0x000f; /* IOR = 1 */
|
||||
|
||||
/* inits like the original firmware */
|
||||
lcd_write(true, LCD_SOFTWARE_RESET);
|
||||
lcd_write(true, LCD_SET_INTERNAL_REGULATOR_RESISTOR_RATIO + 4);
|
||||
lcd_write(true, LCD_SET_1OVER4_BIAS_RATIO + 0); /* force 1/4 bias: 0 */
|
||||
lcd_write(true, LCD_SET_POWER_CONTROL_REGISTER + 7); /* power control register: op-amp=1, regulator=1, booster=1 */
|
||||
lcd_write(true, LCD_SET_DISPLAY_ON);
|
||||
lcd_write(true, LCD_SET_NORMAL_DISPLAY);
|
||||
lcd_write(true, LCD_SET_SEGMENT_REMAP + 1); /* mirror horizontal: 1 */
|
||||
lcd_write(true, LCD_SET_COM_OUTPUT_SCAN_DIRECTION + 8); /* mirror vertical: 1 */
|
||||
lcd_write(true, LCD_SET_DISPLAY_START_LINE + 0);
|
||||
lcd_write_command(LCD_SOFTWARE_RESET);
|
||||
lcd_write_command(LCD_SET_INTERNAL_REGULATOR_RESISTOR_RATIO + 4);
|
||||
lcd_write_command(LCD_SET_1OVER4_BIAS_RATIO + 0); /* force 1/4 bias: 0 */
|
||||
lcd_write_command(LCD_SET_POWER_CONTROL_REGISTER + 7); /* power control register: op-amp=1, regulator=1, booster=1 */
|
||||
lcd_write_command(LCD_SET_DISPLAY_ON);
|
||||
lcd_write_command(LCD_SET_NORMAL_DISPLAY);
|
||||
lcd_write_command(LCD_SET_SEGMENT_REMAP + 1); /* mirror horizontal: 1 */
|
||||
lcd_write_command(LCD_SET_COM_OUTPUT_SCAN_DIRECTION + 8); /* mirror vertical: 1 */
|
||||
lcd_write_command(LCD_SET_DISPLAY_START_LINE + 0);
|
||||
lcd_set_contrast(lcd_default_contrast());
|
||||
lcd_write(true, LCD_SET_PAGE_ADDRESS);
|
||||
lcd_write(true, LCD_SET_LOWER_COLUMN_ADDRESS + 0);
|
||||
lcd_write(true, LCD_SET_HIGHER_COLUMN_ADDRESS + 0);
|
||||
lcd_write_command(LCD_SET_PAGE_ADDRESS);
|
||||
lcd_write_command(LCD_SET_LOWER_COLUMN_ADDRESS + 0);
|
||||
lcd_write_command(LCD_SET_HIGHER_COLUMN_ADDRESS + 0);
|
||||
|
||||
lcd_clear_display();
|
||||
lcd_update();
|
||||
|
@ -171,9 +171,9 @@ void lcd_blit (unsigned char* p_data, int x, int y, int width, int height, int s
|
|||
/* Copy display bitmap to hardware */
|
||||
while (height--)
|
||||
{
|
||||
lcd_write (true, LCD_CNTL_PAGE | (y++ & 0xf));
|
||||
lcd_write (true, LCD_CNTL_HIGHCOL | (((x+xoffset)>>4) & 0xf));
|
||||
lcd_write (true, LCD_CNTL_LOWCOL | ((x+xoffset) & 0xf));
|
||||
lcd_write_command (LCD_CNTL_PAGE | (y++ & 0xf));
|
||||
lcd_write_command (LCD_CNTL_HIGHCOL | (((x+xoffset)>>4) & 0xf));
|
||||
lcd_write_command (LCD_CNTL_LOWCOL | ((x+xoffset) & 0xf));
|
||||
|
||||
lcd_write_data(p_data, width);
|
||||
p_data += stride;
|
||||
|
@ -193,9 +193,9 @@ void lcd_update (void)
|
|||
/* Copy display bitmap to hardware */
|
||||
for (y = 0; y < LCD_HEIGHT/8; y++)
|
||||
{
|
||||
lcd_write (true, LCD_CNTL_PAGE | (y & 0xf));
|
||||
lcd_write (true, LCD_CNTL_HIGHCOL | ((xoffset>>4) & 0xf));
|
||||
lcd_write (true, LCD_CNTL_LOWCOL | (xoffset & 0xf));
|
||||
lcd_write_command (LCD_CNTL_PAGE | (y & 0xf));
|
||||
lcd_write_command (LCD_CNTL_HIGHCOL | ((xoffset>>4) & 0xf));
|
||||
lcd_write_command (LCD_CNTL_LOWCOL | (xoffset & 0xf));
|
||||
|
||||
lcd_write_data (lcd_framebuffer[y], LCD_WIDTH);
|
||||
}
|
||||
|
@ -224,9 +224,9 @@ void lcd_update_rect (int x_start, int y,
|
|||
/* Copy specified rectange bitmap to hardware */
|
||||
for (; y <= ymax; y++)
|
||||
{
|
||||
lcd_write (true, LCD_CNTL_PAGE | (y & 0xf));
|
||||
lcd_write (true, LCD_CNTL_HIGHCOL | (((x_start+xoffset)>>4) & 0xf));
|
||||
lcd_write (true, LCD_CNTL_LOWCOL | ((x_start+xoffset) & 0xf));
|
||||
lcd_write_command (LCD_CNTL_PAGE | (y & 0xf));
|
||||
lcd_write_command (LCD_CNTL_HIGHCOL | (((x_start+xoffset)>>4) & 0xf));
|
||||
lcd_write_command (LCD_CNTL_LOWCOL | ((x_start+xoffset) & 0xf));
|
||||
|
||||
lcd_write_data (&lcd_framebuffer[y][x_start], width);
|
||||
}
|
||||
|
@ -234,16 +234,16 @@ void lcd_update_rect (int x_start, int y,
|
|||
|
||||
void lcd_set_contrast(int val)
|
||||
{
|
||||
lcd_write(true, LCD_CNTL_CONTRAST);
|
||||
lcd_write(true, val);
|
||||
lcd_write_command(LCD_CNTL_CONTRAST);
|
||||
lcd_write_command(val);
|
||||
}
|
||||
|
||||
void lcd_set_invert_display(bool yesno)
|
||||
{
|
||||
if (yesno)
|
||||
lcd_write(true, LCD_SET_REVERSE_DISPLAY);
|
||||
lcd_write_command(LCD_SET_REVERSE_DISPLAY);
|
||||
else
|
||||
lcd_write(true, LCD_SET_NORMAL_DISPLAY);
|
||||
lcd_write_command(LCD_SET_NORMAL_DISPLAY);
|
||||
}
|
||||
|
||||
/* turn the display upside down (call lcd_update() afterwards) */
|
||||
|
@ -251,14 +251,14 @@ void lcd_set_flip(bool yesno)
|
|||
{
|
||||
if (yesno)
|
||||
{
|
||||
lcd_write(true, LCD_SET_SEGMENT_REMAP);
|
||||
lcd_write(true, LCD_SET_COM_OUTPUT_SCAN_DIRECTION);
|
||||
lcd_write_command(LCD_SET_SEGMENT_REMAP);
|
||||
lcd_write_command(LCD_SET_COM_OUTPUT_SCAN_DIRECTION);
|
||||
xoffset = 132 - LCD_WIDTH; /* 132 colums minus the 112 we have */
|
||||
}
|
||||
else
|
||||
{
|
||||
lcd_write(true, LCD_SET_SEGMENT_REMAP | 0x01);
|
||||
lcd_write(true, LCD_SET_COM_OUTPUT_SCAN_DIRECTION | 0x08);
|
||||
lcd_write_command(LCD_SET_SEGMENT_REMAP | 0x01);
|
||||
lcd_write_command(LCD_SET_COM_OUTPUT_SCAN_DIRECTION | 0x08);
|
||||
xoffset = 0;
|
||||
}
|
||||
}
|
||||
|
@ -274,7 +274,7 @@ void lcd_set_flip(bool yesno)
|
|||
*/
|
||||
void lcd_roll(int lines)
|
||||
{
|
||||
lcd_write(true, LCD_SET_DISPLAY_START_LINE | (lines & (LCD_HEIGHT-1)));
|
||||
lcd_write_command(LCD_SET_DISPLAY_START_LINE | (lines & (LCD_HEIGHT-1)));
|
||||
}
|
||||
|
||||
#endif /* SIMULATOR */
|
||||
|
|
|
@ -82,104 +82,50 @@
|
|||
*
|
||||
*/
|
||||
|
||||
void lcd_write(bool command, int byte) __attribute__ ((section (".icode")));
|
||||
void lcd_write(bool command, int byte)
|
||||
void lcd_write_command(int byte) __attribute__ ((section (".icode")));
|
||||
void lcd_write_command(int byte)
|
||||
{
|
||||
asm("and.b %0, @(r0,gbr)"
|
||||
:
|
||||
: /* %0 */ "I"(~(LCD_CS|LCD_DS|LCD_SD|LCD_SC)),
|
||||
/* %1 */ "z"(LCDR));
|
||||
asm (
|
||||
"and.b %0, @(r0,gbr)"
|
||||
: /* outputs */
|
||||
: /* inputs */
|
||||
/* %0 */ "I"(~(LCD_CS|LCD_DS|LCD_SD|LCD_SC)),
|
||||
/* %1 = r0 */ "z"(LCDR)
|
||||
);
|
||||
|
||||
if (command)
|
||||
asm ("shll8 %0\n"
|
||||
"0: \n\t"
|
||||
"and.b %2,@(r0,gbr)\n\t"
|
||||
"shll %0\n\t"
|
||||
"bf 1f\n\t"
|
||||
asm (
|
||||
"0: \n"
|
||||
"and.b %2,@(r0,gbr) \n"
|
||||
"shll %0 \n"
|
||||
"bf 1f \n"
|
||||
"or.b %3,@(r0,gbr) \n"
|
||||
"1: \n\t"
|
||||
"1: \n"
|
||||
"or.b %4,@(r0,gbr) \n"
|
||||
"add #-1,%1\n\t"
|
||||
"cmp/pl %1\n\t"
|
||||
"bt 0b"
|
||||
:
|
||||
: /* %0 */ "r"(((unsigned)byte)<<16),
|
||||
"add #-1,%1 \n"
|
||||
"cmp/pl %1 \n"
|
||||
"bt 0b \n"
|
||||
: /* outputs */
|
||||
: /* inputs */
|
||||
/* %0 */ "r"(((unsigned)byte)<<24),
|
||||
/* %1 */ "r"(8),
|
||||
/* %2 */ "I"(~(LCD_SC|LCD_SD|LCD_DS)),
|
||||
/* %3 */ "I"(LCD_SD),
|
||||
/* %4 */ "I"(LCD_SC),
|
||||
/* %5 */ "z"(LCDR));
|
||||
else
|
||||
asm ("shll8 %0\n"
|
||||
"0: \n\t"
|
||||
"and.b %2, @(r0,gbr)\n\t"
|
||||
"shll %0\n\t"
|
||||
"bf 1f\n\t"
|
||||
"or.b %3, @(r0,gbr)\n"
|
||||
"1: \n\t"
|
||||
"or.b %4, @(r0,gbr)\n"
|
||||
"and.b %2, @(r0,gbr)\n\t"
|
||||
"shll %0\n\t"
|
||||
"bf 1f\n\t"
|
||||
"or.b %3, @(r0,gbr)\n"
|
||||
"1: \n\t"
|
||||
"or.b %4, @(r0,gbr)\n"
|
||||
"and.b %2, @(r0,gbr)\n\t"
|
||||
"shll %0\n\t"
|
||||
"bf 1f\n\t"
|
||||
"or.b %3, @(r0,gbr)\n"
|
||||
"1: \n\t"
|
||||
"or.b %4, @(r0,gbr)\n"
|
||||
"and.b %2, @(r0,gbr)\n\t"
|
||||
"shll %0\n\t"
|
||||
"bf 1f\n\t"
|
||||
"or.b %3, @(r0,gbr)\n"
|
||||
"1: \n\t"
|
||||
"or.b %4, @(r0,gbr)\n"
|
||||
"and.b %2, @(r0,gbr)\n\t"
|
||||
"shll %0\n\t"
|
||||
"bf 1f\n\t"
|
||||
"or.b %3, @(r0,gbr)\n"
|
||||
"1: \n\t"
|
||||
"or.b %4, @(r0,gbr)\n"
|
||||
"and.b %2, @(r0,gbr)\n\t"
|
||||
"shll %0\n\t"
|
||||
"bf 1f\n\t"
|
||||
"or.b %3, @(r0,gbr)\n"
|
||||
"1: \n\t"
|
||||
"or.b %4, @(r0,gbr)\n"
|
||||
"and.b %2, @(r0,gbr)\n\t"
|
||||
"shll %0\n\t"
|
||||
"bf 1f\n\t"
|
||||
"or.b %3, @(r0,gbr)\n"
|
||||
"1: \n\t"
|
||||
"or.b %4, @(r0,gbr)\n"
|
||||
"and.b %2, @(r0,gbr)\n\t"
|
||||
"shll %0\n\t"
|
||||
"bf 1f\n\t"
|
||||
"or.b %3, @(r0,gbr)\n"
|
||||
"1: \n\t"
|
||||
"or.b %4, @(r0,gbr)\n"
|
||||
:
|
||||
: /* %0 */ "r"(((unsigned)byte)<<16),
|
||||
/* %1 */ "r"(8),
|
||||
/* %2 */ "I"(~(LCD_SC|LCD_SD)),
|
||||
/* %3 */ "I"(LCD_SD|LCD_DS),
|
||||
/* %4 */ "I"(LCD_SC|LCD_DS),
|
||||
/* %5 */ "z"(LCDR));
|
||||
/* %5 = r0 */ "z"(LCDR)
|
||||
);
|
||||
|
||||
asm("or.b %0, @(r0,gbr)"
|
||||
:
|
||||
: /* %0 */ "I"(LCD_CS|LCD_DS|LCD_SD|LCD_SC),
|
||||
/* %1 */ "z"(LCDR));
|
||||
asm (
|
||||
"or.b %0, @(r0,gbr)"
|
||||
: /* outputs */
|
||||
: /* inputs */
|
||||
/* %0 */ "I"(LCD_CS|LCD_DS|LCD_SD|LCD_SC),
|
||||
/* %1 = r0 */ "z"(LCDR)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/* A high performance function to write data to the display,
|
||||
one or multiple bytes.
|
||||
Ultimately, all calls to lcd_write(false, xxx) should be substituted by
|
||||
this, it will be most efficient if the LCD buffer is tilted to have the
|
||||
X row as consecutive bytes, so we can write a whole row */
|
||||
one or multiple bytes. */
|
||||
void lcd_write_data(unsigned char* p_bytes, int count) __attribute__ ((section (".icode")));
|
||||
|
||||
#ifdef HAVE_LCD_CHARCELLS
|
||||
|
@ -205,10 +151,10 @@ void lcd_write_data(unsigned char* p_bytes, int count)
|
|||
"mov %0,%1 \n" /* sda1 -> clk0sda0 */
|
||||
"and %5,%1 \n" /* clk0sda0 &= ~LCD_SD both low */
|
||||
"mov.b %1,@%2 \n" /* PBDRL = clk0sda0 */
|
||||
: // outputs
|
||||
: /* outputs */
|
||||
/* %0 */ "=r"(sda1),
|
||||
/* %1 */ "=r"(clk0sda0)
|
||||
: // inputs
|
||||
: /* inputs */
|
||||
/* %2 */ "r"(LCDR),
|
||||
/* %3 */ "r"(~(LCD_CS | LCD_SC)),
|
||||
/* %4 */ "r"(LCD_DS | LCD_SD),
|
||||
|
@ -217,9 +163,8 @@ void lcd_write_data(unsigned char* p_bytes, int count)
|
|||
|
||||
/* unrolled loop to serialize the byte */
|
||||
asm (
|
||||
"mov %4,r0\n" /* we need &PBDRL in r0 for "or.b x,@(r0,gbr)" */
|
||||
|
||||
"shll %0 \n" /* shift the MSB into carry */
|
||||
|
||||
"bf 1f \n"
|
||||
"mov.b %1,@%4 \n" /* if it was a "1": set SD high, SC low still */
|
||||
"1: \n"
|
||||
|
@ -275,14 +220,14 @@ void lcd_write_data(unsigned char* p_bytes, int count)
|
|||
"or.b %2,@(r0,gbr) \n" /* rise SC (independent of SD level) */
|
||||
|
||||
"or.b %5,@(r0,gbr) \n" /* restore port */
|
||||
:
|
||||
: /* %0 */ "r"(byte),
|
||||
: /* outputs */
|
||||
: /* inputs */
|
||||
/* %0 */ "r"(byte),
|
||||
/* %1 */ "r"(sda1),
|
||||
/* %2 */ "I"(LCD_SC),
|
||||
/* %3 */ "r"(clk0sda0),
|
||||
/* %4 */ "r"(LCDR),
|
||||
/* %4 = r0 */ "z"(LCDR),
|
||||
/* %5 */ "I"(LCD_CS|LCD_DS|LCD_SD|LCD_SC)
|
||||
: "r0"
|
||||
);
|
||||
|
||||
/* This is the place to reenable the interrupts, if we have disabled
|
||||
|
@ -393,3 +338,5 @@ void lcd_write_data(unsigned char* p_bytes, int count)
|
|||
} while (--count); /* tail loop is faster */
|
||||
}
|
||||
#endif /* #ifdef HAVE_LCD_CHARCELLS */
|
||||
|
||||
|
||||
|
|
|
@ -43,7 +43,7 @@ extern void lcd_stop_scroll(void);
|
|||
extern void lcd_scroll_speed( int speed );
|
||||
extern void lcd_scroll_delay( int ms );
|
||||
extern void lcd_set_contrast(int val);
|
||||
extern void lcd_write( bool command, int byte );
|
||||
extern void lcd_write_command( int byte );
|
||||
extern void lcd_write_data( unsigned char* p_bytes, int count );
|
||||
extern int lcd_default_contrast(void);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue