Nano2G LCD init

From freemyipod
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

This is some example code for initializing the Nano 2G's LCD:

static void lcd_send_cmd(uint32_t cmd) __attribute__((naked, noinline));
static void lcd_send_cmd(uint32_t cmd)
{
    (void)cmd;
    asm volatile(
        "mov r2, #0x38000000   \n\t"
        "orr r2, r2, #0x600000 \n\t"
        "lsc_wait:             \n\t"
        "ldrh r1, [r2,#0x1c]   \n\t"
        "tst r1, #0x10         \n\t"
        "bne lsc_wait          \n\t"
        "strh r0, [r2,#0x4]    \n\t"
        "mov pc, lr            \n\t"
    );
}

static void lcd_7_send_data(uint32_t data) __attribute__((naked, noinline));
static void lcd_7_send_data(uint32_t data)
{
    (void)data;
    asm volatile(
        "mov r2, #0x38000000   \n\t"
        "orr r2, r2, #0x600000 \n\t"
        "and r0, r0, #0xff     \n\t"
        "strh r0, [r2,#0x40]   \n\t"
        "ls7d_wait:            \n\t"
        "ldrh r1, [r2,#0x1c]   \n\t"
        "tst r1, #0x10         \n\t"
        "bne ls7d_wait         \n\t"
        "mov pc, lr            \n\t"
    );
}

static void lcd_delay(uint32_t time) __attribute__((naked, noinline));
static void lcd_delay(uint32_t time)
{
    (void)time;
    asm volatile(
        "mov r0, r0,lsl#16      \n\t"
        "ld_wait:              \n\t"
        "subs r0, r0, #1       \n\t"
        "bne ld_wait           \n\t"
        "mov pc, lr            \n\t"
    );
}

#define LCD_RST_TIME *((volatile uint32_t*)(0x38600024))
#define LCD_DRV_RST  *((volatile uint32_t*)(0x38600028))

void main(void)
{
    LCD_RST_TIME = 0x7FFF;
    LCD_DRV_RST = 0;
    lcd_delay(1);
    LCD_DRV_RST = 1;
    lcd_delay(5);

    lcd_send_cmd(0x01);
    lcd_7_send_data(0x00);

    lcd_delay(10);

    lcd_send_cmd(0xB1);
    lcd_7_send_data(0x16);
    lcd_7_send_data(0x03);
 
    lcd_send_cmd(0xB2);
    lcd_7_send_data(0x17);
    lcd_7_send_data(0x03);

    lcd_send_cmd(0xB4);
    lcd_7_send_data(0x00);

    lcd_send_cmd(0xB6);
    lcd_7_send_data(0x01);

    lcd_send_cmd(0xB7);
    lcd_7_send_data(0x00);
    lcd_7_send_data(0x00);
    lcd_7_send_data(0x02);
    lcd_7_send_data(0x00);
    lcd_7_send_data(0x06);
    lcd_7_send_data(0x26);
    lcd_7_send_data(0x2D);
    lcd_7_send_data(0x27);
    lcd_7_send_data(0x55);
    lcd_7_send_data(0x27);

    lcd_send_cmd(0xB8);
    lcd_7_send_data(0x10);

    lcd_send_cmd(0xB9);
    lcd_7_send_data(0x52);
    lcd_7_send_data(0x12);
    lcd_7_send_data(0x03);

    lcd_send_cmd(0xC0);
    lcd_7_send_data(0x0A);
    lcd_7_send_data(0x10);
    lcd_7_send_data(0x10);

    lcd_send_cmd(0xC2);
    lcd_7_send_data(0x14);
    lcd_7_send_data(0x23);

    lcd_send_cmd(0xC3);
    lcd_7_send_data(0x12);
    lcd_7_send_data(0x23);

    lcd_send_cmd(0xC6);
    lcd_7_send_data(0x48);

    lcd_send_cmd(0xE0);
    lcd_7_send_data(0x20);
    lcd_7_send_data(0x71);
    lcd_7_send_data(0x17);
    lcd_7_send_data(0x09);
    lcd_7_send_data(0x70);
    lcd_7_send_data(0x0C);
    lcd_7_send_data(0x13);
    lcd_7_send_data(0x25);

    lcd_send_cmd(0xE1);
    lcd_7_send_data(0x37);
    lcd_7_send_data(0x00);
    lcd_7_send_data(0x63);
    lcd_7_send_data(0x11);
    lcd_7_send_data(0xD9);
    lcd_7_send_data(0x00);
    lcd_7_send_data(0x12);
    lcd_7_send_data(0x01);

    lcd_send_cmd(0xE2);
    lcd_7_send_data(0x42);
    lcd_7_send_data(0x42);
    lcd_7_send_data(0x60);
    lcd_7_send_data(0x08);
    lcd_7_send_data(0xB4);
    lcd_7_send_data(0x07);
    lcd_7_send_data(0x0E);
    lcd_7_send_data(0x90);

    lcd_send_cmd(0xE3);
    lcd_7_send_data(0x47);
    lcd_7_send_data(0x60);
    lcd_7_send_data(0x66);
    lcd_7_send_data(0x09);
    lcd_7_send_data(0x6A);
    lcd_7_send_data(0x02);
    lcd_7_send_data(0x0E);
    lcd_7_send_data(0x09);

    lcd_send_cmd(0xE4);
    lcd_7_send_data(0x11);
    lcd_7_send_data(0x40);
    lcd_7_send_data(0x03);
    lcd_7_send_data(0x0A);
    lcd_7_send_data(0xC1);
    lcd_7_send_data(0x0D);
    lcd_7_send_data(0x17);
    lcd_7_send_data(0x30);

    lcd_send_cmd(0xE5);
    lcd_7_send_data(0x00);
    lcd_7_send_data(0x30);
    lcd_7_send_data(0x77);
    lcd_7_send_data(0x1C);
    lcd_7_send_data(0xFB);
    lcd_7_send_data(0x00);
    lcd_7_send_data(0x13);
    lcd_7_send_data(0x07);

    lcd_send_cmd(0xE6);
    lcd_7_send_data(0x01);

    lcd_send_cmd(0x35);
    lcd_7_send_data(0x00);

    lcd_send_cmd(0x36);
    lcd_7_send_data(0x00);

    lcd_send_cmd(0xF2);
    lcd_7_send_data(0x40);

    lcd_send_cmd(0xF3);
    lcd_7_send_data(0x50);

    lcd_send_cmd(0xFB);
    lcd_7_send_data(0x01);

    lcd_send_cmd(0x11);
    lcd_7_send_data(0x00);

    lcd_delay(200);

    lcd_send_cmd(0x3A);
    lcd_7_send_data(0x65);

    lcd_send_cmd(0x29);
    lcd_7_send_data(0x00);
}