diff --git a/firmware/l0dable/EXPORTS b/firmware/l0dable/EXPORTS index 6dd540a..75ad3d9 100644 --- a/firmware/l0dable/EXPORTS +++ b/firmware/l0dable/EXPORTS @@ -124,4 +124,4 @@ i2cEngine i2cInit timer32Callback0 lcdRead - +lcdInit diff --git a/firmware/l0dable/debug.c b/firmware/l0dable/debug.c index b57a296..66c7b3f 100644 --- a/firmware/l0dable/debug.c +++ b/firmware/l0dable/debug.c @@ -25,6 +25,7 @@ void Qstatus(void); void getsp(void); void uptime(void); void uuid(void); +void lcdrtest(void); static const struct MENU submenu_debug={ "debug", { { "ChkBattery", &ChkBattery}, @@ -33,6 +34,7 @@ static const struct MENU submenu_debug={ "debug", { { "ChkFunk", &ChkFunk}, { "Qstatus", &Qstatus}, // { "ShowSP", &getsp}, + { "lcdrtest", &lcdrtest}, { "Uptime", &uptime}, { "Uuid", &uuid}, {NULL,NULL} @@ -314,3 +316,18 @@ void ChkFunk(){ while(!getInputRaw())work_queue(); }; +// //# MENU lcdread +void lcdrtest(void){ + lcdClear(); + lcdPrint("ID1:"); lcdPrintInt(lcdRead(128+64+16+8 +2 )); lcdNl(); + lcdPrint("ID2:"); lcdPrintInt(lcdRead(128+64+16+8 +2+1)); lcdNl(); + lcdPrint("ID3:"); lcdPrintInt(lcdRead(128+64+16+8+4 )); lcdNl(); + lcdPrint("ID4:"); lcdPrintInt(lcdRead(128+64+16+8+4 +1)); lcdNl(); + lcdPrint("Tmp:"); lcdPrintInt(lcdRead(128+64+16+8+4+2 )); lcdNl(); + lcdPrint("VM:"); lcdPrintInt(lcdRead(128+64+16+8+4+2+1)); lcdNl(); + // lcd_select(); mylcdWrite(0,128+32+8+4+1); lcd_deselect(); + delayms(10); + lcdInit(); + lcdRefresh(); + while(!getInputRaw())delayms(10); +}; diff --git a/firmware/lcd/display.c b/firmware/lcd/display.c index 76afad1..5824c7c 100644 --- a/firmware/lcd/display.c +++ b/firmware/lcd/display.c @@ -10,9 +10,8 @@ #include "usb/usbmsc.h" -#define DISPLAY_UNKNOWN 0 -#define DISPLAY_N1200 1 -#define DISPLAY_N1600 2 +#define DISPLAY_N1200 0 +#define DISPLAY_N1600 1 /**************************************************************************/ /* Utility routines to manage nokia display */ @@ -128,7 +127,7 @@ uint8_t lcdRead(uint8_t data) void lcdInit(void) { - int id1,id2,id3,id4; + int id; sspInit(0, sspClockPolarity_Low, sspClockPhase_RisingEdge); @@ -144,16 +143,12 @@ void lcdInit(void) { gpioSetValue(RB_LCD_RST, 1); delayms(100); - id1=lcdRead(128+64+16+8 +2 ); // it will screw up everything.. better do it before anything else --the_nihilant - id2=lcdRead(128+64+16+8 +2+1); // .. but after the code above! --the_nihilant - // id3=lcdRead(128+64+16+8+4 ); // id1 and id2 are enough for most screens - // id4=lcdRead(128+64+16+8+4 +1); // id3 and id4 would only use up PRECIOUS SPACE --the_nihilant - - lcd_select(); + id=lcdRead(220); // ID3 - if((id1==69)&&(id2==214))displayType=DISPLAY_N1600; - //if((id1==254)&&(id2==2))displayType=DISPLAY_N1200; - else displayType=DISPLAY_N1200; // unknown displays are treated like N1200s anyway, this saves an if (PRECIOUS SPACE) --the_nihilant + if(id==14) + displayType=DISPLAY_N1600; + else /* ID3 == 48 */ + displayType=DISPLAY_N1200; /* Small Nokia 1200 LCD docs: * clear/ set @@ -168,67 +163,49 @@ void lcdInit(void) { * 0xd0+x black lines from top? (-0xdf?) * */ - if(displayType<=DISPLAY_N1200){ -// lcdWrite(TYPE_CMD,0xE2); -// delayms(5); - uint8_t initseq[] = {0xE2,0xAF, // Display ON - 0xA1, // Mirror-X - 0xA4, 0x2F, 0xB0, 0x10}; - int i = 0; - while(i> 1; - } + while(i> 1; + } } - end: lcd_deselect(); } void lcdFill(char f){ - // using memset saves 4 bytes compared with the loop! memset(lcdBuffer,f,RESX*RESY_B); -/* int x; +#if 0 + int x; for(x=0;x=0 && x=0 && y < RESY) - lcdSetPixel(x, y, f); -}*/ - void lcdSetPixel(char x, char y, bool f){ if (x<0 || x> RESX || y<0 || y > RESY) return; @@ -251,13 +228,15 @@ bool lcdGetPixel(char x, char y){ } -static void _helper_pixel16(uint16_t color){ // putting this here saves a few bytes overall --the_nihilant - lcdWrite(TYPE_DATA,color>>8); - lcdWrite(TYPE_DATA,color&0xFF); +// Color display hepler functions +static void _helper_pixel16(uint16_t color){ + lcdWrite(TYPE_DATA,color>>8); + lcdWrite(TYPE_DATA,color&0xFF); } -static void _helper_hline(uint16_t color){ // same for this --the_nihilant - for(int cx=0;cx<98;cx++) _helper_pixel16(color); +static void _helper_hline(uint16_t color){ + for(int cx=0;cx<98;cx++) + _helper_pixel16(color); } #define THECOLOR_R 0x0 @@ -268,7 +247,7 @@ void lcdDisplay(void) { char byte; lcd_select(); - if(displayType<=DISPLAY_N1200){ + if(displayType==DISPLAY_N1200){ lcdWrite(TYPE_CMD,0xB0); lcdWrite(TYPE_CMD,0x10); lcdWrite(TYPE_CMD,0x00); @@ -286,8 +265,7 @@ void lcdDisplay(void) { lcdWrite(TYPE_DATA,byte); } } - goto end; - }/*else if(displayType==DISPLAY_N1600)*/{ + } else { /* displayType==DISPLAY_N1600 */ unsigned char r=THECOLOR_R,g=THECOLOR_G,b=THECOLOR_B; unsigned char br=0xFF, bg=0xFF, bb=0xFF; unsigned char frame_r=0x00, frame_g=0x00, frame_b=0x80; @@ -326,9 +304,9 @@ void lcdDisplay(void) { //bottom line of the frame _helper_hline(framecolor); } - end: lcd_deselect(); } + void lcdRefresh() __attribute__ ((weak, alias ("lcdDisplay"))); inline void lcdInvert(void) { @@ -337,32 +315,23 @@ inline void lcdInvert(void) { void lcdSetContrast(int c) { lcd_select(); - if(displayType<=DISPLAY_N1200){ - c+=0x80; - if(c>0x9F) goto end; - lcdWrite(TYPE_CMD,c); - goto end; - }/*else if(displayType==DISPLAY_N1600)*/{ - if(c>=0x40) goto end; - lcdWrite(TYPE_CMD,0x25); - lcdWrite(TYPE_DATA,4*c); + if(displayType==DISPLAY_N1200){ + if(c<0x1F) + lcdWrite(TYPE_CMD,0x80+c); + }else{ /* displayType==DISPLAY_N1600 */ + if(c<0x40) { + lcdWrite(TYPE_CMD,0x25); + lcdWrite(TYPE_DATA,4*c); + }; } -end: lcd_deselect(); }; void lcdSetInvert(int c) { - /* if it's just to force c to be either 0 or 1, it can be done more efficiently --the_nihilant - if(c>1) - c=1; - if(c<0) - c=1; - */ - c=(c&1)+0xa6; // like this --the_nihilant lcd_select(); -// if(displayType<=DISPLAY_N1200){ // it doesn't harm N1600 displays, does nothing. The if, on the other hand, uses PRECIOUS SPACE --the_nihilant - lcdWrite(TYPE_CMD,c); -// } + /* it doesn't harm N1600, save space */ +// if(displayType==DISPLAY_N1200) + lcdWrite(TYPE_CMD,(c&1)+0xa6); lcd_deselect(); }; @@ -374,7 +343,6 @@ void __attribute__((__deprecated__)) lcdToggleFlag(int flag) { GLOBAL(lcdinvert)=!GLOBAL(lcdinvert); } - void lcdShiftH(bool right, bool wrap) { uint8_t tmp; for (int yb = 0; yb> 1) | ((tmp[x]<<3)&8); } - } } @@ -447,7 +414,7 @@ void lcdShift(int x, int y, bool wrap) { }; while(x-->0) - lcdShiftH(dir, wrap); + lcdShiftH(dir, wrap); if(y<0){ dir=false; @@ -462,6 +429,6 @@ void lcdShift(int x, int y, bool wrap) { }; while(y-->0) - lcdShiftV(dir, wrap); + lcdShiftV(dir, wrap); }