Hello,
Firstly; great forum. and soz for pulling up old threads on my first post.
Thanks to cex and whoever dumped the FLASH, this info helped me the most. I had one of the early UK t68i's. 2001/2 its an R5 0x70 and was a horrible phone. no need to review it here but safe to say the first software was a wrong'un.
Here's a little library I wrote firstly for the 1.8" SPI TFTs on ebay that are £4-ish. Semi translated enough to print text and circles from a PIC or similar "thou shalt not be named wee noe" for the 68i 0x70 version only, but useful for someone wanting the nokia font 5x7
You could speed it up by setting the address window (not a window on this chip but a start point) to be one line of text;spam into a buffer;then dump all at once. I haven't yet optimised, still using ints when chars are possible and I probably use I2C1_Stop(); a few times when not needed.
Right- sorry for the mess, I did remove about 1000 lines of chuff before posting, and its time to sleep. There's only really a few things to change if you use a C compiler, the method of I2c that's located in drawpixel() lcd_initial() setAddrWindow() define or change the constants for width height (for line wrap and pixel rejection) hope this helps someone > someone helped me
Oh - i also screwed my backlight because I forgot there were 2 on 1 resistor. So replaced with some out of a d900i. looks nicer. I cant believe how on the edge the phone must have been driving the originals to achieve the brightness it had
Many thanks,
eek
Oh this might help someone too. RGB to 3:3:2. It's not great, i'm new at C
Code:
rred = 255; ggreen = 255; bblue = 255;
colour_char = ( ((rred >> 5) << 5) | ((ggreen >> 5) << 2) | (bblue >> 6)) ;
Code:
//Bodge from 1.8 SPI to t68i I2C
//define these in main code
//#define WIDTH 100
//#define HEIGHT 80
//#include <t68i_tftlib.h>
//you may need to make your own delay_ms function. _reset pin is held high
//example usage
// drawString( 0, 0, "hello", 1, 0, 1);
// drawString( 0, 10, "t68i blah blah blah. my library is messy as a badger", 1, 0, 1);
// DrawCircle(30, 70, 16, 128, 1);
// DrawCircle(40, 70, 16, 128, 1);
// DrawCircle(50, 70, 16, 128, 1);
const unsigned char font[] = { //5x7 map
0x00, 0x00, 0x00, 0x00, 0x00,
0x3E, 0x5B, 0x4F, 0x5B, 0x3E,
0x3E, 0x6B, 0x4F, 0x6B, 0x3E,
0x1C, 0x3E, 0x7C, 0x3E, 0x1C,
0x18, 0x3C, 0x7E, 0x3C, 0x18,
0x1C, 0x57, 0x7D, 0x57, 0x1C,
0x1C, 0x5E, 0x7F, 0x5E, 0x1C,
0x00, 0x18, 0x3C, 0x18, 0x00,
0xFF, 0xE7, 0xC3, 0xE7, 0xFF,
0x00, 0x18, 0x24, 0x18, 0x00,
0xFF, 0xE7, 0xDB, 0xE7, 0xFF,
0x30, 0x48, 0x3A, 0x06, 0x0E,
0x26, 0x29, 0x79, 0x29, 0x26,
0x40, 0x7F, 0x05, 0x05, 0x07,
0x40, 0x7F, 0x05, 0x25, 0x3F,
0x5A, 0x3C, 0xE7, 0x3C, 0x5A,
0x7F, 0x3E, 0x1C, 0x1C, 0x08,
0x08, 0x1C, 0x1C, 0x3E, 0x7F,
0x14, 0x22, 0x7F, 0x22, 0x14,
0x5F, 0x5F, 0x00, 0x5F, 0x5F,
0x06, 0x09, 0x7F, 0x01, 0x7F,
0x00, 0x66, 0x89, 0x95, 0x6A,
0x60, 0x60, 0x60, 0x60, 0x60,
0x94, 0xA2, 0xFF, 0xA2, 0x94,
0x08, 0x04, 0x7E, 0x04, 0x08,
0x10, 0x20, 0x7E, 0x20, 0x10,
0x08, 0x08, 0x2A, 0x1C, 0x08,
0x08, 0x1C, 0x2A, 0x08, 0x08,
0x1E, 0x10, 0x10, 0x10, 0x10,
0x0C, 0x1E, 0x0C, 0x1E, 0x0C,
0x30, 0x38, 0x3E, 0x38, 0x30,
0x06, 0x0E, 0x3E, 0x0E, 0x06,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x5F, 0x00, 0x00,
0x00, 0x07, 0x00, 0x07, 0x00,
0x14, 0x7F, 0x14, 0x7F, 0x14,
0x24, 0x2A, 0x7F, 0x2A, 0x12,
0x23, 0x13, 0x08, 0x64, 0x62,
0x36, 0x49, 0x56, 0x20, 0x50,
0x00, 0x08, 0x07, 0x03, 0x00,
0x00, 0x1C, 0x22, 0x41, 0x00,
0x00, 0x41, 0x22, 0x1C, 0x00,
0x2A, 0x1C, 0x7F, 0x1C, 0x2A,
0x08, 0x08, 0x3E, 0x08, 0x08,
0x00, 0x80, 0x70, 0x30, 0x00,
0x08, 0x08, 0x08, 0x08, 0x08,
0x00, 0x00, 0x60, 0x60, 0x00,
0x20, 0x10, 0x08, 0x04, 0x02,
0x3E, 0x51, 0x49, 0x45, 0x3E,
0x00, 0x42, 0x7F, 0x40, 0x00,
0x72, 0x49, 0x49, 0x49, 0x46,
0x21, 0x41, 0x49, 0x4D, 0x33,
0x18, 0x14, 0x12, 0x7F, 0x10,
0x27, 0x45, 0x45, 0x45, 0x39,
0x3C, 0x4A, 0x49, 0x49, 0x31,
0x41, 0x21, 0x11, 0x09, 0x07,
0x36, 0x49, 0x49, 0x49, 0x36,
0x46, 0x49, 0x49, 0x29, 0x1E,
0x00, 0x00, 0x14, 0x00, 0x00,
0x00, 0x40, 0x34, 0x00, 0x00,
0x00, 0x08, 0x14, 0x22, 0x41,
0x14, 0x14, 0x14, 0x14, 0x14,
0x00, 0x41, 0x22, 0x14, 0x08,
0x02, 0x01, 0x59, 0x09, 0x06,
0x3E, 0x41, 0x5D, 0x59, 0x4E,
0x7C, 0x12, 0x11, 0x12, 0x7C,
0x7F, 0x49, 0x49, 0x49, 0x36,
0x3E, 0x41, 0x41, 0x41, 0x22,
0x7F, 0x41, 0x41, 0x41, 0x3E,
0x7F, 0x49, 0x49, 0x49, 0x41,
0x7F, 0x09, 0x09, 0x09, 0x01,
0x3E, 0x41, 0x41, 0x51, 0x73,
0x7F, 0x08, 0x08, 0x08, 0x7F,
0x00, 0x41, 0x7F, 0x41, 0x00,
0x20, 0x40, 0x41, 0x3F, 0x01,
0x7F, 0x08, 0x14, 0x22, 0x41,
0x7F, 0x40, 0x40, 0x40, 0x40,
0x7F, 0x02, 0x1C, 0x02, 0x7F,
0x7F, 0x04, 0x08, 0x10, 0x7F,
0x3E, 0x41, 0x41, 0x41, 0x3E,
0x7F, 0x09, 0x09, 0x09, 0x06,
0x3E, 0x41, 0x51, 0x21, 0x5E,
0x7F, 0x09, 0x19, 0x29, 0x46,
0x26, 0x49, 0x49, 0x49, 0x32,
0x03, 0x01, 0x7F, 0x01, 0x03,
0x3F, 0x40, 0x40, 0x40, 0x3F,
0x1F, 0x20, 0x40, 0x20, 0x1F,
0x3F, 0x40, 0x38, 0x40, 0x3F,
0x63, 0x14, 0x08, 0x14, 0x63,
0x03, 0x04, 0x78, 0x04, 0x03,
0x61, 0x59, 0x49, 0x4D, 0x43,
0x00, 0x7F, 0x41, 0x41, 0x41,
0x02, 0x04, 0x08, 0x10, 0x20,
0x00, 0x41, 0x41, 0x41, 0x7F,
0x04, 0x02, 0x01, 0x02, 0x04,
0x40, 0x40, 0x40, 0x40, 0x40,
0x00, 0x03, 0x07, 0x08, 0x00,
0x20, 0x54, 0x54, 0x78, 0x40,
0x7F, 0x28, 0x44, 0x44, 0x38,
0x38, 0x44, 0x44, 0x44, 0x28,
0x38, 0x44, 0x44, 0x28, 0x7F,
0x38, 0x54, 0x54, 0x54, 0x18,
0x00, 0x08, 0x7E, 0x09, 0x02,
0x18, 0xA4, 0xA4, 0x9C, 0x78,
0x7F, 0x08, 0x04, 0x04, 0x78,
0x00, 0x44, 0x7D, 0x40, 0x00,
0x20, 0x40, 0x40, 0x3D, 0x00,
0x7F, 0x10, 0x28, 0x44, 0x00,
0x00, 0x41, 0x7F, 0x40, 0x00,
0x7C, 0x04, 0x78, 0x04, 0x78,
0x7C, 0x08, 0x04, 0x04, 0x78,
0x38, 0x44, 0x44, 0x44, 0x38,
0xFC, 0x18, 0x24, 0x24, 0x18,
0x18, 0x24, 0x24, 0x18, 0xFC,
0x7C, 0x08, 0x04, 0x04, 0x08,
0x48, 0x54, 0x54, 0x54, 0x24,
0x04, 0x04, 0x3F, 0x44, 0x24,
0x3C, 0x40, 0x40, 0x20, 0x7C,
0x1C, 0x20, 0x40, 0x20, 0x1C,
0x3C, 0x40, 0x30, 0x40, 0x3C,
0x44, 0x28, 0x10, 0x28, 0x44,
0x4C, 0x90, 0x90, 0x90, 0x7C,
0x44, 0x64, 0x54, 0x4C, 0x44,
0x00, 0x08, 0x36, 0x41, 0x00,
0x00, 0x00, 0x77, 0x00, 0x00,
0x00, 0x41, 0x36, 0x08, 0x00,
0x02, 0x01, 0x02, 0x04, 0x02,
0x3C, 0x26, 0x23, 0x26, 0x3C,
0x1E, 0xA1, 0xA1, 0x61, 0x12,
0x3A, 0x40, 0x40, 0x20, 0x7A,
0x38, 0x54, 0x54, 0x55, 0x59,
0x21, 0x55, 0x55, 0x79, 0x41,
0x21, 0x54, 0x54, 0x78, 0x41,
0x21, 0x55, 0x54, 0x78, 0x40,
0x20, 0x54, 0x55, 0x79, 0x40,
0x0C, 0x1E, 0x52, 0x72, 0x12,
0x39, 0x55, 0x55, 0x55, 0x59,
0x39, 0x54, 0x54, 0x54, 0x59,
0x39, 0x55, 0x54, 0x54, 0x58,
0x00, 0x00, 0x45, 0x7C, 0x41,
0x00, 0x02, 0x45, 0x7D, 0x42,
0x00, 0x01, 0x45, 0x7C, 0x40,
0xF0, 0x29, 0x24, 0x29, 0xF0,
0xF0, 0x28, 0x25, 0x28, 0xF0,
0x7C, 0x54, 0x55, 0x45, 0x00,
0x20, 0x54, 0x54, 0x7C, 0x54,
0x7C, 0x0A, 0x09, 0x7F, 0x49,
0x32, 0x49, 0x49, 0x49, 0x32,
0x32, 0x48, 0x48, 0x48, 0x32,
0x32, 0x4A, 0x48, 0x48, 0x30,
0x3A, 0x41, 0x41, 0x21, 0x7A,
0x3A, 0x42, 0x40, 0x20, 0x78,
0x00, 0x9D, 0xA0, 0xA0, 0x7D,
0x39, 0x44, 0x44, 0x44, 0x39,
0x3D, 0x40, 0x40, 0x40, 0x3D,
0x3C, 0x24, 0xFF, 0x24, 0x24,
0x48, 0x7E, 0x49, 0x43, 0x66,
0x2B, 0x2F, 0xFC, 0x2F, 0x2B,
0xFF, 0x09, 0x29, 0xF6, 0x20,
0xC0, 0x88, 0x7E, 0x09, 0x03,
0x20, 0x54, 0x54, 0x79, 0x41,
0x00, 0x00, 0x44, 0x7D, 0x41,
0x30, 0x48, 0x48, 0x4A, 0x32,
0x38, 0x40, 0x40, 0x22, 0x7A,
0x00, 0x7A, 0x0A, 0x0A, 0x72,
0x7D, 0x0D, 0x19, 0x31, 0x7D,
0x26, 0x29, 0x29, 0x2F, 0x28,
0x26, 0x29, 0x29, 0x29, 0x26,
0x30, 0x48, 0x4D, 0x40, 0x20,
0x38, 0x08, 0x08, 0x08, 0x08,
0x08, 0x08, 0x08, 0x08, 0x38,
0x2F, 0x10, 0xC8, 0xAC, 0xBA,
0x2F, 0x10, 0x28, 0x34, 0xFA,
0x00, 0x00, 0x7B, 0x00, 0x00,
0x08, 0x14, 0x2A, 0x14, 0x22,
0x22, 0x14, 0x2A, 0x14, 0x08,
0xAA, 0x00, 0x55, 0x00, 0xAA,
0xAA, 0x55, 0xAA, 0x55, 0xAA,
0x00, 0x00, 0x00, 0xFF, 0x00,
0x10, 0x10, 0x10, 0xFF, 0x00,
0x14, 0x14, 0x14, 0xFF, 0x00,
0x10, 0x10, 0xFF, 0x00, 0xFF,
0x10, 0x10, 0xF0, 0x10, 0xF0,
0x14, 0x14, 0x14, 0xFC, 0x00,
0x14, 0x14, 0xF7, 0x00, 0xFF,
0x00, 0x00, 0xFF, 0x00, 0xFF,
0x14, 0x14, 0xF4, 0x04, 0xFC,
0x14, 0x14, 0x17, 0x10, 0x1F,
0x10, 0x10, 0x1F, 0x10, 0x1F,
0x14, 0x14, 0x14, 0x1F, 0x00,
0x10, 0x10, 0x10, 0xF0, 0x00,
0x00, 0x00, 0x00, 0x1F, 0x10,
0x10, 0x10, 0x10, 0x1F, 0x10,
0x10, 0x10, 0x10, 0xF0, 0x10,
0x00, 0x00, 0x00, 0xFF, 0x10,
0x10, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0xFF, 0x10,
0x00, 0x00, 0x00, 0xFF, 0x14,
0x00, 0x00, 0xFF, 0x00, 0xFF,
0x00, 0x00, 0x1F, 0x10, 0x17,
0x00, 0x00, 0xFC, 0x04, 0xF4,
0x14, 0x14, 0x17, 0x10, 0x17,
0x14, 0x14, 0xF4, 0x04, 0xF4,
0x00, 0x00, 0xFF, 0x00, 0xF7,
0x14, 0x14, 0x14, 0x14, 0x14,
0x14, 0x14, 0xF7, 0x00, 0xF7,
0x14, 0x14, 0x14, 0x17, 0x14,
0x10, 0x10, 0x1F, 0x10, 0x1F,
0x14, 0x14, 0x14, 0xF4, 0x14,
0x10, 0x10, 0xF0, 0x10, 0xF0,
0x00, 0x00, 0x1F, 0x10, 0x1F,
0x00, 0x00, 0x00, 0x1F, 0x14,
0x00, 0x00, 0x00, 0xFC, 0x14,
0x00, 0x00, 0xF0, 0x10, 0xF0,
0x10, 0x10, 0xFF, 0x10, 0xFF,
0x14, 0x14, 0x14, 0xFF, 0x14,
0x10, 0x10, 0x10, 0x1F, 0x00,
0x00, 0x00, 0x00, 0xF0, 0x10,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
0xFF, 0xFF, 0xFF, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFF, 0xFF,
0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
0x38, 0x44, 0x44, 0x38, 0x44,
0x7C, 0x2A, 0x2A, 0x3E, 0x14,
0x7E, 0x02, 0x02, 0x06, 0x06,
0x02, 0x7E, 0x02, 0x7E, 0x02,
0x63, 0x55, 0x49, 0x41, 0x63,
0x38, 0x44, 0x44, 0x3C, 0x04,
0x40, 0x7E, 0x20, 0x1E, 0x20,
0x06, 0x02, 0x7E, 0x02, 0x02,
0x99, 0xA5, 0xE7, 0xA5, 0x99,
0x1C, 0x2A, 0x49, 0x2A, 0x1C,
0x4C, 0x72, 0x01, 0x72, 0x4C,
0x30, 0x4A, 0x4D, 0x4D, 0x30,
0x30, 0x48, 0x78, 0x48, 0x30,
0xBC, 0x62, 0x5A, 0x46, 0x3D,
0x3E, 0x49, 0x49, 0x49, 0x00,
0x7E, 0x01, 0x01, 0x01, 0x7E,
0x2A, 0x2A, 0x2A, 0x2A, 0x2A,
0x44, 0x44, 0x5F, 0x44, 0x44,
0x40, 0x51, 0x4A, 0x44, 0x40,
0x40, 0x44, 0x4A, 0x51, 0x40,
0x00, 0x00, 0xFF, 0x01, 0x03,
0xE0, 0x80, 0xFF, 0x00, 0x00,
0x08, 0x08, 0x6B, 0x6B, 0x08,
0x36, 0x12, 0x36, 0x24, 0x36,
0x06, 0x0F, 0x09, 0x0F, 0x06,
0x00, 0x00, 0x18, 0x18, 0x00,
0x00, 0x00, 0x10, 0x10, 0x00,
0x30, 0x40, 0xFF, 0x01, 0x01,
0x00, 0x1F, 0x01, 0x01, 0x1E,
0x00, 0x19, 0x1D, 0x17, 0x12,
0x00, 0x3C, 0x3C, 0x3C, 0x3C,
0x00, 0x00, 0x00, 0x00, 0x00,
};
const char initstring[127] = {
0x70,0x03,0x01,0x02,0x00,0x00,0x06,0x01,0x00,0x0E,0x4F,0x0F,0x10,0x10,0x02,0x11,
0x17,0x12,0x25,0x13,0x01,0x15,0x00,0x16,0x1C,0x34,0x2F,0x35,0x73,0x36,0x04,0x37,
0x31,0x38,0x06,0x39,0x2C,0x3A,0x24,0x40,0x08,0x41,0x00,0x42,0x07,0x43,0x08,0x44,
0x09,0x45,0x0A,0x46,0x0B,0x47,0x0D,0x48,0x10,0x49,0x00,0x4A,0x05,0x4B,0x07,0x4C,
0x08,0x4D,0x09,0x4E,0x0A,0x4F,0x0C,0x50,0x10,0x51,0x00,0x52,0x07,0x53,0x09,0x54,
0x10,0x55,0x00,0x56,0x06,0x57,0x07,0x58,0x08,0x59,0x09,0x5A,0x0A,0x5B,0x0B,0x5C,
0x10,0x5D,0x00,0x5E,0x06,0x5F,0x07,0x60,0x08,0x61,0x09,0x62,0x0A,0x63,0x0B,0x64,
0x10,0x65,0x00,0x66,0x07,0x67,0x09,0x68,0x10,0x00,0x02,0x04,0x00,0x05,0x00 };
const unsigned char width = WIDTH;
const unsigned char height = HEIGHT;
void setAddrWindow(char x, char y)
{
I2C1_Start();
I2C1_Wr(0x70); //dev id
I2C1_Wr(0x04); //scanrow_pos x cmd
I2C1_Wr(x); //data x (0x1B offset on 72-74 models only)
I2C1_Wr(0x05); //scanrow_pos y cmd
I2C1_Wr(y); //data
// I2C1_Stop(); //try to remove this
I2C1_Start(); //reissue
I2C1_Wr(0x70);
I2C1_Wr(0x8C);
}
void lcd_initial()
{
char i;
I2C1_Start();
for (i=0;i<127;i++){
I2C1_Wr(initstring[i]);
}
I2C1_Stop();
delay_ms(118);
I2C1_Start(); //power_on
I2C1_Wr(0x70);
I2C1_Wr(0x38);
I2C1_Wr(0x02);
I2C1_Wr(0x00);
I2C1_Wr(0x12);
I2C1_Stop();
delay_ms(118);
I2C1_Start(); //contrast
I2C1_Wr(0x70);
I2C1_Wr(0x39);
I2C1_Wr(175); //value? rom dump says so
I2C1_Stop();
}
void drawPixel(char x, char y, char color) {
if ((x >= width) || (y >= height)) return;
setAddrWindow(x,y);
I2C1_Wr(color);
}
void fillScreen(char color) {
int x = 0;
int y = 0;
setAddrWindow(0, 0); //set ram to whole screen
for (x=0; x < width; x++) {
for (y=0; y < height; y++) {
I2C1_Wr(color);
}
}
}
//void fillRect(char x, char y, char w, char h, unsigned int color) {
//
// setAddrWindow(x, y);
// // setup for data
// cs=0;rs=1;
//
// for (x=0; x < w; x++) {
// for (y=0; y < h; y++) {
// spi1_write(color >> 8);
// spi1_write(color);
// }
// }
// cs=1;
//}
// build character
void drawChar(char x, char y, char c, char color, char colorover, char size) {
unsigned char i =0;
unsigned char line;
unsigned char j = 0;
//c = char in dec i.e " = 22
//if (c == ' ') return;
for (i =0; i<5; i++ ) {
line = font[+(c*5)+i];
for (j = 0; j<8; j++) {
if (line & 0x1) {
if (size == 1) // default size
drawPixel(x+i, y+j, color);
else { // big size
// fillRect(x+i*size, y+j*size, size, size, color);
}
}
else{
// if (colorover > 0){
// if (size == 1) // default size
// drawPixel(x+i, y+j, colorover);
// else { // big size
// fillRect(x+i*size, y+j*size, size, size, colorover);
// }
// }
}
line >>= 1;
}
}
}
// build string with line wrap
void drawString(char x, char y, char c[], char color, char colorover, char size) {
while (c[0] != 0) {
drawChar(x, y, c[0], color, colorover, size);
x += size*6;
c++;
if (x + 5 >= width) {
y += 10;
x = 0;
}
}
}
//void drawVerticalLine(char x, char y, char length, unsigned int color)
//{
// if (x >= width) return;
// if (y+length >= height) length = height-y-1;
//
// drawFastLine(x,y,length,color,1);
//}
//
//
//void drawHorizontalLine(char x, char y, char length, unsigned int color)
//{
// if (y >= height) return;
// if (x+length >= width) length = width-x-1;
//
// drawFastLine(x,y,length,color,0);
//}
//void arc(double rad, int xposd, int yposd){
// int x2;
// int p;
// int y,x;
//
// x2=(rad*0.7071);
// p= (1.25-rad);
// y= rad;
//
// for (x=0; x <=x2; x++) {
// drawpixel(x + xposd , y + yposd, GREEN);
// if(p > 0) {
// y--;
// p = p + (2*(x-y)+5);
// }
// else
// p = p +(2*x+3);
// }
//}
//void line(char x0, char y0, char x1, char y1, unsigned int color,char accuracy){
//
// int dx,dy,sx,sy,err,e2;
//
// dx = abs(x1-x0);
// dy = abs(y1-y0);
//
// if (x0 < x1) { sx = 1;} else {sx = -1;}
// if (y0 < y1) { sy = 1;} else {sy = -1;}
//
// err = dx-dy;
//
// do{
// drawpixel(x0,y0,color);
// if (x0 == x1 || y0 == y1) break;
// e2 = (accuracy * 10)*err;
// if (e2 > -dy){
// err = err - dy;
// x0 = x0 + sx;
// }
// if (e2 < dx) {
// err = err + dx;
// y0 = y0 + sy;
// }
//
// }while(1);
//}
//
void DrawCircle(int x, int y, char r, char color, char density){
static const double PI = 3.1415926535;
double i, angle, x1, y1;
for(i = 0; i < 360; i += density){
angle = i ;
x1 = r * cos(angle * PI / 180);
y1 = r * sin(angle * PI / 180);
drawpixel(x + x1, y + y1, color);
}
}
will post a pic soon
.. soon
http://www.dropbox.com/gallery/36103742/1/t68i?h=5a8024