in hd44780_common.c [89:161]
int hd44780_common_init_display(struct charlcd *lcd)
{
struct hd44780_common *hdc = lcd->drvdata;
void (*write_cmd_raw)(struct hd44780_common *hdc, int cmd);
u8 init;
if (hdc->ifwidth != 4 && hdc->ifwidth != 8)
return -EINVAL;
hdc->hd44780_common_flags = ((lcd->height > 1) ? LCD_FLAG_N : 0) |
LCD_FLAG_D | LCD_FLAG_C | LCD_FLAG_B;
long_sleep(20); /* wait 20 ms after power-up for the paranoid */
/*
* 8-bit mode, 1 line, small fonts; let's do it 3 times, to make sure
* the LCD is in 8-bit mode afterwards
*/
init = LCD_CMD_FUNCTION_SET | LCD_CMD_DATA_LEN_8BITS;
if (hdc->ifwidth == 4) {
init >>= 4;
write_cmd_raw = hdc->write_cmd_raw4;
} else {
write_cmd_raw = hdc->write_cmd;
}
write_cmd_raw(hdc, init);
long_sleep(10);
write_cmd_raw(hdc, init);
long_sleep(10);
write_cmd_raw(hdc, init);
long_sleep(10);
if (hdc->ifwidth == 4) {
/* Switch to 4-bit mode, 1 line, small fonts */
hdc->write_cmd_raw4(hdc, LCD_CMD_FUNCTION_SET >> 4);
long_sleep(10);
}
/* set font height and lines number */
hdc->write_cmd(hdc,
LCD_CMD_FUNCTION_SET |
((hdc->ifwidth == 8) ? LCD_CMD_DATA_LEN_8BITS : 0) |
((hdc->hd44780_common_flags & LCD_FLAG_F) ?
LCD_CMD_FONT_5X10_DOTS : 0) |
((hdc->hd44780_common_flags & LCD_FLAG_N) ?
LCD_CMD_TWO_LINES : 0));
long_sleep(10);
/* display off, cursor off, blink off */
hdc->write_cmd(hdc, LCD_CMD_DISPLAY_CTRL);
long_sleep(10);
hdc->write_cmd(hdc,
LCD_CMD_DISPLAY_CTRL | /* set display mode */
((hdc->hd44780_common_flags & LCD_FLAG_D) ?
LCD_CMD_DISPLAY_ON : 0) |
((hdc->hd44780_common_flags & LCD_FLAG_C) ?
LCD_CMD_CURSOR_ON : 0) |
((hdc->hd44780_common_flags & LCD_FLAG_B) ?
LCD_CMD_BLINK_ON : 0));
charlcd_backlight(lcd,
(hdc->hd44780_common_flags & LCD_FLAG_L) ? 1 : 0);
long_sleep(10);
/* entry mode set : increment, cursor shifting */
hdc->write_cmd(hdc, LCD_CMD_ENTRY_MODE | LCD_CMD_CURSOR_INC);
hd44780_common_clear_display(lcd);
return 0;
}