First step of charcell LCD code rework: * Make it fully unicode aware so that adding non-ISO8859-1 scripts becomes possible (limited by the LCD capabilities of course). * Make the API more similar to the bitmap LCD code's API. * Moved hardware dependent parts to target tree. * Simplified code. * Jumpscroll temporarily non-functional.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12916 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Jens Arnold 2007-03-26 07:52:13 +00:00
parent 165f62d0cd
commit ad4e3d6657
26 changed files with 1652 additions and 1806 deletions

View file

@ -26,13 +26,13 @@
typedef const unsigned char * ICON;
#define NOICON NULL
#else
typedef short ICON;
typedef long ICON;
#define NOICON -1
#endif
#define Icon_NOICON -1
#define CURSOR_CHAR 0x92
#define CURSOR_CHAR 0xe10c
#define CURSOR_WIDTH 6
#define CURSOR_HEIGHT 8

View file

@ -30,8 +30,8 @@
enum {
Icon_Queued = 'Q',
Icon_Moving = 'M',
Icon_Unknown = 0x90,
Icon_Bookmark = 0x16,
Icon_Unknown = 0xe100,
Icon_Bookmark,
Icon_Plugin,
Icon_Folder,
Icon_Firmware,

View file

@ -31,53 +31,46 @@
#include "misc.h"
#include "rbunicode.h"
#define KBD_BUF_SIZE 64
#define KEYBOARD_PAGES 3
extern unsigned short *lcd_ascii;
static unsigned char* kbd_setupkeys(int page, int* len)
static unsigned short *kbd_setupkeys(int page, int* len)
{
static unsigned char lines[128];
unsigned ch;
static unsigned short kbdline[KBD_BUF_SIZE];
const unsigned char *p;
int i = 0;
switch (page)
switch (page)
{
case 0: /* Capitals */
for (ch = 'A'; ch <= 'Z'; ch++)
lines[i++] = ch;
for (ch = 0xc0; ch <= 0xdd; ch++)
if (lcd_ascii[ch] != NOCHAR_NEW && lcd_ascii[ch] != NOCHAR_OLD)
lines[i++] = ch;
p = "ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅ"
"ÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÝ";
break;
case 1: /* Small */
for (ch = 'a'; ch <= 'z'; ch++)
lines[i++] = ch;
for (ch = 0xdf; ch <= 0xff; ch++)
if (lcd_ascii[ch] != NOCHAR_NEW && lcd_ascii[ch] != NOCHAR_OLD)
lines[i++] = ch;
p = "abcdefghijklmnopqrstuvwxyzßàáâãä"
"åçèéêëìíîïñòóôöøùúûüýÿ";
break;
case 2: /* Others */
for (ch = ' '; ch <= '@'; ch++)
lines[i++] = ch;
default: /* Others */
p = " !\"#$%&'()*+,-./0123456789:;<=>?@[]_{}~";
break;
}
lines[i] = 0;
while (*p)
p = utf8decode(p, &kbdline[i++]);
*len = i;
return lines;
return kbdline;
}
/* Delimiters for highlighting the character selected for insertion */
#define KEYBOARD_INSERT_LEFT 0x81
#define KEYBOARD_INSERT_RIGHT 0x82
#define KEYBOARD_INSERT_LEFT 0xe110
#define KEYBOARD_INSERT_RIGHT 0xe10f
#define KEYBOARD_CURSOR 0x7f
#define KEYBOARD_ARROW 0x92
#define KEYBOARD_ARROW 0xe10c
/* helper function to spell a char if voice UI is enabled */
static void kbd_spellchar(char c)
@ -101,9 +94,8 @@ int kbd_input(char* text, int buflen)
int len, len_utf8, i, j;
int editpos, curpos, leftpos;
unsigned char *line = kbd_setupkeys(page, &linelen);
unsigned short *line = kbd_setupkeys(page, &linelen);
unsigned char temptext[36];
unsigned char tmp;
unsigned char *utf8;
int button, lastbutton = 0;
@ -130,20 +122,14 @@ int kbd_input(char* text, int buflen)
lcd_putc(0, 0, KEYBOARD_ARROW);
lcd_putc(0, 1, ' ');
}
/* Draw insert chars */
utf8 = temptext;
tmp = KEYBOARD_INSERT_LEFT;
utf8 = iso_decode(&tmp, utf8, 0, 1);
utf8 = iso_decode(&line[x], utf8, 0, 1);
tmp = KEYBOARD_INSERT_RIGHT;
utf8 = iso_decode(&tmp, utf8, 0, 1);
lcd_putc(1, 0, KEYBOARD_INSERT_LEFT);
lcd_putc(2, 0, line[x]);
lcd_putc(3, 0, KEYBOARD_INSERT_RIGHT);
for (i = 1; i < 8; i++)
{
utf8 = iso_decode(&line[(x+i)%linelen], utf8, 0, 1);
lcd_putc(i + 3, 0, line[(x+i)%linelen]);
}
*utf8 = 0;
lcd_puts(1, 0, temptext);
/* write out the text */
curpos = MIN(MIN(editpos, 10 - MIN(len_utf8 - editpos, 3)), 9);
@ -175,7 +161,7 @@ int kbd_input(char* text, int buflen)
lcd_remove_cursor();
lcd_puts(1, 1, temptext);
lcd_put_cursor(curpos + 1, 1, KEYBOARD_CURSOR);
gui_syncstatusbar_draw(&statusbars, true);
}
@ -270,7 +256,7 @@ int kbd_input(char* text, int buflen)
}
else /* inserts the selected char */
{
utf8 = iso_decode((unsigned char*)&line[x], temptext, 0, 1);
utf8 = utf8encode(line[x], temptext);
*utf8 = 0;
j = strlen(temptext);
if (len + j < buflen)

View file

@ -67,6 +67,9 @@ static const struct plugin_api rockbox_api = {
/* lcd */
lcd_set_contrast,
lcd_clear_display,
lcd_setmargins,
lcd_getstringsize,
lcd_putsxy,
lcd_puts,
lcd_puts_scroll,
lcd_stop_scroll,
@ -80,11 +83,9 @@ static const struct plugin_api rockbox_api = {
PREFIX(lcd_icon),
lcd_double_height,
#else
lcd_setmargins,
lcd_set_drawmode,
lcd_get_drawmode,
lcd_setfont,
lcd_getstringsize,
lcd_drawpixel,
lcd_drawline,
lcd_hline,
@ -109,7 +110,6 @@ static const struct plugin_api rockbox_api = {
bidi_l2v,
font_get_bits,
font_load,
lcd_putsxy,
lcd_puts_style,
lcd_puts_scroll_style,
&lcd_framebuffer[0][0],

View file

@ -29,7 +29,7 @@
#define MEM 2
#endif
#include <stdbool.h>
#include <stdbool.h>
#include <sys/types.h>
#include <stdarg.h>
#include <stdio.h>
@ -110,12 +110,12 @@
#define PLUGIN_MAGIC 0x526F634B /* RocK */
/* increase this every time the api struct changes */
#define PLUGIN_API_VERSION 49
#define PLUGIN_API_VERSION 50
/* update this to latest version if a change to the api struct breaks
backwards compatibility (and please take the opportunity to sort in any
new function which are "waiting" at the end of the function table) */
#define PLUGIN_MIN_API_VERSION 47
#define PLUGIN_MIN_API_VERSION 50
/* plugin return codes */
enum plugin_status {
@ -135,24 +135,25 @@ struct plugin_api {
/* lcd */
void (*lcd_set_contrast)(int x);
void (*lcd_clear_display)(void);
void (*lcd_setmargins)(int x, int y);
int (*lcd_getstringsize)(const unsigned char *str, int *w, int *h);
void (*lcd_putsxy)(int x, int y, const unsigned char *string);
void (*lcd_puts)(int x, int y, const unsigned char *string);
void (*lcd_puts_scroll)(int x, int y, const unsigned char* string);
void (*lcd_stop_scroll)(void);
#ifdef HAVE_LCD_CHARCELLS
void (*lcd_define_pattern)(int which,const char *pattern);
unsigned char (*lcd_get_locked_pattern)(void);
void (*lcd_unlock_pattern)(unsigned char pat);
void (*lcd_putc)(int x, int y, unsigned short ch);
void (*lcd_put_cursor)(int x, int y, char cursor_char);
void (*lcd_define_pattern)(unsigned long ucs, const char *pattern);
unsigned long (*lcd_get_locked_pattern)(void);
void (*lcd_unlock_pattern)(unsigned long ucs);
void (*lcd_putc)(int x, int y, unsigned long ucs);
void (*lcd_put_cursor)(int x, int y, unsigned long ucs);
void (*lcd_remove_cursor)(void);
void (*PREFIX(lcd_icon))(int icon, bool enable);
void (*lcd_double_height)(bool on);
#else
void (*lcd_setmargins)(int x, int y);
void (*lcd_set_drawmode)(int mode);
int (*lcd_get_drawmode)(void);
void (*lcd_setfont)(int font);
int (*lcd_getstringsize)(const unsigned char *str, int *w, int *h);
void (*lcd_drawpixel)(int x, int y);
void (*lcd_drawline)(int x1, int y1, int x2, int y2);
void (*lcd_hline)(int x1, int x2, int y);
@ -184,7 +185,6 @@ struct plugin_api {
unsigned short *(*bidi_l2v)( const unsigned char *str, int orientation );
const unsigned char *(*font_get_bits)( struct font *pf, unsigned short char_code );
struct font* (*font_load)(const char *path);
void (*lcd_putsxy)(int x, int y, const unsigned char *string);
void (*lcd_puts_style)(int x, int y, const unsigned char *str, int style);
void (*lcd_puts_scroll_style)(int x, int y, const unsigned char* string,
int style);

View file

@ -138,7 +138,7 @@ static unsigned char *abbrev_str[12] = {
};
static unsigned char heuro,hhome; /*Handles for the new patterns*/
static unsigned long heuro,hhome; /*Handles for the new patterns*/
static struct plugin_api* rb;
@ -239,7 +239,6 @@ static void round(longlong_t* i, longlong_t* f, int n)
*/
static void display(longlong_t euro, longlong_t home, bool pos)
{
char c1,c2;
longlong_t i,f;
unsigned char str[20];
unsigned char s1[20];
@ -247,52 +246,50 @@ static void display(longlong_t euro, longlong_t home, bool pos)
if (pos)
{ /*Edit the second line*/
c1=0x20;
rb->strcpy(s1,"%c%c%6d.%02d");
c2=0x81;
rb->strcpy(s1," %6d.%02d");
if (nb_digit[country]==2)
rb->strcpy(s2,"%c%c%06d.%02d");
rb->strcpy(s2,"\xee\x84\x90%06d.%02d");
else
rb->strcpy(s2,"%c%c%09d");
rb->strcpy(s2,"\xee\x84\x90%09d");
}
else
{
c1=0x81;
rb->strcpy(s1,"%c%c%06d.%02d");
c2=0x20;
rb->strcpy(s1,"\xee\x84\x90%06d.%02d");
if (nb_digit[country]==2)
rb->strcpy(s2,"%c%c%6d.%02d");
rb->strcpy(s2," %6d.%02d");
else
rb->strcpy(s2,"%c%c%9d");
rb->strcpy(s2," %9d");
}
rb->lcd_remove_cursor();
/*First line*/
rb->lcd_putc(0,0,heuro);
split(euro,&i,&f);
if (pos)
round(&i,&f,2);
rb->snprintf(str,sizeof(str),s1,heuro,c1,(int)i,(int)f);
rb->snprintf(str,sizeof(str),s1,(int)i,(int)f);
if (!pos)
{
rb->lcd_puts(0,0,str);
rb->lcd_puts(1,0,str);
rb->lcd_put_cursor(10-cur_pos,0,0x5F);
}
else
rb->lcd_puts_scroll(0,0,str);
rb->lcd_puts_scroll(1,0,str);
/*Second line*/
rb->lcd_putc(0,1,hhome);
split(home,&i,&f);
if (!pos)
round(&i,&f,nb_digit[country]);
rb->snprintf(str,sizeof(str),s2,hhome,c2,(int)i,(int)f);
rb->snprintf(str,sizeof(str),s2,(int)i,(int)f);
if (pos)
{
rb->lcd_puts(0,1,str);
rb->lcd_puts(1,1,str);
rb->lcd_put_cursor(10-cur_pos,1,0x5F);
}
else
rb->lcd_puts_scroll(0,1,str);
rb->lcd_puts_scroll(1,1,str);
}
@ -363,7 +360,7 @@ static int euro_menu(void)
rb->lcd_clear_display();
rb->lcd_puts(0,0," Currency");
rb->lcd_puts(0,1," Exit");
rb->lcd_putc(0,c,0x81);
rb->lcd_putc(0,c,0xe110);
switch (rb->button_get(true))
{

View file

@ -203,7 +203,7 @@ static const unsigned char tk_pat[4][7] = {
};
static unsigned char cur_pat[7];
static unsigned char gfx_chars[5];
static unsigned long gfx_chars[5];
static void release_gfx(void)
{

View file

@ -47,7 +47,7 @@ static unsigned char pattern[]={
};
static unsigned char str[12]; /*Containt the first line*/
static unsigned char h1,h2,h3; /*Handle for the pattern*/
static unsigned long h1,h2,h3; /*Handle for the pattern*/
/* here is a global api struct pointer. while not strictly necessary,
it's nice not to have to pass the api pointer in all function calls
@ -109,10 +109,12 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
rb->lcd_define_pattern(h1, pattern);
rb->lcd_define_pattern(h2, pattern+7);
rb->lcd_define_pattern(h3, pattern+28);
rb->snprintf(str,sizeof(str),"%c%cJackpot%c%c",h1,h2,h2,h1);
rb->lcd_puts(0,0,str);
rb->snprintf(str,sizeof(str)," %c V1.1 %c",h3,h3);
rb->lcd_puts(0,1,str);
rb->lcd_puts(0,0," Jackpot ");
rb->lcd_putc(0,0,h1); rb->lcd_putc(1,0,h2);
rb->lcd_putc(9,0,h2); rb->lcd_putc(10,0,h1);
rb->lcd_puts(0,1," V1.1 ");
rb->lcd_putc(1,1,h3); rb->lcd_putc(9,1,h3);
rb->sleep(HZ*2);
rb->lcd_clear_display();

View file

@ -31,7 +31,7 @@ static int char_width;
static int char_height;
static int pixel_height;
static int pixel_width;
static unsigned char gfx_chars[8];
static unsigned long gfx_chars[8];
static unsigned char gfx_buffer[56];
static int drawmode = DRMODE_SOLID;

View file

@ -56,7 +56,7 @@ static unsigned char pattern2[]={0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14}; /*2
static unsigned char pattern1[]={0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10}; /*1 part*/
static unsigned char str[12]; /*String use to display the first line*/
static unsigned char hsmile,hcry,h1,h2; /*Handle for the new pattern*/
static unsigned long hsmile,hcry,h1,h2; /*Handle for the new pattern*/
static bool end; /*If true game is finished*/
static struct plugin_api* rb;
@ -74,8 +74,8 @@ static void impossible(void)
static void lose(void)
{
rb->lcd_define_pattern(hsmile,smile);
rb->snprintf(str,sizeof(str),"You Win!!%c",hsmile);
rb->lcd_puts(0,1,str);
rb->lcd_puts(0,1,"You Win!!");
rb->lcd_putc(8,1,hsmile);
end=true;
rb->sleep(HZ*2);
return;
@ -86,8 +86,8 @@ static void lose(void)
static void win(void)
{
rb->lcd_define_pattern(hcry,cry);
rb->snprintf(str,sizeof(str),"You Lose!!%c",hcry);
rb->lcd_puts(0,1,str);
rb->lcd_puts(0,1,"You Lose!!");
rb->lcd_putc(9,1,hcry);
end=true;
rb->sleep(HZ*2);
return;
@ -100,22 +100,22 @@ static void display_first_line(int x)
int i;
rb->snprintf(str,sizeof(str)," =%d",x);
rb->lcd_puts(0,0,str);
rb->lcd_define_pattern(h1,pattern3);
for(i=0;i<x/3;i++)
str[i]=h1;
for (i=0;i<x/3;i++)
rb->lcd_putc(i,0,h1);
if (x%3==2)
{
rb->lcd_define_pattern(h2,pattern2);
str[i]=h2;
rb->lcd_putc(i,0,h2);
}
if (x%3==1)
{
rb->lcd_define_pattern(h2,pattern1);
str[i]=h2;
rb->lcd_putc(i,0,h2);
}
rb->lcd_puts(0,0,str);
}
/* Call when the program end */

View file

@ -41,16 +41,15 @@ void screen_init(struct screen * screen, enum screen_type screen_type)
screen->depth=LCD_REMOTE_DEPTH;
screen->has_disk_led=false;
#if 1 /* all remote LCDs are bitmapped so far */
screen->width=LCD_REMOTE_WIDTH;
screen->height=LCD_REMOTE_HEIGHT;
screen->setmargins=&lcd_remote_setmargins;
screen->getymargin=&lcd_remote_getymargin;
screen->getxmargin=&lcd_remote_getxmargin;
screen->getstringsize=&lcd_remote_getstringsize;
#if 1 /* all remote LCDs are bitmapped so far */
screen->setfont=&lcd_remote_setfont;
screen->setfont(FONT_UI);
screen->getstringsize=&lcd_remote_getstringsize;
screen->putsxy=&lcd_remote_putsxy;
screen->mono_bitmap=&lcd_remote_mono_bitmap;
screen->mono_bitmap_part=&lcd_remote_mono_bitmap_part;
screen->set_drawmode=&lcd_remote_set_drawmode;
@ -70,20 +69,14 @@ void screen_init(struct screen * screen, enum screen_type screen_type)
screen->drawline=&lcd_remote_drawline;
screen->vline=&lcd_remote_vline;
screen->hline=&lcd_remote_hline;
screen->scroll_speed=&lcd_remote_scroll_speed;
screen->scroll_delay=&lcd_remote_scroll_delay;
screen->scroll_step=&lcd_remote_scroll_step;
screen->invertscroll=&lcd_remote_invertscroll;
#endif /* LCD_REMOTE_DEPTH > 1 */
screen->puts_offset=&lcd_remote_puts_offset;
screen->puts_style_offset=&lcd_remote_puts_style_offset;
screen->puts_scroll_style=&lcd_remote_puts_scroll_style;
screen->puts_scroll_offset=&lcd_remote_puts_scroll_offset;
screen->puts_scroll_style_offset=&lcd_remote_puts_scroll_style_offset;
#endif /* 1 */
#if 0 /* no charcell remote LCDs so far */
screen->width=11;
screen->height=2;
screen->double_height=&lcd_remote_double_height;
screen->putc=&lcd_remote_putc;
screen->get_locked_pattern=&lcd_remote_get_locked_pattern;
@ -96,11 +89,16 @@ void screen_init(struct screen * screen, enum screen_type screen_type)
#endif /* 0 */
screen->init=&lcd_remote_init;
screen->putsxy=&lcd_remote_putsxy;
screen->puts=&lcd_remote_puts;
screen->puts_offset=&lcd_remote_puts_offset;
screen->puts_scroll=&lcd_remote_puts_scroll;
screen->puts_scroll_offset=&lcd_remote_puts_scroll_offset;
screen->scroll_speed=&lcd_remote_scroll_speed;
screen->scroll_delay=&lcd_remote_scroll_delay;
screen->stop_scroll=&lcd_remote_stop_scroll;
screen->clear_display=&lcd_remote_clear_display;
screen->update=&lcd_remote_update;
screen->puts=&lcd_remote_puts;
screen->backlight_on=&remote_backlight_on;
screen->backlight_off=&remote_backlight_off;
screen->is_backlight_on=&is_remote_backlight_on;
@ -116,16 +114,15 @@ void screen_init(struct screen * screen, enum screen_type screen_type)
#elif defined(HAVE_REMOTE_LCD)
screen->has_disk_led=true;
#endif
#ifdef HAVE_LCD_BITMAP
screen->width=LCD_WIDTH;
screen->height=LCD_HEIGHT;
screen->setmargins=&lcd_setmargins;
screen->getymargin=&lcd_getymargin;
screen->getxmargin=&lcd_getxmargin;
screen->getstringsize=&lcd_getstringsize;
#ifdef HAVE_LCD_BITMAP
screen->setfont=&lcd_setfont;
screen->setfont(FONT_UI);
screen->getstringsize=&lcd_getstringsize;
screen->putsxy=&lcd_putsxy;
screen->mono_bitmap=&lcd_mono_bitmap;
screen->mono_bitmap_part=&lcd_mono_bitmap_part;
screen->set_drawmode=&lcd_set_drawmode;
@ -147,7 +144,7 @@ void screen_init(struct screen * screen, enum screen_type screen_type)
screen->get_foreground=&lcd_get_foreground;
screen->set_background=&lcd_set_background;
screen->set_foreground=&lcd_set_foreground;
#endif
#endif /* LCD_DEPTH > 1 */
screen->update_rect=&lcd_update_rect;
screen->fillrect=&lcd_fillrect;
screen->drawrect=&lcd_drawrect;
@ -155,20 +152,14 @@ void screen_init(struct screen * screen, enum screen_type screen_type)
screen->drawline=&lcd_drawline;
screen->vline=&lcd_vline;
screen->hline=&lcd_hline;
screen->scroll_speed=&lcd_scroll_speed;
screen->scroll_delay=&lcd_scroll_delay;
screen->scroll_step=&lcd_scroll_step;
screen->invertscroll=&lcd_invertscroll;
screen->puts_offset=&lcd_puts_offset;
screen->puts_style_offset=&lcd_puts_style_offset;
screen->puts_scroll_style=&lcd_puts_scroll_style;
screen->puts_scroll_offset=&lcd_puts_scroll_offset;
screen->puts_scroll_style_offset=&lcd_puts_scroll_style_offset;
#endif /* HAVE_LCD_BITMAP */
#ifdef HAVE_LCD_CHARCELLS
screen->width=11; /* width in characters instead of pixels */
screen->height=2;
screen->double_height=&lcd_double_height;
screen->putc=&lcd_putc;
screen->get_locked_pattern=&lcd_get_locked_pattern;
@ -181,13 +172,18 @@ void screen_init(struct screen * screen, enum screen_type screen_type)
#endif /* HAVE_LCD_CHARCELLS */
screen->init=&lcd_init;
screen->putsxy=&lcd_putsxy;
screen->puts=&lcd_puts;
screen->puts_offset=&lcd_puts_offset;
screen->puts_scroll=&lcd_puts_scroll;
screen->puts_scroll_offset=&lcd_puts_scroll_offset;
screen->scroll_speed=&lcd_scroll_speed;
screen->scroll_delay=&lcd_scroll_delay;
screen->stop_scroll=&lcd_stop_scroll;
screen->clear_display=&lcd_clear_display;
#if defined(HAVE_LCD_BITMAP) || defined(SIMULATOR)
screen->update=&lcd_update;
#endif
screen->puts=&lcd_puts;
screen->backlight_on=&backlight_on;
screen->backlight_off=&backlight_off;
screen->is_backlight_on=&is_backlight_on;

View file

@ -60,24 +60,19 @@ struct screen
#ifdef HAS_BUTTONBAR
bool has_buttonbar;
#endif
#if defined(HAVE_LCD_BITMAP) || defined(HAVE_REMOTE_LCD) /* always bitmap */
void (*setmargins)(int x, int y);
int (*getxmargin)(void);
int (*getymargin)(void);
void (*setfont)(int newfont);
int (*getstringsize)(const unsigned char *str, int *w, int *h);
void (*putsxy)(int x, int y, const unsigned char *str);
#if defined(HAVE_LCD_BITMAP) || defined(HAVE_REMOTE_LCD) /* always bitmap */
void (*setfont)(int newfont);
void (*scroll_step)(int pixels);
void (*puts_offset)(int x, int y, const unsigned char *str, int offset);
void (*puts_style_offset)(int x, int y, const unsigned char *str,
int style, int offset);
void (*puts_scroll_style)(int x, int y, const unsigned char *string,
int style);
void (*puts_scroll_offset)(int x, int y, const unsigned char *string,
int offset);
void (*puts_scroll_style_offset)(int x, int y, const unsigned char *string,
int style, int offset);
void (*mono_bitmap)(const unsigned char *src,
@ -114,17 +109,22 @@ struct screen
#ifdef HAVE_LCD_CHARCELLS /* no charcell remote LCDs so far */
void (*double_height)(bool on);
void (*putc)(int x, int y, unsigned short ch);
void (*putc)(int x, int y, unsigned long ucs);
void (*icon)(int icon, bool enable);
unsigned long (*get_locked_pattern)(void);
void (*define_pattern)(unsigned long ucs, const char *pattern);
#endif
void (*init)(void);
void (*putsxy)(int x, int y, const unsigned char *str);
void (*puts)(int x, int y, const unsigned char *str);
void (*puts_offset)(int x, int y, const unsigned char *str, int offset);
void (*puts_scroll)(int x, int y, const unsigned char *string);
void (*puts_scroll_offset)(int x, int y, const unsigned char *string,
int offset);
void (*scroll_speed)(int speed);
void (*scroll_delay)(int ms);
void (*stop_scroll)(void);
void (*clear_display)(void);
unsigned char (*get_locked_pattern)(void);
void (*define_pattern)(int pat, const char *pattern);
#if defined(HAVE_LCD_BITMAP) || defined(HAVE_REMOTE_LCD) || defined(SIMULATOR)
void (*update)(void);
#endif
@ -132,7 +132,6 @@ struct screen
void (*backlight_off)(void);
bool (*is_backlight_on)(void);
void (*backlight_set_timeout)(int index);
void (*puts)(int x, int y, const unsigned char *str);
};
/*

View file

@ -254,12 +254,12 @@ static void charging_display_info(bool animate)
}
#else /* not HAVE_LCD_BITMAP */
static unsigned char logo_chars[5];
static unsigned long logo_chars[4];
static const unsigned char logo_pattern[] = {
0x07, 0x04, 0x1c, 0x14, 0x1c, 0x04, 0x07, /* char 1 */
0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, /* char 2 */
0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, /* char 3 */
0x1f, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1f, /* char 4 */
0x07, 0x04, 0x1c, 0x14, 0x1c, 0x04, 0x07, 0, /* char 1 */
0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0, /* char 2 */
0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0, /* char 3 */
0x1f, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1f, 0, /* char 4 */
};
static void logo_lock_patterns(bool on)
@ -270,7 +270,6 @@ static void logo_lock_patterns(bool on)
{
for (i = 0; i < 4; i++)
logo_chars[i] = lcd_get_locked_pattern();
logo_chars[4] = '\0';
}
else
{
@ -284,19 +283,20 @@ static void charging_display_info(bool animate)
int battv;
unsigned i, ypos;
static unsigned phase = 3;
char buf[28];
char buf[32];
battv = battery_voltage();
snprintf(buf, sizeof(buf), "%s %d.%02dV", logo_chars,
battv / 100, battv % 100);
lcd_puts(0, 1, buf);
snprintf(buf, sizeof(buf), " %d.%02dV", battv / 100, battv % 100);
lcd_puts(4, 1, buf);
memcpy(buf, logo_pattern, 28); /* copy logo patterns */
memcpy(buf, logo_pattern, 32); /* copy logo patterns */
if (!animate) /* build the screen */
{
lcd_double_height(false);
lcd_puts(0, 0, "[Charging]");
for (i = 0; i < 4; i++)
lcd_putc(i, 1, logo_chars[i]);
}
else /* animate the logo */
{
@ -307,14 +307,14 @@ static void charging_display_info(bool animate)
ypos = (phase + i/5) % 9; /* "bounce" effect */
if (ypos > 4)
ypos = 8 - ypos;
buf[5 - ypos + 7 * (i/5)] |= 0x10 >> (i%5);
buf[5 - ypos + 8 * (i/5)] |= 0x10 >> (i%5);
}
}
phase++;
}
for (i = 0; i < 4; i++)
lcd_define_pattern(logo_chars[i], buf + 7 * i);
lcd_define_pattern(logo_chars[i], buf + 8 * i);
}
#endif /* (not) HAVE_LCD_BITMAP */

View file

@ -59,8 +59,8 @@ common/unicode.c
/* Display */
#ifdef HAVE_LCD_CHARCELLS
drivers/lcd-player-charset.c
drivers/lcd-player.c
drivers/lcd-charcell.c
drivers/lcd-charset-player.c
#endif /* HAVE_LCD_CHARCELLS */
#ifdef HAVE_LCD_BITMAP
@ -317,6 +317,7 @@ target/sh/archos/ata-archos.c
target/sh/archos/ata-as-archos.S
target/sh/archos/player/button-player.c
target/sh/archos/player/lcd-as-player.S
target/sh/archos/player/lcd-player.c
#endif /* SIMULATOR */
#endif /* ARCHOS_PLAYER */

View file

@ -0,0 +1,612 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2007 by Jens Arnold
* Based on the work of Alan Korr, Kjell Ericson and others
*
* All files in this archive are subject to the GNU General Public License.
* See the file COPYING in the source tree root for full license agreement.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include "config.h"
#include "hwcompat.h"
#include "lcd.h"
#include "kernel.h"
#include "thread.h"
#include <string.h>
#include <stdlib.h>
#include "file.h"
#include "debug.h"
#include "system.h"
#include "lcd-charcell.h"
#include "rbunicode.h"
/** definitions **/
#define SCROLLABLE_LINES LCD_HEIGHT
#define VARIABLE_XCHARS 16 /* number of software user-definable characters */
#define NO_PATTERN (-1)
#define SCROLL_MODE_OFF 0
#define SCROLL_MODE_RUN 1
/* track usage of user-definable characters */
struct pattern_info {
short count;
unsigned short xchar;
};
struct cursor_info {
unsigned char hw_char;
bool enabled;
bool visible;
int x;
int y;
int divider;
int downcount;
};
static int find_xchar(unsigned long ucs);
/** globals **/
/* The "frame"buffer */
static unsigned char lcd_buffer[LCD_WIDTH][LCD_HEIGHT];
#ifdef SIMULATOR
unsigned char hardware_buffer_lcd[LCD_WIDTH][LCD_HEIGHT];
#endif
static int xmargin = 0;
static int ymargin = 0;
static unsigned char xfont_variable[VARIABLE_XCHARS][(HW_PATTERN_SIZE+3)&~3];
/* round up pattern size to a multiple of 4 bytes for faster access */
static bool xfont_variable_locked[VARIABLE_XCHARS];
static struct pattern_info hw_pattern[MAX_HW_PATTERNS];
static struct cursor_info cursor;
/* scrolling */
static volatile int scrolling_lines=0; /* Bitpattern of which lines are scrolling */
static void scroll_thread(void);
static char scroll_stack[DEFAULT_STACK_SIZE];
static const char scroll_name[] = "scroll";
static int scroll_ticks = 12; /* # of ticks between updates */
static int scroll_delay = HZ/2; /* delay before starting scroll */
static int bidir_limit = 50; /* percent */
static int jump_scroll_delay = HZ/4; /* delay between jump scroll jumps */
static int jump_scroll = 0; /* 0=off, 1=once, ..., JUMP_SCROLL_ALWAYS */
static struct scrollinfo scroll[SCROLLABLE_LINES];
static const char scroll_tick_table[16] = {
/* Hz values:
1, 1.25, 1.55, 2, 2.5, 3.12, 4, 5, 6.25, 8.33, 10, 12.5, 16.7, 20, 25, 33 */
100, 80, 64, 50, 40, 32, 25, 20, 16, 12, 10, 8, 6, 5, 4, 3
};
/* LCD init */
void lcd_init (void)
{
lcd_init_device();
lcd_charset_init();
memset(hw_pattern, 0, sizeof(hw_pattern));
memset(lcd_buffer, xchar_info[find_xchar(' ')].hw_char, sizeof(lcd_buffer));
create_thread(scroll_thread, scroll_stack,
sizeof(scroll_stack), scroll_name
IF_PRIO(, PRIORITY_USER_INTERFACE)
IF_COP(, CPU, false));
}
/** parameter handling **/
void lcd_setmargins(int x, int y)
{
xmargin = x;
ymargin = y;
}
int lcd_getxmargin(void)
{
return xmargin;
}
int lcd_getymargin(void)
{
return ymargin;
}
int lcd_getstringsize(const unsigned char *str, int *w, int *h)
{
int width = utf8length(str);
if (w)
*w = width;
if (h)
*h = 1;
return width;
}
/** low-level functions **/
static int find_xchar(unsigned long ucs)
{
int low = 0;
int high = xchar_info_size - 1;
do
{
int probe = (low + high) >> 1;
if (xchar_info[probe].ucs < ucs)
low = probe + 1;
else if (xchar_info[probe].ucs > ucs)
high = probe - 1;
else
return probe;
}
while (low <= high);
/* Not found: return index of no-char symbol (last symbol, hardcoded). */
return xchar_info_size - 1;
}
static int xchar_to_pat(int xchar)
{
int i;
for (i = 0; i < hw_pattern_count; i++)
if (hw_pattern[i].xchar == xchar)
return i;
return NO_PATTERN;
}
static const unsigned char *xchar_to_glyph(int xchar)
{
unsigned index = xchar_info[xchar].glyph;
if (index & 0x8000)
return xfont_variable[index & 0x7fff];
else
return xfont_fixed[index];
}
static void lcd_free_pat(int xchar)
{
int x, y;
unsigned char substitute;
int pat = xchar_to_pat(xchar);
if (pat != NO_PATTERN)
{
substitute = xchar_info[xchar].hw_char;
for (x = 0; x < LCD_WIDTH; x++)
{
for (y = 0; y < LCD_HEIGHT; y++)
{
if (pat == lcd_buffer[x][y])
{
lcd_buffer[x][y] = substitute;
#ifdef SIMULATOR
hardware_buffer_lcd[x][y] = substitute;
#else
lcd_put_hw_char(x, y, substitute);
#endif
}
}
}
if (cursor.enabled && pat == cursor.hw_char)
cursor.hw_char = substitute;
hw_pattern[pat].count = 0;
#ifdef SIMULATOR
lcd_update();
#endif
}
}
static int lcd_get_free_pat(int xchar)
{
static int last_used_pat = 0;
int pat = last_used_pat; /* start from last used pattern */
int least_pat = pat; /* pattern with least priority */
int least_priority = xchar_info[hw_pattern[pat].xchar].priority;
int i;
for (i = 0; i < hw_pattern_count; i++)
{
if (++pat >= hw_pattern_count) /* Keep 'pat' within limits */
pat = 0;
if (hw_pattern[pat].count == 0)
{
hw_pattern[pat].xchar = xchar;
last_used_pat = pat;
return pat;
}
if (xchar_info[hw_pattern[pat].xchar].priority < least_priority)
{
least_priority = xchar_info[hw_pattern[pat].xchar].priority;
least_pat = pat;
}
}
if (xchar_info[xchar].priority > least_priority) /* prioritized char */
{
lcd_free_pat(hw_pattern[least_pat].xchar);
hw_pattern[least_pat].xchar = xchar;
last_used_pat = least_pat;
return least_pat;
}
return NO_PATTERN;
}
static int map_xchar(int xchar)
{
int pat;
if (xchar_info[xchar].priority > 0) /* soft char */
{
pat = xchar_to_pat(xchar);
if (pat == NO_PATTERN) /* not yet mapped */
{
pat = lcd_get_free_pat(xchar); /* try to map */
if (pat == NO_PATTERN) /* failed: just use substitute */
return xchar_info[xchar].hw_char;
else /* define pattern */
lcd_define_hw_pattern(pat, xchar_to_glyph(xchar));
}
hw_pattern[pat].count++; /* increase reference count */
return pat;
}
else /* hardware char */
return xchar_info[xchar].hw_char;
}
static void lcd_putxchar(int x, int y, int xchar)
{
int lcd_char = lcd_buffer[x][y];
if (lcd_char < hw_pattern_count) /* old char was soft */
hw_pattern[lcd_char].count--; /* decrease old reference count */
lcd_buffer[x][y] = lcd_char = map_xchar(xchar);
#ifdef SIMULATOR
hardware_buffer_lcd[x][y] = lcd_char;
lcd_update();
#else
lcd_put_hw_char(x, y, lcd_char);
#endif
}
/** user-definable pattern handling **/
unsigned long lcd_get_locked_pattern(void)
{
int i = 0;
for (i = 0; i < VARIABLE_XCHARS; i++)
{
if (!xfont_variable_locked[i])
{
xfont_variable_locked[i] = true;
return 0xe000 + i; /* hard-coded */
}
}
return 0;
}
void lcd_unlock_pattern(unsigned long ucs)
{
int xchar = find_xchar(ucs);
int index = xchar_info[xchar].glyph;
if (index & 0x8000) /* variable extended char */
{
lcd_free_pat(xchar);
xfont_variable_locked[index & 0x7fff] = false;
}
}
void lcd_define_pattern(unsigned long ucs, const char *pattern)
{
int xchar = find_xchar(ucs);
int index = xchar_info[xchar].glyph;
int pat;
if (index & 0x8000) /* variable extended char */
{
memcpy(xfont_variable[index & 0x7fff], pattern, HW_PATTERN_SIZE);
pat = xchar_to_pat(xchar);
if (pat != NO_PATTERN)
lcd_define_hw_pattern(pat, pattern);
}
}
/** output functions **/
/* Clear the whole display */
void lcd_clear_display(void)
{
int x, y;
int xchar = find_xchar(' ');
lcd_stop_scroll();
lcd_remove_cursor();
for (x = 0; x < LCD_WIDTH; x++)
for (y = 0; y < LCD_HEIGHT; y++)
lcd_putxchar(x, y, xchar);
}
/* Put an unicode character at the given position */
void lcd_putc(int x, int y, unsigned long ucs)
{
if ((unsigned)x >= LCD_WIDTH || (unsigned)y >= LCD_HEIGHT)
return;
lcd_putxchar(x, y, find_xchar(ucs));
}
/* Show cursor (alternating with existing character) at the given position */
void lcd_put_cursor(int x, int y, unsigned long cursor_ucs)
{
if ((unsigned)x >= LCD_WIDTH || (unsigned)y >= LCD_HEIGHT
|| cursor.enabled)
return;
cursor.enabled = true;
cursor.visible = false;
cursor.hw_char = map_xchar(find_xchar(cursor_ucs));
cursor.x = x;
cursor.y = y;
cursor.downcount = 0;
cursor.divider = 4;
}
/* Remove the cursor */
void lcd_remove_cursor(void)
{
if (cursor.enabled)
{
if (cursor.hw_char < hw_pattern_count) /* soft char, unmap */
hw_pattern[cursor.hw_char].count--;
cursor.enabled = false;
#ifdef SIMULATOR
hardware_buffer_lcd[cursor.x][cursor.y] = lcd_buffer[cursor.x][cursor.y];
#else
lcd_put_hw_char(cursor.x, cursor.y, lcd_buffer[cursor.x][cursor.y]);
#endif
}
}
/* Put a string at a given position, skipping first ofs chars */
static int lcd_putsxyofs(int x, int y, int ofs, const unsigned char *str)
{
unsigned short ucs;
const unsigned char *utf8 = str;
while (*utf8 && x < LCD_WIDTH)
{
utf8 = utf8decode(utf8, &ucs);
if (ofs > 0)
{
ofs--;
continue;
}
lcd_putc(x++, y, ucs);
}
return x;
}
/* Put a string at a given position */
void lcd_putsxy(int x, int y, const unsigned char *str)
{
lcd_putsxyofs(x, y, 0, str);
}
/*** Line oriented text output ***/
/* Put a string at a given char position */
void lcd_puts(int x, int y, const unsigned char *str)
{
lcd_puts_offset(x, y, str, 0);
}
/* Put a string at a given char position, skipping first offset chars */
void lcd_puts_offset(int x, int y, const unsigned char *str, int offset)
{
/* make sure scrolling is turned off on the line we are updating */
scrolling_lines &= ~(1 << y);
x += xmargin;
y += ymargin;
x = lcd_putsxyofs(x, y, offset, str);
while (x < LCD_WIDTH)
lcd_putc(x++, y, ' ');
}
/** scrolling **/
void lcd_stop_scroll(void)
{
scrolling_lines=0;
}
void lcd_scroll_speed(int speed)
{
scroll_ticks = scroll_tick_table[speed];
}
void lcd_scroll_delay(int ms)
{
scroll_delay = ms / (HZ / 10);
}
void lcd_bidir_scroll(int percent)
{
bidir_limit = percent;
}
void lcd_jump_scroll(int mode) /* 0=off, 1=once, ..., JUMP_SCROLL_ALWAYS */
{
jump_scroll = mode;
}
void lcd_jump_scroll_delay(int ms)
{
jump_scroll_delay = ms / (HZ / 10);
}
void lcd_puts_scroll(int x, int y, const unsigned char *string)
{
lcd_puts_scroll_offset(x, y, string, 0);
}
void lcd_puts_scroll_offset(int x, int y, const unsigned char *string,
int offset)
{
struct scrollinfo* s;
int len;
s = &scroll[y];
s->start_tick = current_tick + scroll_delay;
lcd_puts_offset(x, y, string, offset);
len = utf8length(string);
if (LCD_WIDTH - xmargin < len)
{
/* prepare scroll line */
char *end;
memset(s->line, 0, sizeof s->line);
strcpy(s->line, string);
/* get width */
s->len = utf8length(s->line);
/* scroll bidirectional or forward only depending on the string width */
if (bidir_limit)
{
s->bidir = s->len < (LCD_WIDTH - xmargin) * (100 + bidir_limit) / 100;
}
else
s->bidir = false;
if (!s->bidir) /* add spaces if scrolling in the round */
{
strcat(s->line, " ");
/* get new width incl. spaces */
s->len += SCROLL_SPACING;
}
end = strchr(s->line, '\0');
strncpy(end, string, LCD_WIDTH);
s->offset = offset;
s->startx = xmargin + x;
s->backward = false;
scrolling_lines |= (1<<y);
}
else
/* force a bit switch-off since it doesn't scroll */
scrolling_lines &= ~(1<<y);
}
static void scroll_thread(void)
{
struct scrollinfo* s;
int index;
int xpos, ypos;
/* initialize scroll struct array */
scrolling_lines = 0;
while (1)
{
for (index = 0; index < SCROLLABLE_LINES; index++)
{
/* really scroll? */
if (!(scrolling_lines&(1<<index)))
continue;
s = &scroll[index];
/* check pause */
if (TIME_BEFORE(current_tick, s->start_tick))
continue;
if (s->backward)
s->offset--;
else
s->offset++;
xpos = s->startx;
ypos = ymargin + index;
if (s->bidir) /* scroll bidirectional */
{
if (s->offset <= 0)
{
/* at beginning of line */
s->offset = 0;
s->backward = false;
s->start_tick = current_tick + scroll_delay * 2;
}
if (s->offset >= s->len - (LCD_WIDTH - xpos))
{
/* at end of line */
s->offset = s->len - (LCD_WIDTH - xpos);
s->backward = true;
s->start_tick = current_tick + scroll_delay * 2;
}
}
else /* scroll forward the whole time */
{
if (s->offset >= s->len)
s->offset -= s->len;
}
lcd_putsxyofs(xpos, ypos, s->offset, s->line);
}
if (cursor.enabled)
{
if (--cursor.downcount < 0)
{
int lcd_char;
cursor.downcount = cursor.divider;
cursor.visible = !cursor.visible;
lcd_char = cursor.visible ? cursor.hw_char
: lcd_buffer[cursor.x][cursor.y];
#ifdef SIMULATOR
hardware_buffer_lcd[cursor.x][cursor.y] = lcd_char;
#else
lcd_put_hw_char(cursor.x, cursor.y, lcd_char);
#endif
}
}
#ifdef SIMULATOR
lcd_update();
#endif
sleep(scroll_ticks);
}
}

View file

@ -0,0 +1,594 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2007 by Jens Arnold
*
* All files in this archive are subject to the GNU General Public License.
* See the file COPYING in the source tree root for full license agreement.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include "config.h"
#include "hwcompat.h"
#include "lcd-charcell.h"
int hw_pattern_count; /* actual number of user-definable hw patterns */
const struct xchar_info *xchar_info;
int xchar_info_size; /* number of entries */
static const struct xchar_info xchar_info_newlcd[] = {
/* Standard ascii */
{ 0x20, 0, 0, 0x20 }, /* */
{ 0x21, 0, 0, 0x21 }, /* ! */
{ 0x22, 0, 0, 0x22 }, /* " */
{ 0x23, 0, 0, 0x23 }, /* # */
{ 0x24, 0, 0, 0x24 }, /* $ */
{ 0x25, 0, 0, 0x25 }, /* % */
{ 0x26, 0, 0, 0x26 }, /* & */
{ 0x27, 0, 0, 0x27 }, /* ' */
{ 0x28, 0, 0, 0x28 }, /* ( */
{ 0x29, 0, 0, 0x29 }, /* ) */
{ 0x2a, 0, 0, 0x2a }, /* * */
{ 0x2b, 0, 0, 0x2b }, /* + */
{ 0x2c, 0, 0, 0x2c }, /* , */
{ 0x2d, 0, 0, 0x2d }, /* - */
{ 0x2e, 0, 0, 0x2e }, /* . */
{ 0x2f, 0, 0, 0x2f }, /* / */
{ 0x30, 0, 0, 0x30 }, /* 0 */
{ 0x31, 0, 0, 0x31 }, /* 1 */
{ 0x32, 0, 0, 0x32 }, /* 2 */
{ 0x33, 0, 0, 0x33 }, /* 3 */
{ 0x34, 0, 0, 0x34 }, /* 4 */
{ 0x35, 0, 0, 0x35 }, /* 5 */
{ 0x36, 0, 0, 0x36 }, /* 6 */
{ 0x37, 0, 0, 0x37 }, /* 7 */
{ 0x38, 0, 0, 0x38 }, /* 8 */
{ 0x39, 0, 0, 0x39 }, /* 9 */
{ 0x3a, 0, 0, 0x3a }, /* : */
{ 0x3b, 0, 0, 0x3b }, /* ; */
{ 0x3c, 0, 0, 0x3c }, /* < */
{ 0x3d, 0, 0, 0x3d }, /* = */
{ 0x3e, 0, 0, 0x3e }, /* > */
{ 0x3f, 0, 0, 0x3f }, /* ? */
{ 0x40, 0, 0, 0x40 }, /* @ */
{ 0x41, 0, 0, 0x41 }, /* A */
{ 0x42, 0, 0, 0x42 }, /* B */
{ 0x43, 0, 0, 0x43 }, /* C */
{ 0x44, 0, 0, 0x44 }, /* D */
{ 0x45, 0, 0, 0x45 }, /* E */
{ 0x46, 0, 0, 0x46 }, /* F */
{ 0x47, 0, 0, 0x47 }, /* G */
{ 0x48, 0, 0, 0x48 }, /* H */
{ 0x49, 0, 0, 0x49 }, /* I */
{ 0x4a, 0, 0, 0x4a }, /* J */
{ 0x4b, 0, 0, 0x4b }, /* K */
{ 0x4c, 0, 0, 0x4c }, /* L */
{ 0x4d, 0, 0, 0x4d }, /* M */
{ 0x4e, 0, 0, 0x4e }, /* N */
{ 0x4f, 0, 0, 0x4f }, /* O */
{ 0x50, 0, 0, 0x50 }, /* P */
{ 0x51, 0, 0, 0x51 }, /* Q */
{ 0x52, 0, 0, 0x52 }, /* R */
{ 0x53, 0, 0, 0x53 }, /* S */
{ 0x54, 0, 0, 0x54 }, /* T */
{ 0x55, 0, 0, 0x55 }, /* U */
{ 0x56, 0, 0, 0x56 }, /* V */
{ 0x57, 0, 0, 0x57 }, /* W */
{ 0x58, 0, 0, 0x58 }, /* X */
{ 0x59, 0, 0, 0x59 }, /* Y */
{ 0x5a, 0, 0, 0x5a }, /* Z */
{ 0x5b, 0, 0, 0x5b }, /* [ */
{ 0x5c, 0, 0, 0x12 }, /* \ */
{ 0x5d, 0, 0, 0x5d }, /* ] */
{ 0x5e, 0, 0, 0x5e }, /* ^ */
{ 0x5f, 0, 0, 0x5f }, /* _ */
{ 0x60, 0, 0, 0x60 }, /* ` */
{ 0x61, 0, 0, 0x61 }, /* a */
{ 0x62, 0, 0, 0x62 }, /* b */
{ 0x63, 0, 0, 0x63 }, /* c */
{ 0x64, 0, 0, 0x64 }, /* d */
{ 0x65, 0, 0, 0x65 }, /* e */
{ 0x66, 0, 0, 0x66 }, /* f */
{ 0x67, 0, 0, 0x67 }, /* g */
{ 0x68, 0, 0, 0x68 }, /* h */
{ 0x69, 0, 0, 0x69 }, /* i */
{ 0x6a, 0, 0, 0x6a }, /* j */
{ 0x6b, 0, 0, 0x6b }, /* k */
{ 0x6c, 0, 0, 0x6c }, /* l */
{ 0x6d, 0, 0, 0x6d }, /* m */
{ 0x6e, 0, 0, 0x6e }, /* n */
{ 0x6f, 0, 0, 0x6f }, /* o */
{ 0x70, 0, 0, 0x70 }, /* p */
{ 0x71, 0, 0, 0x71 }, /* q */
{ 0x72, 0, 0, 0x72 }, /* r */
{ 0x73, 0, 0, 0x73 }, /* s */
{ 0x74, 0, 0, 0x74 }, /* t */
{ 0x75, 0, 0, 0x75 }, /* u */
{ 0x76, 0, 0, 0x76 }, /* v */
{ 0x77, 0, 0, 0x77 }, /* w */
{ 0x78, 0, 0, 0x78 }, /* x */
{ 0x79, 0, 0, 0x79 }, /* y */
{ 0x7a, 0, 0, 0x7a }, /* z */
{ 0x7b, 0, 0, 0x7b }, /* { */
{ 0x7c, 0, 0, 0x7c }, /* | */
{ 0x7d, 0, 0, 0x7d }, /* } */
{ 0x7e, 0, 0, 0xf0 }, /* ~ */
{ 0x7f, 0, 0, 0xfe }, /* (full grid) */
#ifndef BOOTLOADER /* bootloader only supports pure ASCII */
/* Latin 1 */
{ 0xa0, 0, 0, 0x20 }, /* (non-breaking space) */
{ 0xa3, 0x000f, 1, 0x4c }, /* £ (pound sign) */
{ 0xa5, 0, 0, 0x5c }, /* ¥ (yen sign) */
{ 0xa7, 0, 0, 0x15 }, /* § (paragraph sign) */
{ 0xab, 0, 0, 0x9e }, /* « (left double-angle quotation mark) */
{ 0xaf, 0x0010, 1, 0x2d }, /* ¯ (macron) */
{ 0xb1, 0, 0, 0x95 }, /* ± (plus-minus sign) */
{ 0xb2, 0, 0, 0x99 }, /* ³ (superscript 2) */
{ 0xb3, 0, 0, 0x9a }, /* ³ (superscript 3) */
{ 0xb5, 0, 0, 0xe6 }, /* µ (micro sign) */
{ 0xb6, 0, 0, 0x14 }, /* ¶ (pilcrow sign) */
{ 0xb7, 0, 0, 0xa5 }, /* · (middle dot) */
{ 0xbb, 0, 0, 0x9f }, /* » (right double-angle quotation mark) */
{ 0xbc, 0, 0, 0x9c }, /* ¼ (one quarter) */
{ 0xbd, 0, 0, 0x9b }, /* ½ (one half) */
{ 0xbe, 0, 0, 0x9d }, /* ¾ (three quarters) */
{ 0xbf, 0x0011, 1, 0x3f }, /* ¿ (inverted ?) */
{ 0xc0, 0x0012, 1, 0x41 }, /* À (A grave) */
{ 0xc1, 0x0013, 1, 0x41 }, /* Á (A acute) */
{ 0xc2, 0x0014, 1, 0x41 }, /* Â (A circumflex) */
{ 0xc3, 0x0015, 1, 0x41 }, /* Ã (A tilde) */
{ 0xc4, 0x0016, 1, 0x41 }, /* Ä (A dieresis) */
{ 0xc5, 0x0017, 1, 0x41 }, /* Å (A with ring above) */
{ 0xc6, 0x0018, 1, 0x41 }, /* Æ (AE ligature) */
{ 0xc7, 0x0019, 1, 0x43 }, /* Ç (C cedilla) */
{ 0xc8, 0x001a, 1, 0x45 }, /* È (E grave) */
{ 0xc9, 0x001b, 1, 0x45 }, /* É (E acute) */
{ 0xca, 0x001c, 1, 0x45 }, /* Ê (E circumflex) */
{ 0xcb, 0x001d, 1, 0x45 }, /* Ë (E dieresis) */
{ 0xcc, 0x001e, 1, 0x49 }, /* Ì (I grave) */
{ 0xcd, 0x001f, 1, 0x49 }, /* Í (I acute) */
{ 0xce, 0, 0, 0x49 }, /* Î (I circumflex) */
{ 0xcf, 0, 0, 0x49 }, /* Ï (I dieresis) */
{ 0xd0, 0x0020, 1, 0x44 }, /* Ð (ETH) */
{ 0xd1, 0x0021, 1, 0x4e }, /* Ñ (N tilde) */
{ 0xd2, 0x0022, 1, 0x4f }, /* Ò (O grave) */
{ 0xd3, 0x0023, 1, 0x4f }, /* Ó (O acute) */
{ 0xd4, 0x0024, 1, 0x4f }, /* Ô (O circumflex) */
{ 0xd5, 0x0025, 1, 0x4f }, /* Õ (O tilde) */
{ 0xd6, 0x0026, 1, 0x4f }, /* Ö (O dieresis) */
{ 0xd7, 0, 0, 0x96 }, /* × (multiplication sign) */
{ 0xd8, 0x0027, 1, 0x4f }, /* Ø (O stroke) */
{ 0xd9, 0x0028, 1, 0x55 }, /* Ù (U grave) */
{ 0xda, 0x0029, 1, 0x55 }, /* Ú (U acute) */
{ 0xdb, 0, 0, 0x55 }, /* Û (U circumflex) */
{ 0xdc, 0x002a, 1, 0x55 }, /* Ü (U dieresis) */
{ 0xdd, 0, 0, 0x59 }, /* Ý (Y acute) */
{ 0xdf, 0, 0, 0xe1 }, /* ß (sharp s) */
{ 0xe0, 0x002b, 1, 0x61 }, /* à (a grave) */
{ 0xe1, 0x002c, 1, 0x61 }, /* á (a acute) */
{ 0xe2, 0x002d, 1, 0x61 }, /* â (a circumflex) */
{ 0xe3, 0x002e, 1, 0x61 }, /* ã (a tilde) */
{ 0xe4, 0x002f, 1, 0x61 }, /* ä (a dieresis) */
{ 0xe5, 0x0030, 1, 0x61 }, /* å (a with ring above) */
{ 0xe7, 0x0031, 1, 0x63 }, /* ç (c cedilla) */
{ 0xe8, 0x0032, 1, 0x65 }, /* è (e grave) */
{ 0xe9, 0x0033, 1, 0x65 }, /* é (e acute) */
{ 0xea, 0x0034, 1, 0x65 }, /* ê (e circumflex) */
{ 0xeb, 0x0035, 1, 0x65 }, /* ë (e dieresis) */
{ 0xec, 0, 0, 0x69 }, /* ì (i grave) */
{ 0xed, 0x0036, 1, 0x69 }, /* í (i acute) */
{ 0xee, 0x0037, 1, 0x69 }, /* î (i circumflex) */
{ 0xef, 0x0038, 1, 0x69 }, /* ï (i dieresis) */
{ 0xf1, 0x0039, 1, 0x6e }, /* ñ (n tilde) */
{ 0xf2, 0x003a, 1, 0x6f }, /* ò (o grave) */
{ 0xf3, 0x003b, 1, 0x6f }, /* ó (o acute) */
{ 0xf4, 0x003c, 1, 0x6f }, /* ô (o circumflex) */
{ 0xf5, 0x003d, 1, 0x6f }, /* õ (o tilde) */
{ 0xf6, 0x003e, 1, 0x6f }, /* ö (o dieresis) */
{ 0xf7, 0, 0, 0x97 }, /* ÷ (division sign) */
{ 0xf8, 0x003f, 1, 0x6f }, /* ø (o slash) */
{ 0xf9, 0x0040, 1, 0x75 }, /* ù (u grave) */
{ 0xfa, 0x0041, 1, 0x75 }, /* ú (u acute) */
{ 0xfb, 0, 0, 0x75 }, /* û (u circumflex) */
{ 0xfc, 0x0042, 1, 0x75 }, /* ü (u dieresis) */
{ 0xfd, 0x0043, 1, 0x79 }, /* ý (y acute) */
{ 0xff, 0, 0, 0x79 }, /* ÿ (y dieresis) */
/* Runtime-definable characters */
{ 0xe000, 0x8000, 15, 0x20 }, /* variable character 0 */
{ 0xe001, 0x8001, 15, 0x20 }, /* variable character 1 */
{ 0xe002, 0x8002, 15, 0x20 }, /* variable character 2 */
{ 0xe003, 0x8003, 15, 0x20 }, /* variable character 3 */
{ 0xe004, 0x8004, 15, 0x20 }, /* variable character 4 */
{ 0xe005, 0x8005, 15, 0x20 }, /* variable character 5 */
{ 0xe006, 0x8006, 15, 0x20 }, /* variable character 6 */
{ 0xe007, 0x8007, 15, 0x20 }, /* variable character 7 */
{ 0xe008, 0x8008, 15, 0x20 }, /* variable character 8 */
{ 0xe009, 0x8009, 15, 0x20 }, /* variable character 9 */
{ 0xe00a, 0x800a, 15, 0x20 }, /* variable character 10 */
{ 0xe00b, 0x800b, 15, 0x20 }, /* variable character 11 */
{ 0xe00c, 0x800c, 15, 0x20 }, /* variable character 12 */
{ 0xe00d, 0x800d, 15, 0x20 }, /* variable character 13 */
{ 0xe00e, 0x800e, 15, 0x20 }, /* variable character 14 */
{ 0xe00f, 0x800f, 15, 0x20 }, /* variable character 15 */
/* Icons and special symbols */
{ 0xe100, 0x0004, 14, 0x3f }, /* unknown icon (mirrored ?) */
{ 0xe101, 0x0005, 14, 0x94 }, /* bookmark icon */
{ 0xe102, 0x0006, 14, 0x29 }, /* plugin icon */
{ 0xe103, 0x0007, 14, 0x91 }, /* folder icon */
{ 0xe104, 0x0008, 14, 0x78 }, /* firmware icon */
{ 0xe105, 0x0009, 14, 0x2b }, /* language icon */
{ 0xe106, 0x000a, 14, 0x13 }, /* audio icon (note) */
{ 0xe107, 0x000b, 14, 0x94 }, /* wps icon */
{ 0xe108, 0x000c, 14, 0xd0 }, /* playlist icon */
{ 0xe109, 0x000d, 14, 0xd0 }, /* text file icon */
{ 0xe10a, 0x000e, 14, 0xd0 }, /* config icon */
{ 0xe10b, 0, 0, 0x7f }, /* left arrow */
{ 0xe10c, 0, 0, 0x7e }, /* right arrow */
{ 0xe10d, 0, 0, 0x18 }, /* up arrow */
{ 0xe10e, 0, 0, 0x19 }, /* down arrow */
{ 0xe10f, 0, 0, 0x11 }, /* filled left arrow */
{ 0xe110, 0, 0, 0x10 }, /* filled right arrow */
{ 0xe111, 0, 0, 0x1f }, /* filled up arrow */
{ 0xe112, 0, 0, 0x1e }, /* filled down arrow */
{ 0xe113, 0, 0, 0x20 }, /* level 0/7 */
{ 0xe114, 0, 0, 0x80 }, /* level 1/7 */
{ 0xe115, 0, 0, 0x81 }, /* level 2/7 */
{ 0xe116, 0, 0, 0x82 }, /* level 3/7 */
{ 0xe117, 0, 0, 0x83 }, /* level 4/7 */
{ 0xe118, 0, 0, 0x84 }, /* level 5/7 */
{ 0xe119, 0, 0, 0x85 }, /* level 6/7 */
{ 0xe11a, 0, 0, 0x86 }, /* level 7/7 */
#endif /* !BOOTLOADER */
/* no-char symbol */
{ 0xfffd, 0, 0, 0x91 },
};
static const struct xchar_info xchar_info_oldlcd[] = {
/* Standard ascii */
{ 0x20, 0, 0, 0x24 }, /* */
{ 0x21, 0, 0, 0x25 }, /* ! */
{ 0x22, 0, 0, 0x26 }, /* " */
{ 0x23, 0, 0, 0x27 }, /* # */
{ 0x24, 0, 0, 0x28 }, /* $ */
{ 0x25, 0, 0, 0x29 }, /* % */
{ 0x26, 0, 0, 0x2a }, /* & */
{ 0x27, 0, 0, 0x2b }, /* ' */
{ 0x28, 0, 0, 0x2c }, /* ( */
{ 0x29, 0, 0, 0x2d }, /* ) */
{ 0x2a, 0, 0, 0x2e }, /* * */
{ 0x2b, 0, 0, 0x2f }, /* + */
{ 0x2c, 0, 0, 0x30 }, /* , */
{ 0x2d, 0, 0, 0x31 }, /* - */
{ 0x2e, 0, 0, 0x32 }, /* . */
{ 0x2f, 0, 0, 0x33 }, /* / */
{ 0x30, 0, 0, 0x34 }, /* 0 */
{ 0x31, 0, 0, 0x35 }, /* 1 */
{ 0x32, 0, 0, 0x36 }, /* 2 */
{ 0x33, 0, 0, 0x37 }, /* 3 */
{ 0x34, 0, 0, 0x38 }, /* 4 */
{ 0x35, 0, 0, 0x39 }, /* 5 */
{ 0x36, 0, 0, 0x3a }, /* 6 */
{ 0x37, 0, 0, 0x3b }, /* 7 */
{ 0x38, 0, 0, 0x3c }, /* 8 */
{ 0x39, 0, 0, 0x3d }, /* 9 */
{ 0x3a, 0, 0, 0x3e }, /* : */
{ 0x3b, 0, 0, 0x3f }, /* ; */
{ 0x3c, 0, 0, 0x40 }, /* < */
{ 0x3d, 0, 0, 0x41 }, /* = */
{ 0x3e, 0, 0, 0x42 }, /* > */
{ 0x3f, 0, 0, 0x43 }, /* ? */
{ 0x40, 0, 0, 0x04 }, /* @ */
{ 0x41, 0, 0, 0x45 }, /* A */
{ 0x42, 0, 0, 0x46 }, /* B */
{ 0x43, 0, 0, 0x47 }, /* C */
{ 0x44, 0, 0, 0x48 }, /* D */
{ 0x45, 0, 0, 0x49 }, /* E */
{ 0x46, 0, 0, 0x4a }, /* F */
{ 0x47, 0, 0, 0x4b }, /* G */
{ 0x48, 0, 0, 0x4c }, /* H */
{ 0x49, 0, 0, 0x4d }, /* I */
{ 0x4a, 0, 0, 0x4e }, /* J */
{ 0x4b, 0, 0, 0x4f }, /* K */
{ 0x4c, 0, 0, 0x50 }, /* L */
{ 0x4d, 0, 0, 0x51 }, /* M */
{ 0x4e, 0, 0, 0x52 }, /* N */
{ 0x4f, 0, 0, 0x53 }, /* O */
{ 0x50, 0, 0, 0x54 }, /* P */
{ 0x51, 0, 0, 0x55 }, /* Q */
{ 0x52, 0, 0, 0x56 }, /* R */
{ 0x53, 0, 0, 0x57 }, /* S */
{ 0x54, 0, 0, 0x58 }, /* T */
{ 0x55, 0, 0, 0x59 }, /* U */
{ 0x56, 0, 0, 0x5a }, /* V */
{ 0x57, 0, 0, 0x5b }, /* W */
{ 0x58, 0, 0, 0x5c }, /* X */
{ 0x59, 0, 0, 0x5d }, /* Y */
{ 0x5a, 0, 0, 0x5e }, /* Z */
{ 0x5b, 0, 0, 0xa9 }, /* [ */
{ 0x5c, 0x0000, 2, 0x33 }, /* \ */
{ 0x5d, 0, 0, 0xce }, /* ] */
{ 0x5f, 0, 0, 0x15 }, /* _ */
{ 0x60, 0x0001, 2, 0x2b }, /* ` */
{ 0x61, 0, 0, 0x65 }, /* a */
{ 0x62, 0, 0, 0x66 }, /* b */
{ 0x63, 0, 0, 0x67 }, /* c */
{ 0x64, 0, 0, 0x68 }, /* d */
{ 0x65, 0, 0, 0x69 }, /* e */
{ 0x66, 0, 0, 0x6a }, /* f */
{ 0x67, 0, 0, 0x6b }, /* g */
{ 0x68, 0, 0, 0x6c }, /* h */
{ 0x69, 0, 0, 0x6d }, /* i */
{ 0x6a, 0, 0, 0x6e }, /* j */
{ 0x6b, 0, 0, 0x6f }, /* k */
{ 0x6c, 0, 0, 0x70 }, /* l */
{ 0x6d, 0, 0, 0x71 }, /* m */
{ 0x6e, 0, 0, 0x72 }, /* n */
{ 0x6f, 0, 0, 0x73 }, /* o */
{ 0x70, 0, 0, 0x74 }, /* p */
{ 0x71, 0, 0, 0x75 }, /* q */
{ 0x72, 0, 0, 0x76 }, /* r */
{ 0x73, 0, 0, 0x77 }, /* s */
{ 0x74, 0, 0, 0x78 }, /* t */
{ 0x75, 0, 0, 0x79 }, /* u */
{ 0x76, 0, 0, 0x7a }, /* v */
{ 0x77, 0, 0, 0x7b }, /* w */
{ 0x78, 0, 0, 0x7c }, /* x */
{ 0x79, 0, 0, 0x7d }, /* y */
{ 0x7a, 0, 0, 0x7e }, /* z */
{ 0x7b, 0, 0, 0x2c }, /* { (hard-coded ( ) */
{ 0x7c, 0x0002, 2, 0x25 }, /* | */
{ 0x7d, 0, 0, 0x2d }, /* } (hard-coded ) ) */
{ 0x7e, 0x0003, 2, 0x31 }, /* ~ */
{ 0x7f, 0, 0, 0x8b }, /* (full grid) */
#ifndef BOOTLOADER /* bootloader only supports pure ASCII */
/* Latin 1 */
{ 0xa0, 0, 0, 0x24 }, /* (non-breaking space) */
{ 0xa1, 0, 0, 0x44 }, /* ¡ (inverted !) */
{ 0xa2, 0, 0, 0xa8 }, /* ¢ (cent sign) */
{ 0xa3, 0, 0, 0x05 }, /* £ (pound sign) */
{ 0xa4, 0, 0, 0x28 }, /* ¤ (currency sign) */
{ 0xa5, 0, 0, 0x07 }, /* ¥ (yen sign) */
{ 0xa7, 0, 0, 0x63 }, /* § (paragraph sign) */
{ 0xaf, 0, 0, 0xee }, /* ¯ (macron) */
{ 0xbf, 0, 0, 0x64 }, /* ¿ (inverted ?) */
{ 0xc0, 0, 0, 0x8c }, /* À (A grave) */
{ 0xc1, 0, 0, 0x8d }, /* Á (A acute) */
{ 0xc2, 0, 0, 0x8e }, /* Â (A circumflex) */
{ 0xc3, 0, 0, 0x8f }, /* Ã (A tilde) */
{ 0xc4, 0, 0, 0x5f }, /* Ä (A dieresis) */
{ 0xc5, 0, 0, 0x12 }, /* Å (A with ring above) */
{ 0xc6, 0, 0, 0x20 }, /* Æ (AE ligature) */
{ 0xc7, 0, 0, 0x0d }, /* Ç (C cedilla) */
{ 0xc8, 0, 0, 0x90 }, /* È (E grave) */
{ 0xc9, 0, 0, 0x23 }, /* É (E acute) */
{ 0xca, 0, 0, 0x91 }, /* Ê (E circumflex) */
{ 0xcb, 0, 0, 0x92 }, /* Ë (E dieresis) */
{ 0xcc, 0, 0, 0x93 }, /* Ì (I grave) */
{ 0xcd, 0, 0, 0x94 }, /* Í (I acute) */
{ 0xce, 0, 0, 0x4d }, /* Î (I circumflex) */
{ 0xcf, 0, 0, 0x4d }, /* Ï (I dieresis) */
{ 0xd0, 0, 0, 0x95 }, /* Ð (ETH) */
{ 0xd1, 0, 0, 0x61 }, /* Ñ (N tilde) */
{ 0xd2, 0, 0, 0x96 }, /* Ò (O grave) */
{ 0xd3, 0, 0, 0x97 }, /* Ó (O acute) */
{ 0xd4, 0, 0, 0x98 }, /* Ô (O circumflex) */
{ 0xd5, 0, 0, 0x99 }, /* Õ (O tilde) */
{ 0xd6, 0, 0, 0x60 }, /* Ö (O dieresis) */
{ 0xd7, 0, 0, 0xde }, /* × (multiplication sign) */
{ 0xd8, 0, 0, 0x0f }, /* Ø (O stroke) */
{ 0xd9, 0, 0, 0x9a }, /* Ù (U grave) */
{ 0xda, 0, 0, 0x9b }, /* Ú (U acute) */
{ 0xdb, 0, 0, 0x59 }, /* Û (U circumflex) */
{ 0xdc, 0, 0, 0x62 }, /* Ü (U dieresis) */
{ 0xdd, 0, 0, 0x5d }, /* Ý (Y acute) */
{ 0xdf, 0, 0, 0x22 }, /* ß (sharp s) */
{ 0xe0, 0, 0, 0x83 }, /* à (a grave) */
{ 0xe1, 0, 0, 0x9c }, /* á (a acute) */
{ 0xe2, 0, 0, 0x9d }, /* â (a circumflex) */
{ 0xe3, 0, 0, 0x9e }, /* ã (a tilde) */
{ 0xe4, 0, 0, 0x7f }, /* ä (a dieresis) */
{ 0xe5, 0, 0, 0x13 }, /* å (a with ring above) */
{ 0xe7, 0, 0, 0x84 }, /* ç (c cedilla) */
{ 0xe8, 0, 0, 0x08 }, /* è (e grave) */
{ 0xe9, 0, 0, 0x09 }, /* é (e acute) */
{ 0xea, 0, 0, 0x9f }, /* ê (e circumflex) */
{ 0xeb, 0, 0, 0xa0 }, /* ë (e dieresis) */
{ 0xec, 0, 0, 0x6d }, /* ì (i grave) */
{ 0xed, 0, 0, 0xa1 }, /* í (i acute) */
{ 0xee, 0, 0, 0xa2 }, /* î (i circumflex) */
{ 0xef, 0, 0, 0xa3 }, /* ï (i dieresis) */
{ 0xf1, 0, 0, 0x81 }, /* ñ (n tilde) */
{ 0xf2, 0, 0, 0x0c }, /* ò (o grave) */
{ 0xf3, 0, 0, 0xa4 }, /* ó (o acute) */
{ 0xf4, 0, 0, 0xa5 }, /* ô (o circumflex) */
{ 0xf5, 0, 0, 0xa6 }, /* õ (o tilde) */
{ 0xf6, 0, 0, 0x80 }, /* ö (o dieresis) */
{ 0xf8, 0, 0, 0x10 }, /* ø (o slash) */
{ 0xf9, 0, 0, 0x0a }, /* ù (u grave) */
{ 0xfa, 0, 0, 0xa7 }, /* ú (u acute) */
{ 0xfb, 0, 0, 0x79 }, /* û (u circumflex) */
{ 0xfc, 0, 0, 0xa2 }, /* ü (u dieresis) */
{ 0xfd, 0, 0, 0xaf }, /* ý (y acute) */
{ 0xff, 0, 0, 0x7d }, /* ÿ (y dieresis) */
/* Runtime-definable characters */
{ 0xe000, 0x8000, 15, 0x24 }, /* variable character 0 */
{ 0xe001, 0x8001, 15, 0x24 }, /* variable character 1 */
{ 0xe002, 0x8002, 15, 0x24 }, /* variable character 2 */
{ 0xe003, 0x8003, 15, 0x24 }, /* variable character 3 */
{ 0xe004, 0x8004, 15, 0x24 }, /* variable character 4 */
{ 0xe005, 0x8005, 15, 0x24 }, /* variable character 5 */
{ 0xe006, 0x8006, 15, 0x24 }, /* variable character 6 */
{ 0xe007, 0x8007, 15, 0x24 }, /* variable character 7 */
{ 0xe008, 0x8008, 15, 0x24 }, /* variable character 8 */
{ 0xe009, 0x8009, 15, 0x24 }, /* variable character 9 */
{ 0xe00a, 0x800a, 15, 0x24 }, /* variable character 10 */
{ 0xe00b, 0x800b, 15, 0x24 }, /* variable character 11 */
{ 0xe00c, 0x800c, 15, 0x24 }, /* variable character 12 */
{ 0xe00d, 0x800d, 15, 0x24 }, /* variable character 13 */
{ 0xe00e, 0x800e, 15, 0x24 }, /* variable character 14 */
{ 0xe00f, 0x800f, 15, 0x24 }, /* variable character 15 */
/* Icons and special symbols */
{ 0xe100, 0x0004, 14, 0x43 }, /* unknown icon (mirrored ?) */
{ 0xe101, 0x0005, 14, 0xd4 }, /* bookmark icon */
{ 0xe102, 0x0006, 14, 0x2d }, /* plugin icon */
{ 0xe103, 0x0007, 14, 0x34 }, /* folder icon */
{ 0xe104, 0x0008, 14, 0x7c }, /* firmware icon */
{ 0xe105, 0x0009, 14, 0x2f }, /* language icon */
{ 0xe106, 0, 0, 0xfc }, /* audio icon (note) */
{ 0xe107, 0x000b, 14, 0xd4 }, /* wps icon */
{ 0xe108, 0x000c, 14, 0xfa }, /* playlist icon */
{ 0xe109, 0x000f, 14, 0xfa }, /* text file icon */
{ 0xe10a, 0x000e, 14, 0xfa }, /* config icon */
{ 0xe10b, 0, 0, 0x88 }, /* left arrow */
{ 0xe10c, 0, 0, 0x89 }, /* right arrow */
{ 0xe10d, 0, 0, 0x86 }, /* up arrow */
{ 0xe10e, 0, 0, 0x87 }, /* down arrow */
{ 0xe10f, 0, 0, 0x88 }, /* filled left arrow */
{ 0xe110, 0, 0, 0x89 }, /* filled right arrow */
{ 0xe111, 0, 0, 0x86 }, /* filled up arrow */
{ 0xe112, 0, 0, 0x87 }, /* filled down arrow */
{ 0xe113, 0, 0, 0x24 }, /* level 0/7 */
{ 0xe114, 0, 0, 0x15 }, /* level 1/7 */
{ 0xe115, 0, 0, 0xdf }, /* level 2/7 */
{ 0xe116, 0, 0, 0xe0 }, /* level 3/7 */
{ 0xe117, 0, 0, 0xe1 }, /* level 4/7 */
{ 0xe118, 0, 0, 0xe2 }, /* level 5/7 */
{ 0xe119, 0, 0, 0xe3 }, /* level 6/7 */
{ 0xe11a, 0, 0, 0xec }, /* level 7/7 */
#endif /* !BOOTLOADER */
/* no-char symbol */
{ 0xfffd, 0, 0, 0xd8 },
};
const unsigned char xfont_fixed[][8] = {
/* Standard ascii */
{ 0x00, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x00}, /* 0x000 \ */
{ 0x08, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 0x001 ` */
{ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00}, /* 0x002 | */
{ 0x00, 0x00, 0x08, 0x15, 0x02, 0x00, 0x00, 0x00}, /* 0x003 ~ */
#ifndef BOOTLOADER /* bootloader only supports pure ASCII */
/* Icons and special symbols */
{ 0x0c, 0x12, 0x12, 0x08, 0x08, 0x00, 0x08, 0x00}, /* 0x004 unknown icon */
{ 0x00, 0x03, 0x07, 0x0e, 0x1c, 0x08, 0x00, 0x00}, /* 0x005 bookmark icon */
{ 0x04, 0x1e, 0x07, 0x1f, 0x05, 0x01, 0x06, 0x00}, /* 0x006 plugin icon */
{ 0x0c, 0x13, 0x11, 0x11, 0x11, 0x11, 0x1f, 0x00}, /* 0x007 folder icon */
{ 0x1f, 0x11, 0x1b, 0x15, 0x1b, 0x11, 0x1f, 0x00}, /* 0x008 firmware icon */
{ 0x00, 0x1f, 0x15, 0x1f, 0x15, 0x1f, 0x00, 0x00}, /* 0x009 language icon */
{ 0x03, 0x05, 0x09, 0x09, 0x0b, 0x1b, 0x18, 0x00}, /* 0x00a audio icon (note) */
{ 0x01, 0x01, 0x02, 0x02, 0x14, 0x0c, 0x04, 0x00}, /* 0x00b wps icon */
{ 0x17, 0x00, 0x17, 0x00, 0x17, 0x00, 0x17, 0x00}, /* 0x00c playlist icon */
{ 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00}, /* 0x00d text file icon */
{ 0x0b, 0x10, 0x0b, 0x00, 0x1f, 0x00, 0x1f, 0x00}, /* 0x00e config icon */
/* Latin 1 */
{ 0x06, 0x09, 0x08, 0x1e, 0x08, 0x08, 0x1f, 0x00}, /* 0x00f £ (pound sign) */
{ 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 0x010 ¯ (macron) */
{ 0x04, 0x00, 0x04, 0x08, 0x10, 0x11, 0x0e, 0x00}, /* 0x011 ¿ (inverted ?) */
{ 0x08, 0x04, 0x0e, 0x11, 0x1f, 0x11, 0x11, 0x00}, /* 0x012 À (A grave) */
{ 0x02, 0x04, 0x0e, 0x11, 0x1f, 0x11, 0x11, 0x00}, /* 0x013 Á (A acute) */
{ 0x04, 0x0a, 0x0e, 0x11, 0x1f, 0x11, 0x11, 0x00}, /* 0x014 Â (a circumflex) */
{ 0x0d, 0x12, 0x0e, 0x11, 0x1f, 0x11, 0x11, 0x00}, /* 0x015 Ã (A tilde) */
{ 0x0a, 0x00, 0x04, 0x0a, 0x11, 0x1f, 0x11, 0x00}, /* 0x016 Ä (A dieresis) */
{ 0x04, 0x0a, 0x04, 0x0e, 0x11, 0x1f, 0x11, 0x00}, /* 0x017 Å (A with ring above) */
{ 0x0f, 0x14, 0x14, 0x1f, 0x14, 0x14, 0x17, 0x00}, /* 0x018 Æ (AE ligature) */
{ 0x0f, 0x10, 0x10, 0x10, 0x0f, 0x02, 0x0e, 0x00}, /* 0x019 Ç (C cedilla) */
{ 0x08, 0x04, 0x1f, 0x10, 0x1e, 0x10, 0x1f, 0x00}, /* 0x01a È (E grave) */
{ 0x02, 0x04, 0x1f, 0x10, 0x1c, 0x10, 0x1f, 0x00}, /* 0x01b É (E acute) */
{ 0x04, 0x0a, 0x1f, 0x10, 0x1c, 0x10, 0x1f, 0x00}, /* 0x01c Ê (E circumflex) */
{ 0x0a, 0x00, 0x1f, 0x10, 0x1c, 0x10, 0x1f, 0x00}, /* 0x01d Ë (E dieresis)*/
{ 0x08, 0x04, 0x0e, 0x04, 0x04, 0x04, 0x0e, 0x00}, /* 0x01e Ì (I grave) */
{ 0x02, 0x04, 0x0e, 0x04, 0x04, 0x04, 0x0e, 0x00}, /* 0x01f Í (I acute) */
{ 0x0c, 0x0a, 0x09, 0x1d, 0x09, 0x0a, 0x0c, 0x00}, /* 0x020 Ð (ETH) */
{ 0x0d, 0x12, 0x00, 0x19, 0x15, 0x13, 0x11, 0x00}, /* 0x021 Ñ (N tilde) */
{ 0x08, 0x04, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 0x022 Ò (O grave) */
{ 0x02, 0x04, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 0x023 Ó (O acute) */
{ 0x04, 0x0a, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 0x024 Ô (O circumflex) */
{ 0x0d, 0x12, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 0x025 Õ (O tilde) */
{ 0x0a, 0x00, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 0x026 Ö (O dieresis) */
{ 0x01, 0x0e, 0x13, 0x15, 0x19, 0x0e, 0x10, 0x00}, /* 0x027 Ø (O stroke) */
{ 0x08, 0x04, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 0x028 Ù (U grave) */
{ 0x02, 0x04, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 0x029 Ú (U acute) */
{ 0x0a, 0x00, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 0x02a Ü (U dieresis) */
{ 0x08, 0x04, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00}, /* 0x02b à (a grave) */
{ 0x02, 0x04, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00}, /* 0x02c á (a acute) */
{ 0x04, 0x0a, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00}, /* 0x02d â (a circumflex) */
{ 0x0d, 0x12, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00}, /* 0x02e ã (a tilde) */
{ 0x0a, 0x00, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00}, /* 0x02f ä (a dieresis) */
{ 0x04, 0x0a, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00}, /* 0x030 å (a with ring above) */
{ 0x00, 0x0f, 0x10, 0x10, 0x0f, 0x02, 0x04, 0x00}, /* 0x031 ç (c cedilla) */
{ 0x08, 0x04, 0x0e, 0x11, 0x1f, 0x10, 0x0e, 0x00}, /* 0x032 è (e grave) */
{ 0x02, 0x04, 0x0e, 0x11, 0x1f, 0x10, 0x0e, 0x00}, /* 0x033 é (e acute) */
{ 0x04, 0x0a, 0x0e, 0x11, 0x1f, 0x10, 0x0e, 0x00}, /* 0x034 ê (e circumflex) */
{ 0x0a, 0x00, 0x0e, 0x11, 0x1f, 0x10, 0x0e, 0x00}, /* 0x035 ë (e dieresis) */
{ 0x02, 0x04, 0x00, 0x0c, 0x04, 0x04, 0x0e, 0x00}, /* 0x036 í (i acute) */
{ 0x04, 0x0a, 0x00, 0x0c, 0x04, 0x04, 0x0e, 0x00}, /* 0x037 î (i circumflex) */
{ 0x0a, 0x00, 0x00, 0x0c, 0x04, 0x04, 0x0e, 0x00}, /* 0x038 ï (i dieresis) */
{ 0x0d, 0x12, 0x00, 0x16, 0x19, 0x11, 0x11, 0x00}, /* 0x039 ñ (n tilde) */
{ 0x08, 0x04, 0x00, 0x0e, 0x11, 0x11, 0x0e, 0x00}, /* 0x03a ò (o grave) */
{ 0x02, 0x04, 0x00, 0x0e, 0x11, 0x11, 0x0e, 0x00}, /* 0x03b ó (o acute) */
{ 0x04, 0x0a, 0x00, 0x0e, 0x11, 0x11, 0x0e, 0x00}, /* 0x03c ô (o circumflex) */
{ 0x0d, 0x12, 0x00, 0x0e, 0x11, 0x11, 0x0e, 0x00}, /* 0x03d õ (o tilde) */
{ 0x00, 0x0a, 0x00, 0x0e, 0x11, 0x11, 0x0e, 0x00}, /* 0x03e ö (o dieresis) */
{ 0x00, 0x02, 0x0e, 0x15, 0x15, 0x0e, 0x08, 0x00}, /* 0x03f ø (o slash) */
{ 0x08, 0x04, 0x00, 0x11, 0x11, 0x13, 0x0d, 0x00}, /* 0x040 ù (u grave) */
{ 0x02, 0x04, 0x00, 0x11, 0x11, 0x13, 0x0d, 0x00}, /* 0x041 ú (u acute) */
{ 0x00, 0x0a, 0x00, 0x11, 0x11, 0x13, 0x0d, 0x00}, /* 0x042 ü (u dieresis) */
{ 0x02, 0x04, 0x11, 0x11, 0x0f, 0x01, 0x0e, 0x00}, /* 0x043 ý (y acute) */
#endif /* !BOOTLOADER */
};
void lcd_charset_init(void)
{
if (is_new_player())
{
hw_pattern_count = 8;
xchar_info = xchar_info_newlcd;
xchar_info_size = sizeof(xchar_info_newlcd)/sizeof(struct xchar_info);
}
else /* old lcd */
{
hw_pattern_count = 4;
xchar_info = xchar_info_oldlcd;
xchar_info_size = sizeof(xchar_info_oldlcd)/sizeof(struct xchar_info);
}
}

View file

@ -1,751 +0,0 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2003 by Kjell Ericson
*
* All files in this archive are subject to the GNU General Public License.
* See the file COPYING in the source tree root for full license agreement.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#ifndef __CONFIG_H__
/* to easier allow this source file to be used even from tools when config.h
cannot be included safely */
#include "config.h"
#endif
#ifdef HAVE_LCD_CHARCELLS
#include "lcd-player-charset.h"
unsigned short new_lcd_rocklatin1_to_xlcd[] =
{
NOCHAR_NEW, /* 0x00 reserved never to be used */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
0x216, /* 0x16 .. "bookmark" icon */
0x217, /* 0x17 .. "plugin" icon */
0x218, /* 0x18 .. "folder" icon */
0x219, /* 0x19 .. "MOD/AJZ" icon (winlatin o (dote in the middle) */
0x21a, /* 0x1a .. "language" icon (winlatin - (a bit longer minus sign) */
0x21b, /* 0x1b .. "note" icon */
0x21c, /* 0x1c .. "WPS" icon */
0x21d, /* 0x1d .. "playlist" icon */
0x21e, /* 0x1e .. "text file" icon (winlatin - (much longer minus sign) */
0x21f, /* 0x1f .. "config file" icon (winlatin ~) */
0x020, /* 0x20 .. */
0x021, /* 0x21 .. ! */
0x022, /* 0x22 .. " */
0x023, /* 0x23 .. # */
0x024, /* 0x24 .. $ */
0x025, /* 0x25 .. % */
0x026, /* 0x26 .. & */
0x027, /* 0x27 .. ' */
0x028, /* 0x28 .. ( */
0x029, /* 0x29 .. ) */
0x02a, /* 0x2a .. * */
0x02b, /* 0x2b .. + */
0x02c, /* 0x2c .. , */
0x02d, /* 0x2d .. - */
0x02e, /* 0x2e .. . */
0x02f, /* 0x2f .. / */
0x030, /* 0x30 .. 0 */
0x031, /* 0x31 .. 1 */
0x032, /* 0x32 .. 2 */
0x033, /* 0x33 .. 3 */
0x034, /* 0x34 .. 4 */
0x035, /* 0x35 .. 5 */
0x036, /* 0x36 .. 6 */
0x037, /* 0x37 .. 7 */
0x038, /* 0x38 .. 8 */
0x039, /* 0x39 .. 9 */
0x03a, /* 0x3a .. : */
0x03b, /* 0x3b .. ; */
0x03c, /* 0x3c .. < */
0x03d, /* 0x3d .. = */
0x03e, /* 0x3e .. > */
0x03f, /* 0x3f .. ? */
0x040, /* 0x40 .. @ */
0x041, /* 0x41 .. A */
0x042, /* 0x42 .. B */
0x043, /* 0x43 .. C */
0x044, /* 0x44 .. D */
0x045, /* 0x45 .. E */
0x046, /* 0x46 .. F */
0x047, /* 0x47 .. G */
0x048, /* 0x48 .. H */
0x049, /* 0x49 .. I */
0x04a, /* 0x4a .. J */
0x04b, /* 0x4b .. K */
0x04c, /* 0x4c .. L */
0x04d, /* 0x4d .. M */
0x04e, /* 0x4e .. N */
0x04f, /* 0x4f .. O */
0x050, /* 0x50 .. P */
0x051, /* 0x51 .. Q */
0x052, /* 0x52 .. R */
0x053, /* 0x53 .. S */
0x054, /* 0x54 .. T */
0x055, /* 0x55 .. U */
0x056, /* 0x56 .. V */
0x057, /* 0x57 .. W */
0x058, /* 0x58 .. X */
0x059, /* 0x59 .. Y */
0x05a, /* 0x5a .. Z */
0x05b, /* 0x5b .. [ */
0x012, /* 0x5c .. \ */
0x05d, /* 0x5d .. ] */
0x05e, /* 0x5e .. ^ */
0x05f, /* 0x5f .. _ */
0x060, /* 0x60 .. ` */
0x061, /* 0x00 97 .. a */
0x062, /* 0x00 98 .. b */
0x063, /* 0x00 99 .. c */
0x064, /* 0x64 .. d */
0x065, /* 0x65 .. e */
0x066, /* 0x66 .. f */
0x067, /* 0x67 .. g */
0x068, /* 0x68 .. h */
0x069, /* 0x69 .. i */
0x06a, /* 0x6a .. j */
0x06b, /* 0x6b .. k */
0x06c, /* 0x6c .. l */
0x06d, /* 0x6d .. m */
0x06e, /* 0x6e .. n */
0x06f, /* 0x6f .. o */
0x070, /* 0x70 .. p */
0x071, /* 0x71 .. q */
0x072, /* 0x72 .. r */
0x073, /* 0x73 .. s */
0x074, /* 0x74 .. t */
0x075, /* 0x75 .. u */
0x076, /* 0x76 .. v */
0x077, /* 0x77 .. w */
0x078, /* 0x78 .. x */
0x079, /* 0x79 .. y */
0x07a, /* 0x7a .. z */
0x07b, /* 0x7b ..*/ /* Old LCD hardcoded to "(" */
0x07c, /* 0x7c .. | */
0x07d, /* 0x7d .. } */ /* Old LCD hardcoded to ")" */
0x0f0, /* 0x7e .. ~ */
0x0fe, /* 0x7f .. full grid */
NOCHAR_NEW, /* 0x80 winlatin Eurosign */
0x010, /* 0x81 filled-left-arrow (winlatin undefined) */
0x011, /* 0x82 filled-right-arrow (winlatin comma) */
0x01e, /* 0x83 filled-up-arrow (winlatin f) */
0x01f, /* 0x84 filled-up-arrow (winlatin ") */
0x224, /* 0x85 .. … (three dots) */
0x081, /* 0x86 meter level 2 (winlatin undefined) */
0x082, /* 0x87 meter level 3 (winlatin undefined) */
0x083, /* 0x88 meter level 4 (winlatin undefined) */
0x084, /* 0x89 meter level 5 (winlatin Promille) */
0x085, /* 0x8a meter level 6 (winlatin 'S' with upside down ^) */
0x086, /* 0x8b meter level 7 (full) (winlatin '<') */
NOCHAR_NEW, /* 0x8c .. Œ CE */
NOCHAR_NEW, /* 0x8d .. <20> */
0x225, /* 0x8e .. Ž 'Z' with upside down ^ */
NOCHAR_NEW, /* 0x8f .. <20> */
0x25d, /* 0x90 "unknown" icon */
0x094, /* 0x91 .. */
0x07e, /* 0x92 .. */
0x091, /* 0x93 .. folder icon susbstitute */
0x013, /* 0x94 .. note icon substitute */
0x0d0, /* 0x95 .. text/language/config icon substitute (winlatin o (dote in the middle) */
NOCHAR_NEW, /* 0x96 .. (winlatin - (a bit longer minus sign) */
NOCHAR_NEW, /* 0x97 .. (winlatin - (much longer minus sign) */
NOCHAR_NEW, /* 0x98 .. (winlatin ~) */
NOCHAR_NEW, /* 0x99 .. (winlatin TM) */
NOCHAR_NEW, /* 0x9a .. š 's' with upside down ^ */
NOCHAR_NEW, /* 0x9b .. > */
NOCHAR_NEW, /* 0x9c .. œ oe */
NOCHAR_NEW, /* 0x9d .. <20> */
0x225, /* 0x9e .. ž 'z' with upside down ^ */
0x059, /* 0x9f .. Ÿ Large ÿ (Y with two dots) */
NOCHAR_NEW, /* 0xa0 .. */
NOCHAR_NEW, /* 0xa1 .. ¡ */
NOCHAR_NEW, /* 0xa2 .. ¢ */
0x226, /* 0xa3 .. £ */
NOCHAR_NEW, /* 0xa4 .. ¤ */
NOCHAR_NEW, /* 0xa5 .. ¥ */
NOCHAR_NEW, /* 0xa6 .. ¦ */
0x015, /* 0xa7 .. § */
NOCHAR_NEW, /* 0xa8 .. ¨ */
NOCHAR_NEW, /* 0xa9 .. © (copyright) */
NOCHAR_NEW, /* 0xaa .. ª */
NOCHAR_NEW, /* 0xab .. "<<" */
NOCHAR_NEW, /* 0xac .. (unknown) */
NOCHAR_NEW, /* 0xad .. (unkown1 */
NOCHAR_NEW, /* 0xae .. ® (register)*/
0x228, /* 0xaf .. ¯ */
NOCHAR_NEW, /* 0xb0 .. ° */
NOCHAR_NEW, /* 0xb1 .. ± */
NOCHAR_NEW, /* 0xb2 .. ² */
NOCHAR_NEW, /* 0xb3 .. ³ */
NOCHAR_NEW, /* 0xb4 .. ´ */
NOCHAR_NEW, /* 0xb5 .. µ */
NOCHAR_NEW, /* 0xb6 .. 1 */
NOCHAR_NEW, /* 0xb7 .. · */
NOCHAR_NEW, /* 0xb8 .. ¸ */
NOCHAR_NEW, /* 0xb9 .. ¹ */
NOCHAR_NEW, /* 0xba .. º */
NOCHAR_NEW, /* 0xbb .. " */
NOCHAR_NEW, /* 0xbc .. ¼ */
NOCHAR_NEW, /* 0xbd .. ½ */
NOCHAR_NEW, /* 0xbe .. ¾ */
0x229, /* 0xbf .. ¿ */
0x22a, /* 0xc0 .. À */
0x22b, /* 0xc1 .. Á */
0x22c, /* 0xc2 .. Â */
0x22d, /* 0xc3 .. Ã */
0x22e, /* 0xc4 .. Ä */
0x22f, /* 0xc5 .. Å */
0x230, /* 0xc6 .. Æ */
0x231, /* 0xc7 .. Ç */
0x232, /* 0xc8 .. È */
0x233, /* 0xc9 .. É */
0x234, /* 0xca .. Ê */
0x235, /* 0xcb .. Ë */
0x236, /* 0xcc .. Ì */
0x237, /* 0xcd .. Í */
0x049, /* 0xce .. Î */
0x049, /* 0xcf .. Ï */
0x238, /* 0xd0 .. Ð */
0x239, /* 0xd1 .. Ñ */
0x23a, /* 0xd2 .. Ò */
0x23b, /* 0xd3 .. Ó */
0x23c, /* 0xd4 .. Ô */
0x23d, /* 0xd5 .. Õ */
0x23e, /* 0xd6 .. Ö */
0x23f, /* 0xd7 .. × */
0x240, /* 0xd8 .. Ø */
0x241, /* 0xd9 .. Ù */
0x242, /* 0xda .. Ú */
0x055, /* 0xdb .. Û */
0x243, /* 0xdc .. Ü */
0x059, /* 0xdd .. Ý */
NOCHAR_NEW, /* 0xde .. Þ */
0x244, /* 0xdf .. ß */
0x245, /* 0xe0 .. à */
0x246, /* 0xe1 .. á */
0x247, /* 0xe2 .. â */
0x248, /* 0xe3 .. ã */
0x249, /* 0xe4 .. ä */
0x24a, /* 0xe5 .. å */
NOCHAR_NEW, /* 0xe6 .. æ */
0x24b, /* 0xe7 .. ç */
0x24c, /* 0xe8 .. è */
0x24d, /* 0xe9 .. é */
0x24e, /* 0xea .. ê */
0x24f, /* 0xeb .. ë */
0x069, /* 0xec .. ì */
0x250, /* 0xed .. í */
0x251, /* 0xee .. î */
0x252, /* 0xef .. ï */
NOCHAR_NEW, /* 0xf0 .. ð */
0x253, /* 0xf1 .. ñ */
0x23a, /* 0xf2 .. ò */
0x254, /* 0xf3 .. ó */
0x255, /* 0xf4 .. ô */
0x256, /* 0xf5 .. õ */
0x257, /* 0xf6 .. ö */
NOCHAR_NEW, /* 0xf7 .. ÷ */
0x258, /* 0xf8 .. ø */
0x259, /* 0xf9 .. ù */
0x25a, /* 0xfa .. ú */
0x075, /* 0xfb .. û */
0x25b, /* 0xfc .. ü */
0x25c, /* 0xfd .. ý */
NOCHAR_NEW, /* 0xfe .. þ */
0x079, /* 0xff .. ÿ */
};
unsigned short old_lcd_rocklatin1_to_xlcd[] =
{
/* OLD LCD */
NOCHAR_OLD, /* 0x00 reserved never to be used */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
RESERVED_CHAR, /* reserved */
0x216, /* 0x16 .. "bookmark" icon */
0x217, /* 0x17 .. "plugin" icon */
0x218, /* 0x18 .. "folder" icon */
0x219, /* 0x19 .. "MOD/AJZ" icon (winlatin o (dote in the middle) */
0x21a, /* 0x1a .. "language" icon (winlatin - (a bit longer minus sign) */
0x0fc, /* 0x1b .. "note" icon */
0x0d4, /* 0x1c .. "WPS" icon */
0x21d, /* 0x1d .. "playlist" icon */
0x21e, /* 0x1e .. "text file" icon (winlatin - (much longer minus sign) */
0x21f, /* 0x1f .. "config file" icon (winlatin ~) */
0x024, /* 0x20 .. */
0x025, /* 0x21 .. ! */
0x026, /* 0x22 .. " */
0x027, /* 0x23 .. # */
0x006, /* 0x24 .. $ */
0x029, /* 0x25 .. % */
0x02a, /* 0x26 .. & */
0x02b, /* 0x27 .. ' */
0x02c, /* 0x28 .. ( */
0x02d, /* 0x29 .. ) */
0x02e, /* 0x2a .. * */
0x02f, /* 0x2b .. + */
0x030, /* 0x2c .. , */
0x031, /* 0x2d .. - */
0x032, /* 0x2e .. . */
0x033, /* 0x2f .. / */
0x034, /* 0x30 .. 0 */
0x035, /* 0x31 .. 1 */
0x036, /* 0x32 .. 2 */
0x037, /* 0x33 .. 3 */
0x038, /* 0x34 .. 4 */
0x039, /* 0x35 .. 5 */
0x03a, /* 0x36 .. 6 */
0x03b, /* 0x37 .. 7 */
0x03c, /* 0x38 .. 8 */
0x03d, /* 0x39 .. 9 */
0x03e, /* 0x3a .. : */
0x03f, /* 0x3b .. ; */
0x040, /* 0x3c .. < */
0x041, /* 0x3d .. = */
0x042, /* 0x3e .. > */
0x043, /* 0x3f .. ? */
0x004, /* 0x40 .. @ */
0x045, /* 0x41 .. A */
0x046, /* 0x42 .. B */
0x047, /* 0x43 .. C */
0x048, /* 0x44 .. D */
0x049, /* 0x45 .. E */
0x04a, /* 0x46 .. F */
0x04b, /* 0x47 .. G */
0x04c, /* 0x48 .. H */
0x04d, /* 0x49 .. I */
0x04e, /* 0x4a .. J */
0x04f, /* 0x4b .. K */
0x050, /* 0x4c .. L */
0x051, /* 0x4d .. M */
0x052, /* 0x4e .. N */
0x053, /* 0x4f .. O */
0x054, /* 0x50 .. P */
0x055, /* 0x51 .. Q */
0x056, /* 0x52 .. R */
0x057, /* 0x53 .. S */
0x058, /* 0x54 .. T */
0x059, /* 0x55 .. U */
0x05a, /* 0x56 .. V */
0x05b, /* 0x57 .. W */
0x05c, /* 0x58 .. X */
0x05d, /* 0x59 .. Y */
0x05e, /* 0x5a .. Z */
0x0a9, /* 0x5b .. [ */ /* New LCD hardcoded to "(" */
0x220, /* 0x5c .. \ */
0x0ce, /* 0x5d .. ] */ /* New LCD hardcoded to ")" */
NOCHAR_OLD, /* 0x5e .. ^ */
0x015, /* 0x5f .. _ */
0x221, /* 0x60 .. ` */
0x065, /* 0x00 97 .. a */
0x066, /* 0x00 98 .. b */
0x067, /* 0x00 99 .. c */
0x068, /* 0x64 .. d */
0x069, /* 0x65 .. e */
0x06a, /* 0x66 .. f */
0x06b, /* 0x67 .. g */
0x06c, /* 0x68 .. h */
0x06d, /* 0x69 .. i */
0x06e, /* 0x6a .. j */
0x06f, /* 0x6b .. k */
0x070, /* 0x6c .. l */
0x071, /* 0x6d .. m */
0x072, /* 0x6e .. n */
0x073, /* 0x6f .. o */
0x074, /* 0x70 .. p */
0x075, /* 0x71 .. q */
0x076, /* 0x72 .. r */
0x077, /* 0x73 .. s */
0x078, /* 0x74 .. t */
0x079, /* 0x75 .. u */
0x07a, /* 0x76 .. v */
0x07b, /* 0x77 .. w */
0x07c, /* 0x78 .. x */
0x07d, /* 0x79 .. y */
0x07e, /* 0x7a .. z */
0x02c, /* 0x7b ..*/ /* Old LCD hardcoded to "(" */
0x222, /* 0x7c .. | */
0x02d, /* 0x7d .. } */ /* Old LCD hardcoded to ")" */
0x223, /* 0x7e .. ~ */
0x08b, /* 0x7f full grid */
NOCHAR_OLD, /* 0x80 winlatin Eurosign */
0x089, /* 0x81 filled-left-arrow (winlatin undefined) */
0x088, /* 0x82 filled-right-arrow (winlatin comma) */
0x087, /* 0x83 filled-up-arrow (winlatin f) */
0x086, /* 0x84 filled-up-arrow (winlatin ") */
0x085, /* 0x85 .. … (three dots) */
0x0df, /* 0x86 meter level 2 (winlatin undefined) */
0x0e0, /* 0x87 meter level 3 (winlatin undefined) */
0x0e1, /* 0x88 meter level 4 (winlatin undefined) */
0x0e2, /* 0x89 meter level 5 (winlatin Promille) */
0x0e3, /* 0x8a meter level 6 (winlatin 'S' with upside down ^) */
0x0ec, /* 0x8a meter level 7 (full) (winlatin '<') */
NOCHAR_OLD, /* 0x8c .. Œ CE */
NOCHAR_OLD, /* 0x8d .. <20> */
0x0bd, /* 0x8e .. Ž 'Z' with upside down ^ */
NOCHAR_OLD, /* 0x8f .. <20> */
0x25d, /* 0x90 "unknown" icon */
0x0d4, /* 0x91 .. */
0x089, /* 0x92 .. */
0x034, /* 0x93 .. folder icon substitute */
0x0fc, /* 0x94 .. note icon substitute */
0x0fa, /* 0x95 .. text/language/config icon substitute (winlatin o (dote in the middle) */
NOCHAR_OLD, /* 0x96 .. (winlatin - (a bit longer minus sign) */
NOCHAR_OLD, /* 0x97 .. (winlatin - (much longer minus sign) */
NOCHAR_OLD, /* 0x98 .. (winlatin ~) */
NOCHAR_OLD, /* 0x99 .. (winlatin TM) */
NOCHAR_OLD, /* 0x9a .. š 's' with upside down ^ */
NOCHAR_OLD, /* 0x9b .. > */
NOCHAR_OLD, /* 0x9c .. œ oe */
NOCHAR_OLD, /* 0x9d .. <20> */
0x0bd, /* 0x9e .. ž 'z' with upside down ^ */
NOCHAR_OLD, /* 0x9f .. Ÿ Large ÿ (Y with two dots) */
NOCHAR_OLD, /* 0xa0 .. */
NOCHAR_OLD, /* 0xa1 .. ¡ */
NOCHAR_OLD, /* 0xa2 .. ¢ */
0x005, /* 0xa3 .. £ */
NOCHAR_OLD, /* 0xa4 .. ¤ */
NOCHAR_OLD, /* 0xa5 .. ¥ */
NOCHAR_OLD, /* 0xa6 .. ¦ */
0x063, /* 0xa7 .. § */
NOCHAR_OLD, /* 0xa8 .. ¨ */
NOCHAR_OLD, /* 0xa9 .. © (copyright) */
NOCHAR_OLD, /* 0xaa .. ª */
NOCHAR_OLD, /* 0xab .. "<<" */
NOCHAR_OLD, /* 0xac .. (unknown) */
NOCHAR_OLD, /* 0xad .. (unkown1 */
NOCHAR_OLD, /* 0xae .. ® (register)*/
0x0ee, /* 0xaf .. ¯ */
NOCHAR_OLD, /* 0xb0 .. ° */
NOCHAR_OLD, /* 0xb1 .. ± */
NOCHAR_OLD, /* 0xb2 .. ² */
NOCHAR_OLD, /* 0xb3 .. ³ */
NOCHAR_OLD, /* 0xb4 .. ´ */
NOCHAR_OLD, /* 0xb5 .. µ */
NOCHAR_OLD, /* 0xb6 .. 1 */
NOCHAR_OLD, /* 0xb7 .. · */
NOCHAR_OLD, /* 0xb8 .. ¸ */
NOCHAR_OLD, /* 0xb9 .. ¹ */
NOCHAR_OLD, /* 0xba .. º */
NOCHAR_OLD, /* 0xbb .. " */
NOCHAR_OLD, /* 0xbc .. ¼ */
NOCHAR_OLD, /* 0xbd .. ½ */
NOCHAR_OLD, /* 0xbe .. ¾ */
0x064, /* 0xbf .. ¿ */
0x08c, /* 0xc0 .. À */
0x08d, /* 0xc1 .. Á */
0x08e, /* 0xc2 .. Â */
0x08f, /* 0xc3 .. Ã */
0x05f, /* 0xc4 .. Ä */
0x012, /* 0xc5 .. Å */
0x020, /* 0xc6 .. Æ */
0x00d, /* 0xc7 .. Ç */
0x090, /* 0xc8 .. È */
0x023, /* 0xc9 .. É */
0x091, /* 0xca .. Ê */
0x092, /* 0xcb .. Ë */
0x093, /* 0xcc .. Ì */
0x094, /* 0xcd .. Í */
0x049, /* 0xce .. Î */
0x049, /* 0xcf .. Ï */
0x095, /* 0xd0 .. Ð */
0x061, /* 0xd1 .. Ñ */
0x096, /* 0xd2 .. Ò */
0x097, /* 0xd3 .. Ó */
0x098, /* 0xd4 .. Ô */
0x099, /* 0xd5 .. Õ */
0x060, /* 0xd6 .. Ö */
0x0de, /* 0xd7 .. × */
0x00f, /* 0xd8 .. Ø */
0x09a, /* 0xd9 .. Ù */
0x09b, /* 0xda .. Ú */
0x059, /* 0xdb .. Û */
0x062, /* 0xdc .. Ü */
0x0af, /* 0xdd .. Ý */
NOCHAR_OLD, /* 0xde .. Þ */
0x022, /* 0xdf .. ß */
0x083, /* 0xe0 .. à */
0x09c, /* 0xe1 .. á */
0x09d, /* 0xe2 .. â */
0x09e, /* 0xe3 .. ã */
0x07f, /* 0xe4 .. ä */
0x09d, /* 0xe5 .. å */
NOCHAR_OLD, /* 0xe6 .. æ */
0x084, /* 0xe7 .. ç */
0x008, /* 0xe8 .. è */
0x009, /* 0xe9 .. é */
0x09f, /* 0xea .. ê */
0x0a0, /* 0xeb .. ë */
0x06d, /* 0xec .. ì */
0x0a1, /* 0xed .. í */
0x0a2, /* 0xee .. î */
0x0a3, /* 0xef .. ï */
NOCHAR_OLD, /* 0xf0 .. ð */
0x081, /* 0xf1 .. ñ */
0x096, /* 0xf2 .. ò */
0x0a4, /* 0xf3 .. ó */
0x0a5, /* 0xf4 .. ô */
0x0a6, /* 0xf5 .. õ */
0x080, /* 0xf6 .. ö */
NOCHAR_OLD, /* 0xf7 .. ÷ */
0x010, /* 0xf8 .. ø */
0x00a, /* 0xf9 .. ù */
0x0a7, /* 0xfa .. ú */
0x079, /* 0xfb .. û */
0x082, /* 0xfc .. ü */
0x0af, /* 0xfd .. ý */
NOCHAR_OLD, /* 0xfe .. þ */
0x07d, /* 0xff .. ÿ */
};
/* second table -- substitute */
const unsigned char
lcd_player_extended_lcd_to_rocklatin1[NO_EXTENDED_LCD_CHARS] =
{
/* 00 */ NOCHAR_NEW, /* 0-16 user defined */
/* 01 */ NOCHAR_NEW, /* 0-16 user defined */
/* 02 */ NOCHAR_NEW, /* 0-16 user defined */
/* 03 */ NOCHAR_NEW, /* 0-16 user defined */
/* 04 */ NOCHAR_NEW, /* 0-16 user defined */
/* 05 */ NOCHAR_NEW, /* 0-16 user defined */
/* 06 */ NOCHAR_NEW, /* 0-16 user defined */
/* 07 */ NOCHAR_NEW, /* 0-16 user defined */
/* 08 */ NOCHAR_NEW, /* 0-16 user defined */
/* 09 */ NOCHAR_NEW, /* 0-16 user defined */
/* 0a */ NOCHAR_NEW, /* 0-16 user defined */
/* 0b */ NOCHAR_NEW, /* 0-16 user defined */
/* 0c */ NOCHAR_NEW, /* 0-16 user defined */
/* 0d */ NOCHAR_NEW, /* 0-16 user defined */
/* 0e */ NOCHAR_NEW, /* 0-16 user defined */
/* 0f */ NOCHAR_NEW, /* 0-16 user defined */
/* 10 */ NOCHAR_NEW, /* reserved */
/* 11 */ NOCHAR_NEW, /* reserved */
/* 12 */ NOCHAR_NEW, /* reserved */
/* 13 */ NOCHAR_NEW, /* reserved */
/* 14 */ NOCHAR_NEW, /* reserved */
/* 15 */ NOCHAR_NEW, /* reserved */
/* 16 */ 0x91, /* bookmark icon */
/* 17 */ 0x29, /* plugin icon */
/* 18 */ 0x93, /* folder icon */
/* 19 */ 'x', /* MOD/AJZ icon */
/* 1a */ '+', /* language icon */
/* 1b */ 0x94, /* note icon */
/* 1c */ 0x91, /* WPS icon */
/* 1d */ 0x95, /* playlist icon */
/* 1e */ 0x95, /* text file icon */
/* 1f */ 0x95, /* config file icon */
/* 20 */ '/', /* substitute char for old lcd \ */
/* 21 */ '\'', /* substitute char for old lcd ` */
/* 22 */ '!', /* substitute char for old lcd | */
/* 23 */ '-', /* substitute char for old lcd ~ */
/* 24 */ '.', /* substitute char for new lcd (three dots) */
/* 25 */ 'z', /* substitue char for new lcd (0x0bd) 'z' with upside down ^ */
/* 26 */ 'L', /* substitue char for new lcd (0x005) £ */
/* 27 */ NOCHAR_NEW, /* empty */
/* 28 */ '-', /* substitue char for new lcd (0x0ee) ¯ */
/* 29 */ '?', /* substitue char for new lcd (0x064) ¿ */
/* 2a */ 'A', /* substitue char for new lcd (0x08c) À */
/* 2b */ 'A', /* substitue char for new lcd (0x08d) Á */
/* 2c */ 'A', /* substitue char for new lcd (0x08e) Â */
/* 2d */ 'A', /* substitue char for new lcd (0x08e) Ã */
/* 2e */ 'A', /* substitue char for new lcd (0x05f) Ä */
/* 2f */ 'A', /* substitue char for new lcd (0x012) Å */
/* 30 */ 'A', /* substitue char for new lcd (0x020) Æ */
/* 31 */ 'C', /* substitue char for new lcd (0x00d) Ç */
/* 32 */ 'E', /* substitue char for new lcd (0x090) È */
/* 33 */ 'E', /* substitue char for new lcd (0x023) É */
/* 34 */ 'E', /* substitue char for new lcd (0x091) Ê */
/* 35 */ 'E', /* substitue char for new lcd (0x092) Ë */
/* 36 */ 'I', /* substitue char for new lcd (0x093) Ì */
/* 37 */ 'I', /* substitue char for new lcd (0x094) Í */
/* 38 */ 'D', /* substitue char for new lcd (0x095) Ð */
/* 39 */ 'N', /* substitue char for new lcd (0x061) Ñ */
/* 3a */ 'O', /* substitue char for new lcd (0x096) Ò */
/* 3b */ 'O', /* substitue char for new lcd (0x097) Ó */
/* 3c */ 'O', /* substitue char for new lcd (0x098) Ô */
/* 3d */ 'O', /* substitue char for new lcd (0x099) Õ */
/* 3e */ 'O', /* substitue char for new lcd (0x060) Ö */
/* 3f */ 'x', /* substitue char for new lcd (0x0de) × */
/* 40 */ '0', /* substitue char for new lcd (0x00f) Ø */
/* 41 */ 'U', /* substitue char for new lcd (0x09a) Ù */
/* 42 */ 'U', /* substitue char for new lcd (0x09b) Ú */
/* 43 */ 'U', /* substitue char for new lcd (0x062) Ü */
/* 44 */ 'B', /* substitue char for new lcd (0x022) ß */
/* 45 */ 'a', /* substitue char for new lcd (0x083) à */
/* 46 */ 'a', /* substitue char for new lcd (0x09c) á */
/* 47 */ 'a', /* substitue char for new lcd (0x09d) â */
/* 48 */ 'a', /* substitue char for new lcd (0x09e) ã */
/* 49 */ 'a', /* substitue char for new lcd (0x07f) ä */
/* 4a */ 'a', /* substitue char for new lcd (0x09d) å */
/* 4b */ 'c', /* substitue char for new lcd (0x084) ç */
/* 4c */ 'e', /* substitue char for new lcd (0x008) è */
/* 4d */ 'e', /* substitue char for new lcd (0x009) é */
/* 4e */ 'e', /* substitue char for new lcd (0x09f) ê */
/* 4f */ 'e', /* substitue char for new lcd (0x0a0) ë */
/* 50 */ 'i', /* substitue char for new lcd (0x0a1) í */
/* 51 */ 'i', /* substitue char for new lcd (0x0a2) î */
/* 52 */ 'i', /* substitue char for new lcd (0x0a3) ï */
/* 53 */ 'n', /* substitue char for new lcd (0x081) ñ */
/* 54 */ 'o', /* substitue char for new lcd (0x0a4) ó */
/* 55 */ 'o', /* substitue char for new lcd (0x0a5) ô */
/* 56 */ 'o', /* substitue char for new lcd (0x0a6) õ */
/* 57 */ 'o', /* substitue char for new lcd (0x080) ö */
/* 58 */ 'o', /* substitue char for new lcd (0x010) ø */
/* 59 */ 'u', /* substitue char for new lcd (0x00a) ù */
/* 5a */ 'u', /* substitue char for new lcd (0x0a7) ú */
/* 5b */ 'u', /* substitue char for new lcd (0x082) ü */
/* 5c */ 'y', /* substitue char for new lcd (0x0af) ý */
/* 5d */ '?', /* unknown icon */
};
unsigned char extended_font_player[NO_EXTENDED_LCD_CHARS][8] = {
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 00 */
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 01 */
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 02 */
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 03 */
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 04 */
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 05 */
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 06 */
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 07 */
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 08 */
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 09 */
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 0a */
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 0b */
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 0c */
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 0d */
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 0e */
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 0f */
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 10 */
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 11 */
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 12 */
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 13 */
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 14 */
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 15 */
{ 0x00, 0x03, 0x07, 0x0e, 0x1c, 0x08, 0x00, 0x00}, /* 16 Bookmark icon */
{ 0x04, 0x1e, 0x07, 0x1f, 0x05, 0x01, 0x06, 0x00}, /* 17 Plugin file icon */
{ 0x0c, 0x13, 0x11, 0x11, 0x11, 0x11, 0x1f, 0x00}, /* 18 Folder icon */
{ 0x1f, 0x11, 0x1b, 0x15, 0x1b, 0x11, 0x1f, 0x00}, /* 19 MOD/AJZ icon */
{ 0x00, 0x1f, 0x15, 0x1f, 0x15, 0x1f, 0x00, 0x00}, /* 1a Language icon */
{ 0x03, 0x05, 0x09, 0x09, 0x0b, 0x1b, 0x18, 0x00}, /* 1b note icon */
{ 0x01, 0x01, 0x02, 0x02, 0x14, 0x0c, 0x04, 0x00}, /* 1c WPS icon */
{ 0x17, 0x00, 0x17, 0x00, 0x17, 0x00, 0x17, 0x00}, /* 1d Playlist icon */
{ 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00}, /* 1e Text file icon */
{ 0x0b, 0x10, 0x0b, 0x00, 0x1f, 0x00, 0x1f, 0x00}, /* 1f Config file icon */
/* Unprioritized chars follows below, least prioritized char last */
{ 0x00, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x00}, /* 20 '\' new lcd 0x12 */
{ 0x08, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 21 '`' new lcd 0x60 */
{ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00}, /* 22 '|' new lcd 0x7c */
{ 0x00, 0x00, 0x08, 0x15, 0x02, 0x00, 0x00, 0x00}, /* 23 '~' new lcd 0xf0 */
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00}, /* 24 old lcd 0x85 */
{ 0x0a, 0x04, 0x1f, 0x02, 0x04, 0x08, 0x1f, 0x00}, /* 25 old lcd 0xbd */
{ 0x06, 0x09, 0x08, 0x1e, 0x08, 0x08, 0x1f, 0x00}, /* 26 old lcd 0x05 */
{ 0x0e, 0x10, 0x0e, 0x11, 0x0e, 0x01, 0x0e, 0x00}, /* 27 old lcd 0x63 */
{ 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* 28 old lcd 0xee */
{ 0x04, 0x00, 0x04, 0x08, 0x10, 0x11, 0x0e, 0x00}, /* 29 old lcd 0x64 */
{ 0x08, 0x04, 0x0e, 0x11, 0x1f, 0x11, 0x11, 0x00}, /* 2a old lcd 0x8c */
{ 0x02, 0x04, 0x0e, 0x11, 0x1f, 0x11, 0x11, 0x00}, /* 2b old lcd 0x8d */
{ 0x04, 0x0a, 0x0e, 0x11, 0x1f, 0x11, 0x11, 0x00}, /* 2c old lcd 0x8e */
{ 0x0d, 0x12, 0x0e, 0x11, 0x1f, 0x11, 0x11, 0x00}, /* 2d old lcd 0x8f */
{ 0x0a, 0x00, 0x04, 0x0a, 0x11, 0x1f, 0x11, 0x00}, /* 2e old lcd 0x5f */
{ 0x04, 0x0a, 0x04, 0x0e, 0x11, 0x1f, 0x11, 0x00}, /* 2f old lcd 0x12 */
{ 0x0f, 0x14, 0x14, 0x1f, 0x14, 0x14, 0x17, 0x00}, /* 30 old lcd 0x20 */
{ 0x0f, 0x10, 0x10, 0x10, 0x0f, 0x02, 0x0e, 0x00}, /* 31 old lcd 0x0d */
{ 0x08, 0x04, 0x1f, 0x10, 0x1e, 0x10, 0x1f, 0x00}, /* 32 old lcd 0x90 */
{ 0x02, 0x04, 0x1f, 0x10, 0x1c, 0x10, 0x1f, 0x00}, /* 33 old lcd 0x23 */
{ 0x04, 0x0a, 0x1f, 0x10, 0x1c, 0x10, 0x1f, 0x00}, /* 34 old lcd 0x91 */
{ 0x0a, 0x00, 0x1f, 0x10, 0x1c, 0x10, 0x1f, 0x00}, /* 35 old lcd 0x92 */
{ 0x08, 0x04, 0x0e, 0x04, 0x04, 0x04, 0x0e, 0x00}, /* 36 old lcd 0x93 */
{ 0x02, 0x04, 0x0e, 0x04, 0x04, 0x04, 0x0e, 0x00}, /* 37 old lcd 0x94 */
{ 0x0c, 0x0a, 0x09, 0x1d, 0x09, 0x0a, 0x0c, 0x00}, /* 38 old lcd 0x95 */
{ 0x0d, 0x12, 0x00, 0x19, 0x15, 0x13, 0x11, 0x00}, /* 39 old lcd 0x61 */
{ 0x08, 0x04, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 3a old lcd 0x96 */
{ 0x02, 0x04, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 3b old lcd 0x97 */
{ 0x04, 0x0a, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 3c old lcd 0x98 */
{ 0x0d, 0x12, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 3d old lcd 0x99 */
{ 0x0a, 0x00, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 3e old lcd 0x60 */
{ 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x0a, 0x00}, /* 3f old lcd 0xde */
{ 0x01, 0x0e, 0x13, 0x15, 0x19, 0x0e, 0x10, 0x00}, /* 40 old lcd 0x0f */
{ 0x08, 0x04, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 41 old lcd 0x9a */
{ 0x02, 0x04, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 42 old lcd 0x9b */
{ 0x0a, 0x00, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00}, /* 43 old lcd 0x62 */
{ 0x0c, 0x12, 0x16, 0x11, 0x11, 0x16, 0x10, 0x00}, /* 44 old lcd 0x22 */
{ 0x08, 0x04, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00}, /* 45 old lcd 0x83 */
{ 0x02, 0x04, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00}, /* 46 old lcd 0x9c */
{ 0x04, 0x0a, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00}, /* 47 old lcd 0x9d */
{ 0x0d, 0x12, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00}, /* 48 old lcd 0x9e */
{ 0x0a, 0x00, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00}, /* 49 old lcd 0x7f */
{ 0x04, 0x0a, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00}, /* 4a old lcd 0x9d */
{ 0x00, 0x0f, 0x10, 0x10, 0x0f, 0x02, 0x04, 0x00}, /* 4b old lcd 0x84 */
{ 0x08, 0x04, 0x0e, 0x11, 0x1f, 0x10, 0x0e, 0x00}, /* 4c old lcd 0x08 */
{ 0x02, 0x04, 0x0e, 0x11, 0x1f, 0x10, 0x0e, 0x00}, /* 4d old lcd 0x09 */
{ 0x04, 0x0a, 0x0e, 0x11, 0x1f, 0x10, 0x0e, 0x00}, /* 4e old lcd 0x9f */
{ 0x0a, 0x00, 0x0e, 0x11, 0x1f, 0x10, 0x0e, 0x00}, /* 4f old lcd 0xa0 */
{ 0x02, 0x04, 0x00, 0x0c, 0x04, 0x04, 0x0e, 0x00}, /* 50 old lcd 0xa1 */
{ 0x04, 0x0a, 0x00, 0x0c, 0x04, 0x04, 0x0e, 0x00}, /* 51 old lcd 0xa2 */
{ 0x0a, 0x00, 0x00, 0x0c, 0x04, 0x04, 0x0e, 0x00}, /* 52 old lcd 0xa3 */
{ 0x0d, 0x12, 0x00, 0x16, 0x19, 0x11, 0x11, 0x00}, /* 53 old lcd 0x81 */
{ 0x02, 0x04, 0x00, 0x0e, 0x11, 0x11, 0x0e, 0x00}, /* 54 old lcd 0xa4 */
{ 0x04, 0x0a, 0x00, 0x0e, 0x11, 0x11, 0x0e, 0x00}, /* 55 old lcd 0xa5 */
{ 0x0d, 0x12, 0x00, 0x0e, 0x11, 0x11, 0x0e, 0x00}, /* 56 old lcd 0xa6 */
{ 0x00, 0x0a, 0x00, 0x0e, 0x11, 0x11, 0x0e, 0x00}, /* 57 old lcd 0x80 */
{ 0x00, 0x02, 0x0e, 0x15, 0x15, 0x0e, 0x08, 0x00}, /* 58 old lcd 0x10 */
{ 0x08, 0x04, 0x00, 0x11, 0x11, 0x13, 0x0d, 0x00}, /* 59 old lcd 0x0a */
{ 0x02, 0x04, 0x00, 0x11, 0x11, 0x13, 0x0d, 0x00}, /* 5a old lcd 0xa7 */
{ 0x00, 0x0a, 0x00, 0x11, 0x11, 0x13, 0x0d, 0x00}, /* 5b old lcd 0x82 */
{ 0x02, 0x04, 0x11, 0x11, 0x0f, 0x01, 0x0e, 0x00}, /* 5c old lcd 0xaf */
{ 0x0c, 0x12, 0x12, 0x08, 0x08, 0x00, 0x08, 0x00}, /* 5d Unknown icon */
};
#endif /* HAVE_LCD_CHARCELLS */

View file

@ -1,830 +0,0 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2002 by Alan Korr
*
* All files in this archive are subject to the GNU General Public License.
* See the file COPYING in the source tree root for full license agreement.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include "config.h"
#include "hwcompat.h"
#ifdef HAVE_LCD_CHARCELLS
#include "lcd.h"
#include "kernel.h"
#include "thread.h"
#include <string.h>
#include <stdlib.h>
#include "file.h"
#include "debug.h"
#include "system.h"
#include "font.h"
#include "lcd-player-charset.h"
#include "rbunicode.h"
/*** definitions ***/
#define OLD_LCD_CONTRAST_SET ((char)0xA8)
#define OLD_LCD_CRAM ((char)0xB0) /* Characters */
#define OLD_LCD_PRAM ((char)0x80) /* Patterns */
#define OLD_LCD_IRAM ((char)0xE0) /* Icons */
#define NEW_LCD_CONTRAST_SET ((char)0x50)
#define NEW_LCD_CRAM ((char)0x80) /* Characters */
#define NEW_LCD_PRAM ((char)0xC0) /* Patterns */
#define NEW_LCD_IRAM ((char)0x40) /* Icons */
#define NEW_LCD_FUNCTION_SET ((char)0x10)
#define NEW_LCD_POWER_SAVE_MODE_OSC_CONTROL_SET ((char)0x0c)
#define NEW_LCD_POWER_CONTROL_REGISTER_SET ((char)0x20)
#define NEW_LCD_DISPLAY_CONTROL_SET ((char)0x28)
#define LCD_CURSOR(x,y) ((char)(lcd_cram+((y)*16+(x))))
#define LCD_ICON(i) ((char)(lcd_iram+i))
#define SCROLLABLE_LINES 2
#define SCROLL_MODE_OFF 0
#define SCROLL_MODE_PAUSE 1
#define SCROLL_MODE_RUN 2
extern unsigned short new_lcd_rocklatin1_to_xlcd[];
extern unsigned short old_lcd_rocklatin1_to_xlcd[];
extern const unsigned char lcd_player_extended_lcd_to_rocklatin1[];
extern unsigned char extended_font_player[NO_EXTENDED_LCD_CHARS][8];
/*** generic code ***/
#define MAX_CURSOR_CHARS 8
struct cursorinfo {
int len;
char text[MAX_CURSOR_CHARS];
int textpos;
int y_pos;
int x_pos;
int divider;
int downcount;
} cursor;
static void scroll_thread(void);
static char scroll_stack[DEFAULT_STACK_SIZE];
static const char scroll_name[] = "scroll";
static int scroll_ticks = 12; /* # of ticks between updates */
static int scroll_delay = HZ/2; /* delay before starting scroll */
static int jump_scroll_delay = HZ/4; /* delay between jump scroll jumps */
static int scroll_spacing = 3; /* spaces between end and start of text */
static int bidir_limit = 50; /* percent */
static int jump_scroll = 0; /* 0=off, 1=once, ..., JUMP_SCROLL_ALWAYS */
static struct scrollinfo scroll[SCROLLABLE_LINES];
static char extended_chars_mapped[NO_EXTENDED_LCD_CHARS];
static char extended_pattern_content[8]; /* Which char is mapped in pattern */
static char extended_pattern_usage[8]; /* Counting number of times used */
static char pattern_size; /* Last pattern, 3 for old LCD, 7 for new LCD */
static bool new_lcd;
unsigned short *lcd_ascii;
static char lcd_contrast_set;
static char lcd_cram;
static char lcd_pram;
static char lcd_iram;
unsigned short buffer_xlcd[11][2];
unsigned short buffer_lcd_mirror[11][2];
#ifdef SIMULATOR
unsigned char hardware_buffer_lcd[11][2];
#endif
#define NO_CHAR -1
static void lcd_free_pat(int map_ch)
{
int x, y;
unsigned char substitute_char;
int pat;
pat=extended_chars_mapped[map_ch];
if (pat!=NO_CHAR) {
substitute_char=lcd_player_extended_lcd_to_rocklatin1[map_ch];
/* TODO: use a define for the screen width! */
for (x=0; x<11; x++) {
/* TODO: use a define for the screen height! */
for (y=0; y<2; y++) {
if (map_ch==lcd_ascii[buffer_xlcd[x][y]]-512) {
buffer_xlcd[x][y]=substitute_char;
buffer_lcd_mirror[x][y]=substitute_char;
#ifdef SIMULATOR
hardware_buffer_lcd[x][y]=substitute_char;
#else
lcd_write_command_e(LCD_CURSOR(x, y), substitute_char);
#endif
}
}
}
extended_chars_mapped[map_ch]=NO_CHAR;
extended_pattern_content[pat]=NO_CHAR;
extended_pattern_usage[pat]=0;
}
#ifdef SIMULATOR
lcd_update();
#endif
}
static int lcd_get_free_pat(int ch)
{
int pat;
int last_pat=0;
static int last_used_pat=0;
int loop;
pat=last_used_pat;
for (loop=0; loop<=pattern_size; loop++) {
pat=(pat+1)&pattern_size; /* Keep 'pat' within limits */
if (extended_pattern_usage[pat]==0) {
int map_ch=extended_pattern_content[pat];
if (map_ch != NO_CHAR) {
extended_chars_mapped[map_ch]=NO_CHAR;
extended_pattern_content[pat]=NO_CHAR;
}
last_used_pat=pat;
return pat;
}
if (extended_pattern_content[pat]>extended_pattern_content[last_pat])
last_pat=pat;
}
if (ch<32) { /* Prioritized char */
/* Remove last_pat */
lcd_free_pat(extended_pattern_content[last_pat]);
last_used_pat=last_pat;
return last_pat;
}
return NO_CHAR;
}
void xlcd_update(void)
{
int x, y;
for (x=0; x<11; x++) {
for (y=0; y<2; y++) {
unsigned short ch=buffer_xlcd[x][y];
unsigned char hw_ch=0xff;
if (ch==buffer_lcd_mirror[x][y])
continue; /* No need to redraw */
buffer_lcd_mirror[x][y]=ch;
if (ch>=256 && ch<512) {
hw_ch=ch-256;
} else {
int map_ch=lcd_ascii[ch];
if (map_ch<512) {
hw_ch=map_ch;
}
else {
map_ch=map_ch-512;
if (extended_chars_mapped[map_ch]!=NO_CHAR) {
hw_ch=extended_chars_mapped[map_ch];
extended_pattern_usage[hw_ch]++;
}
else {
int pat;
pat=lcd_get_free_pat(map_ch);
if (pat<0) {
/* Find substitute char */
map_ch=
lcd_player_extended_lcd_to_rocklatin1[map_ch];
hw_ch=lcd_ascii[map_ch];
} else {
#ifdef DEBUG
if (extended_pattern_usage[pat]!=0) {
DEBUGF("***Pattern %d is not zero!\n", pat);
}
#endif
extended_chars_mapped[map_ch]=pat;
extended_pattern_content[pat]=map_ch;
extended_pattern_usage[pat]=1;
lcd_define_hw_pattern(pat*8,
extended_font_player[map_ch],
8);
hw_ch=pat;
}
}
}
}
#ifdef SIMULATOR
hardware_buffer_lcd[x][y]=hw_ch;
#else
lcd_write_command_e(LCD_CURSOR(x,y), hw_ch);
#endif
}
}
lcd_update();
}
bool lcdx_putc(int x, int y, unsigned short ch)
{
int lcd_char;
if (buffer_xlcd[x][y]==ch)
return false; /* Same char, ignore any update */
lcd_char=lcd_ascii[buffer_xlcd[x][y]];
if (lcd_char>=512) {
/* The removed char is a defined pattern, count down the reference. */
extended_pattern_usage[(int)extended_chars_mapped[lcd_char-512]]--;
#ifdef DEBUG
if (extended_pattern_usage[(int)extended_chars_mapped[lcd_char]]<0) {
DEBUGF("**** Mapped char %02x is less than 0!\n", lcd_char);
}
#endif
}
buffer_xlcd[x][y]=ch;
lcd_char=lcd_ascii[ch];
if (lcd_char>=256)
return true; /* Caller shall call xlcd_update() when done */
buffer_lcd_mirror[x][y]=lcd_char;
#ifdef SIMULATOR
hardware_buffer_lcd[x][y]=lcd_char;
#else
lcd_write_command_e(LCD_CURSOR(x, y), lcd_char);
#endif
return false;
}
void lcd_clear_display(void)
{
int i;
bool update=false;
lcd_stop_scroll();
cursor.len=0; /* Stop cursor */
for (i=0;i<22;i++)
update|=lcdx_putc(i%11, i/11, ' ');
if (update)
xlcd_update();
}
static void lcd_puts_cont_scroll(int x, int y, const unsigned char *string)
{
bool update=false;
for (; *string && x<11; x++)
{
/* We should check if char is over 256 */
update|=lcdx_putc(x, y, *(unsigned char*)string++);
}
for (; x<11; x++)
update|=lcdx_putc(x, y, ' ');
if (update)
xlcd_update();
#ifdef SIMULATOR
lcd_update();
#endif
}
void lcd_puts(int x, int y, const unsigned char *string)
{
int i=0;
unsigned short ucs;
const unsigned char *utf8 = string;
unsigned char tmp[12];
while (*utf8 && i<11) {
utf8 = utf8decode(utf8, &ucs);
if (ucs < 256)
tmp[i++] = ucs;
else
tmp[i++] = '?';
}
tmp[i] = 0;
scroll[y].mode=SCROLL_MODE_OFF;
return lcd_puts_cont_scroll(x, y, tmp);
}
void lcd_put_cursor(int x, int y, char cursor_char)
{
if (cursor.len == 0) {
cursor.text[0]=buffer_xlcd[x][y];
cursor.text[1]=cursor_char;
cursor.len=2;
cursor.textpos=0;
cursor.y_pos=y;
cursor.x_pos=x;
cursor.downcount=0;
cursor.divider=4;
}
}
void lcd_remove_cursor(void)
{
if (cursor.len!=0) {
bool up;
cursor.len=0;
up = lcdx_putc(cursor.x_pos, cursor.y_pos, cursor.text[0]);
#ifdef SIMULATOR
if(up)
lcd_update();
#endif
}
}
void lcd_putc(int x, int y, unsigned short ch)
{
bool update;
if (x<0 || y<0) {
return;
}
update=lcdx_putc(x, y, ch);
if (update)
xlcd_update();
}
unsigned char lcd_get_locked_pattern(void)
{
unsigned char pat=1;
while (pat<LAST_RESERVED_CHAR) {
if (lcd_ascii[pat]==RESERVED_CHAR) {
lcd_ascii[pat]=0x200+pat;
return pat;
}
pat++;
}
return 0;
}
void lcd_unlock_pattern(unsigned char pat)
{
lcd_ascii[pat]=RESERVED_CHAR;
lcd_free_pat(pat);
}
void lcd_define_pattern(int pat, const char *pattern)
{
int i;
for (i=0; i<7; i++) {
extended_font_player[pat][i]=pattern[i];
}
if (extended_chars_mapped[pat]!=NO_CHAR) {
lcd_define_hw_pattern(extended_chars_mapped[pat]*8, pattern, 7);
}
}
#ifndef SIMULATOR
void lcd_define_hw_pattern (int which,const char *pattern,int length)
{
lcd_write_command(lcd_pram | which);
lcd_write_data(pattern, length);
}
void lcd_double_height(bool on)
{
if(new_lcd)
lcd_write_command(on?9:8);
}
static const char icon_pos[] =
{
0, 0, 0, 0, /* Battery */
2, /* USB */
3, /* Play */
4, /* Record */
5, /* Pause */
5, /* Audio */
6, /* Repeat */
7, /* 1 */
9, /* Volume */
9, /* Volume 1 */
9, /* Volume 2 */
10, /* Volume 3 */
10, /* Volume 4 */
10, /* Volume 5 */
10, /* Param */
};
static const char icon_mask[] =
{
0x02, 0x08, 0x04, 0x10, /* Battery */
0x04, /* USB */
0x10, /* Play */
0x10, /* Record */
0x02, /* Pause */
0x10, /* Audio */
0x02, /* Repeat */
0x01, /* 1 */
0x04, /* Volume */
0x02, /* Volume 1 */
0x01, /* Volume 2 */
0x08, /* Volume 3 */
0x04, /* Volume 4 */
0x01, /* Volume 5 */
0x10, /* Param */
};
void lcd_icon(int icon, bool enable)
{
static unsigned char icon_mirror[11] = {0};
int pos, mask;
pos = icon_pos[icon];
mask = icon_mask[icon];
if(enable)
icon_mirror[pos] |= mask;
else
icon_mirror[pos] &= ~mask;
lcd_write_command_e(LCD_ICON(pos), icon_mirror[pos]);
}
int lcd_default_contrast(void)
{
return 30;
}
void lcd_set_contrast(int val)
{
lcd_write_command_e(lcd_contrast_set, 31 - val);
}
#endif /* SIMULATOR */
void lcd_init (void)
{
unsigned char data_vector[64];
(void)data_vector;
new_lcd = is_new_player();
memset(extended_chars_mapped, NO_CHAR, sizeof(extended_chars_mapped));
memset(extended_pattern_content, NO_CHAR,sizeof(extended_pattern_content));
memset(extended_pattern_usage, 0, sizeof(extended_pattern_usage));
if(new_lcd) {
lcd_ascii = new_lcd_rocklatin1_to_xlcd;
lcd_contrast_set = NEW_LCD_CONTRAST_SET;
lcd_cram = NEW_LCD_CRAM;
lcd_pram = NEW_LCD_PRAM;
lcd_iram = NEW_LCD_IRAM;
pattern_size=7; /* Last pattern, 7 for new LCD */
#ifndef SIMULATOR
/* LCD init for cold start */
PBCR2 &= 0xff00; /* Set PB0..PB3 to GPIO */
or_b(0x0f, &PBIORL); /* ... output */
or_b(0x0f, &PBDRL); /* ... and high */
lcd_write_command(NEW_LCD_FUNCTION_SET + 1); /* CGRAM selected */
lcd_write_command_e(NEW_LCD_CONTRAST_SET, 0x08);
lcd_write_command(NEW_LCD_POWER_SAVE_MODE_OSC_CONTROL_SET + 2);
/* oscillator on */
lcd_write_command(NEW_LCD_POWER_CONTROL_REGISTER_SET + 7);
/* opamp buffer + voltage booster on*/
memset(data_vector, 0x20, 64);
lcd_write_command(NEW_LCD_CRAM); /* Set DDRAM address */
lcd_write_data(data_vector, 64); /* all spaces */
memset(data_vector, 0, 64);
lcd_write_command(NEW_LCD_PRAM); /* Set CGRAM address */
lcd_write_data(data_vector, 64); /* zero out */
lcd_write_command(NEW_LCD_IRAM); /* Set ICONRAM address */
lcd_write_data(data_vector, 16); /* zero out */
lcd_write_command(NEW_LCD_DISPLAY_CONTROL_SET + 1); /* display on */
#endif /* !SIMULATOR */
}
else {
lcd_ascii = old_lcd_rocklatin1_to_xlcd;
lcd_contrast_set = OLD_LCD_CONTRAST_SET;
lcd_cram = OLD_LCD_CRAM;
lcd_pram = OLD_LCD_PRAM;
lcd_iram = OLD_LCD_IRAM;
pattern_size=3; /* Last pattern, 3 for old LCD */
#ifndef SIMULATOR
#if 1
/* LCD init for cold start */
PBCR2 &= 0xff00; /* Set PB0..PB3 to GPIO */
or_b(0x0f, &PBIORL); /* ... output */
or_b(0x0f, &PBDRL); /* ... and high */
lcd_write_command(0x61);
lcd_write_command(0x42);
lcd_write_command(0x57);
memset(data_vector, 0x24, 13);
lcd_write_command(OLD_LCD_CRAM); /* Set DDRAM address */
lcd_write_data(data_vector, 13); /* all spaces */
lcd_write_command(OLD_LCD_CRAM + 0x10);
lcd_write_data(data_vector, 13);
lcd_write_command(OLD_LCD_CRAM + 0x20);
lcd_write_data(data_vector, 13);
memset(data_vector, 0, 32);
lcd_write_command(OLD_LCD_PRAM); /* Set CGRAM address */
lcd_write_data(data_vector, 32); /* zero out */
lcd_write_command(OLD_LCD_IRAM); /* Set ICONRAM address */
lcd_write_data(data_vector, 13); /* zero out */
lcd_write_command(OLD_LCD_IRAM + 0x10);
lcd_write_data(data_vector, 13);
lcd_write_command(0x31);
#else
/* archos look-alike code, left here for reference. As soon as the
* rockbox version is confirmed working, this will go away */
{
int i;
PBCR2 &= 0xc000;
PBIOR |= 0x000f;
PBDR |= 0x0002;
PBDR |= 0x0001;
PBDR |= 0x0004;
PBDR |= 0x0008;
for (i=0; i<200; i++) asm volatile ("nop"); /* wait 100 us */
PBDR &= 0xfffd; /* CS low (assert) */
for (i=0; i<100; i++) asm volatile ("nop"); /* wait 50 us */
lcd_write_command(0x61);
lcd_write_command(0x42);
lcd_write_command(0x57);
memset(data_vector, 0x24, 13);
lcd_write_command(0xb0); /* Set DDRAM address */
lcd_write_data(data_vector, 13); /* all spaces */
lcd_write_command(0xc0);
lcd_write_data(data_vector, 13);
lcd_write_command(0xd0);
lcd_write_data(data_vector, 13);
memset(data_vector, 0, 32);
lcd_write_command(0x80); /* Set CGRAM address */
lcd_write_data(data_vector, 32); /* zero out */
lcd_write_command(0xe0); /* Set ICONRAM address */
lcd_write_data(data_vector, 13); /* zero out */
lcd_write_command(0xf0);
lcd_write_data(data_vector, 13);
for (i=0; i<300000; i++) asm volatile ("nop"); /* wait 150 ms */
lcd_write_command(0x31);
lcd_write_command_e(0xa8, 0); /* Set contrast control */
}
#endif
#endif /* !SIMULATOR */
}
lcd_set_contrast(lcd_default_contrast());
create_thread(scroll_thread, scroll_stack,
sizeof(scroll_stack), scroll_name IF_PRIO(, PRIORITY_USER_INTERFACE)
IF_COP(, CPU, false));
}
void lcd_jump_scroll (int mode) /* 0=off, 1=once, ..., JUMP_SCROLL_ALWAYS */
{
jump_scroll=mode;
}
void lcd_bidir_scroll(int percent)
{
bidir_limit = percent;
}
void lcd_puts_scroll(int x, int y, const unsigned char* string )
{
struct scrollinfo* s;
int i=0;
unsigned short ucs;
const unsigned char *utf8 = string;
unsigned char tmp[utf8length(string)+1];
while (*utf8) {
utf8 = utf8decode(utf8, &ucs);
if (ucs < 256)
tmp[i++] = ucs;
else
tmp[i++] = '?';
}
tmp[i] = 0;
s = &scroll[y];
lcd_puts_cont_scroll(x,y,tmp);
s->textlen = strlen(tmp);
if ( s->textlen > 11-x ) {
s->mode = SCROLL_MODE_RUN;
s->scroll_start_tick = current_tick + scroll_delay;
s->offset=0;
s->startx=x;
s->starty=y;
s->direction=+1;
s->jump_scroll=0;
s->jump_scroll_steps=0;
if (jump_scroll && jump_scroll_delay<scroll_ticks*(s->textlen-11+x)) {
s->jump_scroll_steps=11-x;
s->jump_scroll=jump_scroll;
}
strncpy(s->text,tmp,sizeof s->text);
s->turn_offset=-1;
if (bidir_limit && (s->textlen < ((11-x)*(100+bidir_limit))/100)) {
s->turn_offset=s->textlen+x-11;
}
else {
for (i=0; i<scroll_spacing &&
s->textlen<(int)sizeof(s->text); i++) {
s->text[s->textlen++]=' ';
}
}
if (s->textlen<(int)sizeof(s->text))
s->text[s->textlen]=' ';
s->text[sizeof s->text - 1] = 0;
}
else
s->mode = SCROLL_MODE_OFF;
}
void lcd_stop_scroll(void)
{
struct scrollinfo* s;
int index;
for ( index = 0; index < SCROLLABLE_LINES; index++ ) {
s = &scroll[index];
if ( s->mode == SCROLL_MODE_RUN ||
s->mode == SCROLL_MODE_PAUSE ) {
/* restore scrolled row */
lcd_puts(s->startx, s->starty, s->text);
}
}
lcd_update();
}
static const char scroll_tick_table[16] = {
/* Hz values:
1, 1.25, 1.55, 2, 2.5, 3.12, 4, 5, 6.25, 8.33, 10, 12.5, 16.7, 20, 25, 33 */
100, 80, 64, 50, 40, 32, 25, 20, 16, 12, 10, 8, 6, 5, 4, 3
};
void lcd_scroll_speed(int speed)
{
scroll_ticks = scroll_tick_table[speed];
}
void lcd_scroll_delay(int ms)
{
scroll_delay = ms / (HZ / 10);
}
void lcd_jump_scroll_delay(int ms)
{
jump_scroll_delay = ms / (HZ / 10);
}
static void scroll_thread(void)
{
struct scrollinfo* s;
int index;
int i, o;
bool update;
/* initialize scroll struct array */
for (index = 0; index < SCROLLABLE_LINES; index++) {
scroll[index].mode = SCROLL_MODE_OFF;
}
while ( 1 ) {
update = false;
for ( index = 0; index < SCROLLABLE_LINES; index++ ) {
s = &scroll[index];
if ( s->mode == SCROLL_MODE_RUN ) {
if ( TIME_AFTER(current_tick, s->scroll_start_tick) ) {
char buffer[12];
int jumping_scroll=s->jump_scroll;
update = true;
if (s->jump_scroll) {
/* Find new position to start jump scroll by
* finding last white space within
* jump_scroll_steps */
int i;
o = s->offset = s->offset + s->jump_scroll_steps;
for (i = 0; i < s->jump_scroll_steps; i++, o--) {
if (o < s->textlen &&
((0x20 <= s->text[o] && s->text[o] <= 0x2f) || s->text[o] == '_'))
{
s->offset = o;
break;
}
}
s->scroll_start_tick = current_tick +
jump_scroll_delay;
/* Eat space */
while (s->offset < s->textlen &&
((0x20 <= s->text[s->offset] && s->text[s->offset] <= 0x2f) ||
s->text[s->offset] == '_')) {
s->offset++;
}
if (s->offset >= s->textlen) {
s->offset=0;
s->scroll_start_tick = current_tick +
scroll_delay;
if (s->jump_scroll != JUMP_SCROLL_ALWAYS) {
s->jump_scroll--;
s->direction=1;
}
}
} else {
if ( s->offset < s->textlen-1 ) {
s->offset+=s->direction;
if (s->offset==0) {
s->direction=+1;
s->scroll_start_tick = current_tick +
scroll_delay;
} else {
if (s->offset == s->turn_offset) {
s->direction=-1;
s->scroll_start_tick = current_tick +
scroll_delay;
}
}
}
else {
s->offset = 0;
}
}
i=0;
o=s->offset;
while (i<11) {
buffer[i++]=s->text[o++];
if (o==s->textlen /* || (jump_scroll && buffer[i-1] == ' ') */)
break;
}
o=0;
if (s->turn_offset == -1 && !jumping_scroll) {
while (i<11) {
buffer[i++]=s->text[o++];
}
} else {
while (i<11) {
buffer[i++]=' ';
}
}
buffer[11]=0;
lcd_puts_cont_scroll(s->startx, s->starty, buffer);
}
}
if (cursor.len>0) {
if (cursor.downcount--<0) {
cursor.downcount=cursor.divider;
cursor.textpos++;
if (cursor.textpos>=cursor.len)
cursor.textpos=0;
#ifdef SIMULATOR
lcdx_putc(cursor.x_pos, cursor.y_pos,
cursor.text[cursor.textpos]);
update=true;
#else
update|=lcdx_putc(cursor.x_pos, cursor.y_pos,
cursor.text[cursor.textpos]);
#endif
}
}
if (update) {
lcd_update();
}
}
sleep(scroll_ticks);
}
}
#endif /* HAVE_LCD_CHARCELLS */

View file

@ -4,10 +4,11 @@
/* define this if you would like tagcache to build on this target */
#define HAVE_TAGCACHE
/* LCD dimensions (for the simulator) */
#define LCD_WIDTH 132 /* Display width in pixels */
#define LCD_HEIGHT 64 /* Display height in pixels */
#define LCD_DEPTH 1
#define LCD_WIDTH 11
#define LCD_HEIGHT 2
#define LCD_DEPTH 1
#define SIM_LCD_WIDTH 132 /* pixels */
#define SIM_LCD_HEIGHT 64 /* pixels */
/* define this if you have the Player's keyboard */
#define CONFIG_KEYPAD PLAYER_PAD

View file

@ -0,0 +1,41 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id: lcd-player.c 12835 2007-03-18 17:58:49Z amiconn $
*
* Copyright (C) 2007 by Jens Arnold
*
* All files in this archive are subject to the GNU General Public License.
* See the file COPYING in the source tree root for full license agreement.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
/* map unicode characters to hardware or extended lcd characters */
struct xchar_info {
unsigned short ucs;
unsigned short glyph;
/* 0x0000..0x7fff: fixed extended characters
* 0x8000..0xffff: variable extended characters
* Dontcare if priority == 0 */
unsigned char priority;
unsigned char hw_char; /* direct or substitute */
};
/* target dependent - to be adjusted for other charcell targets */
#define HW_PATTERN_SIZE 7 /* number of bytes per pattern */
#define MAX_HW_PATTERNS 8 /* max. number of user-definable hw patterns */
extern int hw_pattern_count; /* actual number of user-definable hw patterns */
extern const struct xchar_info *xchar_info;
extern int xchar_info_size; /* number of entries */
extern const unsigned char xfont_fixed[][8];
void lcd_charset_init(void);

View file

@ -1,27 +0,0 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2003 by Kjell Ericson
*
* All files in this archive are subject to the GNU General Public License.
* See the file COPYING in the source tree root for full license agreement.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#ifdef HAVE_LCD_CHARCELLS
#define NO_EXTENDED_LCD_CHARS 0x5e
#define RESERVED_CHAR 0xff
#define LAST_RESERVED_CHAR 0x16
#define NOCHAR_OLD 0x24
#define NOCHAR_NEW 0x20
#endif

View file

@ -59,12 +59,21 @@ extern void lcd_init_device(void);
extern void lcd_backlight(bool on);
extern int lcd_default_contrast(void);
extern void lcd_set_contrast(int val);
extern void lcd_setmargins(int xmargin, int ymargin);
extern int lcd_getxmargin(void);
extern int lcd_getymargin(void);
extern int lcd_getstringsize(const unsigned char *str, int *w, int *h);
extern void lcd_clear_display(void);
extern void lcd_putsxy(int x, int y, const unsigned char *string);
extern void lcd_puts(int x, int y, const unsigned char *string);
extern void lcd_puts_style(int x, int y, const unsigned char *string, int style);
extern void lcd_putc(int x, int y, unsigned short ch);
extern void lcd_puts_offset(int x, int y, const unsigned char *str, int offset);
extern void lcd_puts_scroll_offset(int x, int y, const unsigned char *string,
int offset);
extern void lcd_putc(int x, int y, unsigned long ucs);
extern void lcd_stop_scroll(void);
extern void lcd_bidir_scroll(int threshold);
extern void lcd_scroll_speed(int speed);
extern void lcd_scroll_delay(int ms);
extern void lcd_puts_scroll(int x, int y, const unsigned char* string);
@ -123,14 +132,14 @@ enum
ICON_PARAM
};
extern void lcd_double_height(bool on);
extern void lcd_define_hw_pattern(int which,const char *pattern,int length);
extern void lcd_define_pattern(int which,const char *pattern);
unsigned char lcd_get_locked_pattern(void);
void lcd_unlock_pattern(unsigned char pat);
void lcd_put_cursor(int x, int y, char cursor_char);
void lcd_double_height(bool on);
void lcd_put_hw_char(int x, int y, unsigned char hw_char);
void lcd_define_hw_pattern(int which, const char *pattern);
void lcd_define_pattern(unsigned long ucs, const char *pattern);
unsigned long lcd_get_locked_pattern(void);
void lcd_unlock_pattern(unsigned long ucs);
void lcd_put_cursor(int x, int y, unsigned long cursor_ucs);
void lcd_remove_cursor(void);
extern void lcd_bidir_scroll(int threshold);
#define JUMP_SCROLL_ALWAYS 5
extern void lcd_jump_scroll(int mode); /* 0=off, 1=once, ..., ALWAYS */
extern void lcd_jump_scroll_delay(int ms);
@ -303,17 +312,10 @@ extern void lcd_set_flip(bool yesno);
extern void lcd_set_drawmode(int mode);
extern int lcd_get_drawmode(void);
extern void lcd_setmargins(int xmargin, int ymargin);
extern int lcd_getxmargin(void);
extern int lcd_getymargin(void);
extern void lcd_setfont(int font);
extern int lcd_getstringsize(const unsigned char *str, int *w, int *h);
extern void lcd_puts_offset(int x, int y, const unsigned char *str, int offset);
extern void lcd_puts_style_offset(int x, int y, const unsigned char *str,
int style, int offset);
extern void lcd_puts_scroll_offset(int x, int y, const unsigned char *string,
int offset);
extern void lcd_puts_scroll_style_offset(int x, int y, const unsigned char *string,
int style, int offset);
@ -338,10 +340,8 @@ extern void lcd_bitmap_part(const fb_data *src, int src_x, int src_y,
int stride, int x, int y, int width, int height);
extern void lcd_bitmap(const fb_data *src, int x, int y, int width,
int height);
extern void lcd_putsxy(int x, int y, const unsigned char *string);
extern void lcd_invertscroll(int x, int y);
extern void lcd_bidir_scroll(int threshold);
extern void lcd_scroll_step(int pixels);
#if LCD_DEPTH > 1
@ -380,36 +380,25 @@ extern void lcd_bitmap_transparent(const fb_data *src, int x, int y,
#endif /* HAVE_LCD_BITMAP */
/* internal usage, but in multiple drivers */
#define SCROLL_SPACING 3
#ifdef HAVE_LCD_BITMAP
#define SCROLL_SPACING 3
#define SCROLL_LINE_SIZE (MAX_PATH + LCD_WIDTH/2 + SCROLL_SPACING + 2)
#define SCROLL_LINE_SIZE (MAX_PATH + LCD_WIDTH/2 + SCROLL_SPACING + 2)
#else
#define SCROLL_LINE_SIZE (MAX_PATH + LCD_WIDTH + SCROLL_SPACING + 2)
#endif
struct scrollinfo {
char line[SCROLL_LINE_SIZE];
int len; /* length of line in chars */
int width; /* length of line in pixels */
int offset;
int startx;
#ifdef HAVE_LCD_BITMAP
int width; /* length of line in pixels */
bool invert; /* invert the scrolled text */
#endif
bool backward; /* scroll presently forward or backward? */
bool bidir;
bool invert; /* invert the scrolled text */
long start_tick;
};
#else /* !HAVE_LCD_BITMAP */
struct scrollinfo {
int mode;
char text[MAX_PATH];
int textlen;
int offset;
int turn_offset;
int startx;
int starty;
long scroll_start_tick;
int direction; /* +1 for right or -1 for left*/
int jump_scroll;
int jump_scroll_steps;
};
#endif
#endif /* __LCD_H__ */

View file

@ -0,0 +1,235 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id: lcd-player.c 12835 2007-03-18 17:58:49Z amiconn $
*
* Copyright (C) 2007 by Jens Arnold
* Based on the work of Alan Korr, Kjell Ericson and others
*
* All files in this archive are subject to the GNU General Public License.
* See the file COPYING in the source tree root for full license agreement.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include "config.h"
#include <string.h>
#include "hwcompat.h"
#include "system.h"
#include "lcd.h"
#define OLD_LCD_CRAM ((char)0xB0) /* Characters */
#define OLD_LCD_PRAM ((char)0x80) /* Patterns */
#define OLD_LCD_IRAM ((char)0xE0) /* Icons */
#define OLD_LCD_CONTRAST_SET ((char)0xA8)
#define NEW_LCD_CRAM ((char)0x80) /* Characters */
#define NEW_LCD_PRAM ((char)0xC0) /* Patterns */
#define NEW_LCD_IRAM ((char)0x40) /* Icons */
#define NEW_LCD_CONTRAST_SET ((char)0x50)
#define NEW_LCD_FUNCTION_SET ((char)0x10)
#define NEW_LCD_POWER_SAVE_MODE_OSC_CONTROL_SET ((char)0x0c)
#define NEW_LCD_POWER_CONTROL_REGISTER_SET ((char)0x20)
#define NEW_LCD_DISPLAY_CONTROL_SET ((char)0x28)
#define NEW_LCD_SET_DOUBLE_HEIGHT ((char)0x08)
#define LCD_CURSOR(x,y) ((char)(lcd_cram+((y)*16+(x))))
#define LCD_ICON(i) ((char)(lcd_iram+i))
static bool new_lcd;
static char lcd_contrast_set;
static char lcd_cram;
static char lcd_pram;
static char lcd_iram;
/* hardware configuration */
int lcd_default_contrast(void)
{
return 30;
}
void lcd_set_contrast(int val)
{
lcd_write_command_e(lcd_contrast_set, 31 - val);
}
/* charcell specific */
void lcd_double_height(bool on)
{
if(new_lcd)
lcd_write_command(on ? (NEW_LCD_SET_DOUBLE_HEIGHT|1)
: NEW_LCD_SET_DOUBLE_HEIGHT);
}
void lcd_put_hw_char(int x, int y, unsigned char hw_char)
{
lcd_write_command_e(LCD_CURSOR(x, y), hw_char);
}
void lcd_define_hw_pattern (int which, const char *pattern)
{
lcd_write_command(lcd_pram | (which << 3));
lcd_write_data(pattern, 7);
}
void lcd_icon(int icon, bool enable)
{
static const struct {
char pos;
char mask;
} icontab[] = {
{ 0, 0x02}, { 0, 0x08}, { 0, 0x04}, { 0, 0x10}, /* Battery */
{ 2, 0x04}, /* USB */
{ 3, 0x10}, /* Play */
{ 4, 0x10}, /* Record */
{ 5, 0x02}, /* Pause */
{ 5, 0x10}, /* Audio */
{ 6, 0x02}, /* Repeat */
{ 7, 0x01}, /* 1 */
{ 9, 0x04}, /* Volume */
{ 9, 0x02}, { 9, 0x01}, {10, 0x08}, {10, 0x04}, {10, 0x01}, /* Vol 1-5 */
{10, 0x10}, /* Param */
};
static char icon_mirror[11] = {0};
int pos, mask;
pos = icontab[icon].pos;
mask = icontab[icon].mask;
if (enable)
icon_mirror[pos] |= mask;
else
icon_mirror[pos] &= ~mask;
lcd_write_command_e(LCD_ICON(pos), icon_mirror[pos]);
}
/* device specific init */
void lcd_init_device(void)
{
unsigned char data_vector[64];
new_lcd = is_new_player();
if (new_lcd)
{
lcd_contrast_set = NEW_LCD_CONTRAST_SET;
lcd_cram = NEW_LCD_CRAM;
lcd_pram = NEW_LCD_PRAM;
lcd_iram = NEW_LCD_IRAM;
/* LCD init for cold start */
PBCR2 &= 0xff00; /* Set PB0..PB3 to GPIO */
or_b(0x0f, &PBDRL); /* ... high */
or_b(0x0f, &PBIORL); /* ... and output */
lcd_write_command(NEW_LCD_FUNCTION_SET + 1); /* CGRAM selected */
lcd_write_command_e(NEW_LCD_CONTRAST_SET, 0x08);
lcd_write_command(NEW_LCD_POWER_SAVE_MODE_OSC_CONTROL_SET + 2);
/* oscillator on */
lcd_write_command(NEW_LCD_POWER_CONTROL_REGISTER_SET + 7);
/* opamp buffer + voltage booster on*/
memset(data_vector, 0x20, 64);
lcd_write_command(NEW_LCD_CRAM); /* Set DDRAM address */
lcd_write_data(data_vector, 64); /* all spaces */
memset(data_vector, 0, 64);
lcd_write_command(NEW_LCD_PRAM); /* Set CGRAM address */
lcd_write_data(data_vector, 64); /* zero out */
lcd_write_command(NEW_LCD_IRAM); /* Set ICONRAM address */
lcd_write_data(data_vector, 16); /* zero out */
lcd_write_command(NEW_LCD_DISPLAY_CONTROL_SET + 1); /* display on */
}
else
{
lcd_contrast_set = OLD_LCD_CONTRAST_SET;
lcd_cram = OLD_LCD_CRAM;
lcd_pram = OLD_LCD_PRAM;
lcd_iram = OLD_LCD_IRAM;
#if 1
/* LCD init for cold start */
PBCR2 &= 0xff00; /* Set PB0..PB3 to GPIO */
or_b(0x0f, &PBDRL); /* ... high */
or_b(0x0f, &PBIORL); /* ... and output */
lcd_write_command(0x61);
lcd_write_command(0x42);
lcd_write_command(0x57);
memset(data_vector, 0x24, 13);
lcd_write_command(OLD_LCD_CRAM); /* Set DDRAM address */
lcd_write_data(data_vector, 13); /* all spaces */
lcd_write_command(OLD_LCD_CRAM + 0x10);
lcd_write_data(data_vector, 13);
lcd_write_command(OLD_LCD_CRAM + 0x20);
lcd_write_data(data_vector, 13);
memset(data_vector, 0, 32);
lcd_write_command(OLD_LCD_PRAM); /* Set CGRAM address */
lcd_write_data(data_vector, 32); /* zero out */
lcd_write_command(OLD_LCD_IRAM); /* Set ICONRAM address */
lcd_write_data(data_vector, 13); /* zero out */
lcd_write_command(OLD_LCD_IRAM + 0x10);
lcd_write_data(data_vector, 13);
lcd_write_command(0x31);
#else
/* archos look-alike code, left here for reference. As soon as the
* rockbox version is confirmed working, this will go away */
{
int i;
PBCR2 &= 0xc000;
PBIOR |= 0x000f;
PBDR |= 0x0002;
PBDR |= 0x0001;
PBDR |= 0x0004;
PBDR |= 0x0008;
for (i=0; i<200; i++) asm volatile ("nop"); /* wait 100 us */
PBDR &= 0xfffd; /* CS low (assert) */
for (i=0; i<100; i++) asm volatile ("nop"); /* wait 50 us */
lcd_write_command(0x61);
lcd_write_command(0x42);
lcd_write_command(0x57);
memset(data_vector, 0x24, 13);
lcd_write_command(0xb0); /* Set DDRAM address */
lcd_write_data(data_vector, 13); /* all spaces */
lcd_write_command(0xc0);
lcd_write_data(data_vector, 13);
lcd_write_command(0xd0);
lcd_write_data(data_vector, 13);
memset(data_vector, 0, 32);
lcd_write_command(0x80); /* Set CGRAM address */
lcd_write_data(data_vector, 32); /* zero out */
lcd_write_command(0xe0); /* Set ICONRAM address */
lcd_write_data(data_vector, 13); /* zero out */
lcd_write_command(0xf0);
lcd_write_data(data_vector, 13);
for (i=0; i<300000; i++) asm volatile ("nop"); /* wait 150 ms */
lcd_write_command(0x31);
lcd_write_command_e(0xa8, 0); /* Set contrast control */
}
#endif
}
lcd_set_contrast(lcd_default_contrast());
}

2
tools/configure vendored
View file

@ -661,7 +661,7 @@ EOF
# toolset is the tools within the tools directory that we build for
# this particular target.
toolset="$toolset scramble descramble sh2d generate_rocklatin uclpack"
toolset="$toolset scramble descramble sh2d uclpack"
# Note: the convbdf is present in the toolset just because: 1) the
# firmware/Makefile assumes it is present always, and 2) we will need it when we

View file

@ -51,8 +51,8 @@ void lcd_print_icon(int x, int icon_line, bool enable, char **icon)
int row=0, col;
int p=0, cp=0;
struct coordinate points[LCD_WIDTH * LCD_HEIGHT];
struct coordinate clearpoints[LCD_WIDTH * LCD_HEIGHT];
struct coordinate points[SIM_LCD_WIDTH * SIM_LCD_HEIGHT];
struct coordinate clearpoints[SIM_LCD_WIDTH * SIM_LCD_HEIGHT];
while (icon[row]) {
col=0;
@ -221,16 +221,15 @@ void lcd_double_height(bool on)
lcd_update();
}
void lcd_define_hw_pattern(int which, const char *pattern, int length)
void lcd_define_hw_pattern(int pat, const char *pattern)
{
int i, j;
int pat = which / 8;
unsigned char icon[8];
memset(icon, 0, sizeof icon);
DEBUGF("Defining pattern %d:", pat);
for (j = 0; j <= 5; j++) {
for (i = 0; i < length; i++) {
for (i = 0; i < 7; i++) {
if ((pattern[i])&(1<<(j)))
icon[5-j] |= (1<<(i));
}

View file

@ -132,8 +132,10 @@ void sim_backlight(int value)
/* initialise simulator lcd driver */
void sim_lcd_init(void)
{
lcd_surface = SDL_CreateRGBSurface(SDL_SWSURFACE, LCD_WIDTH * display_zoom,
LCD_HEIGHT * display_zoom, 8, 0, 0, 0, 0);
lcd_surface = SDL_CreateRGBSurface(SDL_SWSURFACE,
SIM_LCD_WIDTH * display_zoom,
SIM_LCD_HEIGHT * display_zoom,
8, 0, 0, 0, 0);
sdl_set_gradient(lcd_surface, &lcd_backlight_color_zero, &lcd_color_max,
0, (1<<LCD_DEPTH));
@ -142,10 +144,10 @@ void sim_lcd_init(void)
#define BMP_COMPRESSION 0 /* BI_RGB */
#define BMP_NUMCOLORS (1 << LCD_DEPTH)
#define BMP_BPP 1
#define BMP_LINESIZE (((LCD_WIDTH + 31) / 32) * 4)
#define BMP_LINESIZE (((SIM_LCD_WIDTH + 31) / 32) * 4)
#define BMP_HEADERSIZE (54 + 4 * BMP_NUMCOLORS)
#define BMP_DATASIZE (BMP_LINESIZE * LCD_HEIGHT)
#define BMP_DATASIZE (BMP_LINESIZE * SIM_LCD_HEIGHT)
#define BMP_TOTALSIZE (BMP_HEADERSIZE + BMP_DATASIZE)
#define LE16_CONST(x) (x)&0xff, ((x)>>8)&0xff
@ -159,8 +161,8 @@ static const unsigned char bmpheader[] =
LE32_CONST(BMP_HEADERSIZE), /* Offset to start of pixel data */
0x28, 0x00, 0x00, 0x00, /* Size of (2nd) header */
LE32_CONST(LCD_WIDTH), /* Width in pixels */
LE32_CONST(LCD_HEIGHT), /* Height in pixels */
LE32_CONST(SIM_LCD_WIDTH), /* Width in pixels */
LE32_CONST(SIM_LCD_HEIGHT), /* Height in pixels */
0x01, 0x00, /* Number of planes (always 1) */
LE16_CONST(BMP_BPP), /* Bits per pixel 1/4/8/16/24 */
LE32_CONST(BMP_COMPRESSION),/* Compression mode */
@ -193,15 +195,15 @@ void screen_dump(void)
SDL_LockSurface(lcd_surface);
/* BMP image goes bottom up */
for (y = LCD_HEIGHT - 1; y >= 0; y--)
for (y = SIM_LCD_HEIGHT - 1; y >= 0; y--)
{
Uint8 *src = (Uint8 *)lcd_surface->pixels
+ y * LCD_WIDTH * display_zoom * display_zoom;
+ y * SIM_LCD_WIDTH * display_zoom * display_zoom;
unsigned char *dst = line;
unsigned dst_mask = 0x80;
memset(line, 0, sizeof(line));
for (x = LCD_WIDTH; x > 0; x--)
for (x = SIM_LCD_WIDTH; x > 0; x--)
{
if (*src)
*dst |= dst_mask;