static void lcd_reset(void)
{
    LCD_CON = 0xDB8;
    LCD_PHTIME = 0x22;
    LCD_RST_TIME = 0x7FFF;
    
    lcd_reset_delay();
    LCD_DRV_RST = 0;
    lcd_reset_delay();
    LCD_DRV_RST = 1;
    lcd_reset_delay();
    LCD_DRV_RST = 0;
    lcd_reset_delay();
    LCD_DRV_RST = 1;
    
    LCD_INTCON = 0;
}
Esempio n. 2
0
void lcd_begin_frame()
{
    uint8_t flags = vram.flags;
    uint8_t mode = vram.mode;

    lcd_window_x = 0;
    lcd_window_y = vram.first_line;

    /*
     * Wake up the LCD controller, if necessary.
     */
    if (!lcd_is_awake) {
        lcd_is_awake = 1;
        
        // First, we take the LCD controller out of reset.
        // Then we fully initialize it. We turn on the backlight
        // after both initialization is complete and the first
        // frame has finished rendering.

        CTRL_PORT = CTRL_IDLE & ~CTRL_LCD_DCX;
        CTRL_PORT = (CTRL_IDLE & ~CTRL_LCD_DCX) | CTRL_FLASH_LAT2;  // Enter reset

        lcd_reset_delay();

        CTRL_PORT = CTRL_IDLE;
        CTRL_PORT = CTRL_IDLE | CTRL_FLASH_LAT2;  // Exit reset
        
        // Controller initialization
        lcd_cmd_table(lcd_setup_table);
        #ifdef LCD_MODEL_TIANMA_HX8353
        lcd_lut_init();
        #endif
    }

    LCD_WRITE_BEGIN();

    // Set addressing mode
    LCD_CMD_MODE();
    LCD_BYTE(LCD_CMD_MADCTR);
    LCD_DATA_MODE();
    LCD_BYTE(LCD_MADCTR_NORMAL ^ (flags & LCD_MADCTR_VRAM));

    // Set row/column addressing, and start RAMWR.
    lcd_address_and_write();

    LCD_WRITE_END();

    // Vertical sync
    #ifdef HAVE_LCD_TE
    if (flags & _SYS_VF_SYNC)
        while (!CTRL_LCD_TE);
    #endif
}