162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Driver for the LCD display on the Tensilica XTFPGA board family. 362306a36Sopenharmony_ci * http://www.mytechcorp.com/cfdata/productFile/File1/MOC-16216B-B-A0A04.pdf 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public 662306a36Sopenharmony_ci * License. See the file "COPYING" in the main directory of this archive 762306a36Sopenharmony_ci * for more details. 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci * Copyright (C) 2001, 2006 Tensilica Inc. 1062306a36Sopenharmony_ci * Copyright (C) 2015 Cadence Design Systems Inc. 1162306a36Sopenharmony_ci */ 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <linux/delay.h> 1462306a36Sopenharmony_ci#include <linux/init.h> 1562306a36Sopenharmony_ci#include <linux/io.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#include <platform/hardware.h> 1862306a36Sopenharmony_ci#include <platform/lcd.h> 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci/* LCD instruction and data addresses. */ 2162306a36Sopenharmony_ci#define LCD_INSTR_ADDR ((char *)IOADDR(CONFIG_XTFPGA_LCD_BASE_ADDR)) 2262306a36Sopenharmony_ci#define LCD_DATA_ADDR (LCD_INSTR_ADDR + 4) 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define LCD_CLEAR 0x1 2562306a36Sopenharmony_ci#define LCD_DISPLAY_ON 0xc 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci/* 8bit and 2 lines display */ 2862306a36Sopenharmony_ci#define LCD_DISPLAY_MODE8BIT 0x38 2962306a36Sopenharmony_ci#define LCD_DISPLAY_MODE4BIT 0x28 3062306a36Sopenharmony_ci#define LCD_DISPLAY_POS 0x80 3162306a36Sopenharmony_ci#define LCD_SHIFT_LEFT 0x18 3262306a36Sopenharmony_ci#define LCD_SHIFT_RIGHT 0x1c 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_cistatic void lcd_put_byte(u8 *addr, u8 data) 3562306a36Sopenharmony_ci{ 3662306a36Sopenharmony_ci#ifdef CONFIG_XTFPGA_LCD_8BIT_ACCESS 3762306a36Sopenharmony_ci WRITE_ONCE(*addr, data); 3862306a36Sopenharmony_ci#else 3962306a36Sopenharmony_ci WRITE_ONCE(*addr, data & 0xf0); 4062306a36Sopenharmony_ci WRITE_ONCE(*addr, (data << 4) & 0xf0); 4162306a36Sopenharmony_ci#endif 4262306a36Sopenharmony_ci} 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_cistatic int __init lcd_init(void) 4562306a36Sopenharmony_ci{ 4662306a36Sopenharmony_ci WRITE_ONCE(*LCD_INSTR_ADDR, LCD_DISPLAY_MODE8BIT); 4762306a36Sopenharmony_ci mdelay(5); 4862306a36Sopenharmony_ci WRITE_ONCE(*LCD_INSTR_ADDR, LCD_DISPLAY_MODE8BIT); 4962306a36Sopenharmony_ci udelay(200); 5062306a36Sopenharmony_ci WRITE_ONCE(*LCD_INSTR_ADDR, LCD_DISPLAY_MODE8BIT); 5162306a36Sopenharmony_ci udelay(50); 5262306a36Sopenharmony_ci#ifndef CONFIG_XTFPGA_LCD_8BIT_ACCESS 5362306a36Sopenharmony_ci WRITE_ONCE(*LCD_INSTR_ADDR, LCD_DISPLAY_MODE4BIT); 5462306a36Sopenharmony_ci udelay(50); 5562306a36Sopenharmony_ci lcd_put_byte(LCD_INSTR_ADDR, LCD_DISPLAY_MODE4BIT); 5662306a36Sopenharmony_ci udelay(50); 5762306a36Sopenharmony_ci#endif 5862306a36Sopenharmony_ci lcd_put_byte(LCD_INSTR_ADDR, LCD_DISPLAY_ON); 5962306a36Sopenharmony_ci udelay(50); 6062306a36Sopenharmony_ci lcd_put_byte(LCD_INSTR_ADDR, LCD_CLEAR); 6162306a36Sopenharmony_ci mdelay(10); 6262306a36Sopenharmony_ci lcd_disp_at_pos("XTENSA LINUX", 0); 6362306a36Sopenharmony_ci return 0; 6462306a36Sopenharmony_ci} 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_civoid lcd_disp_at_pos(char *str, unsigned char pos) 6762306a36Sopenharmony_ci{ 6862306a36Sopenharmony_ci lcd_put_byte(LCD_INSTR_ADDR, LCD_DISPLAY_POS | pos); 6962306a36Sopenharmony_ci udelay(100); 7062306a36Sopenharmony_ci while (*str != 0) { 7162306a36Sopenharmony_ci lcd_put_byte(LCD_DATA_ADDR, *str); 7262306a36Sopenharmony_ci udelay(200); 7362306a36Sopenharmony_ci str++; 7462306a36Sopenharmony_ci } 7562306a36Sopenharmony_ci} 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_civoid lcd_shiftleft(void) 7862306a36Sopenharmony_ci{ 7962306a36Sopenharmony_ci lcd_put_byte(LCD_INSTR_ADDR, LCD_SHIFT_LEFT); 8062306a36Sopenharmony_ci udelay(50); 8162306a36Sopenharmony_ci} 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_civoid lcd_shiftright(void) 8462306a36Sopenharmony_ci{ 8562306a36Sopenharmony_ci lcd_put_byte(LCD_INSTR_ADDR, LCD_SHIFT_RIGHT); 8662306a36Sopenharmony_ci udelay(50); 8762306a36Sopenharmony_ci} 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ciarch_initcall(lcd_init); 90