199 lines
6.6 KiB
C
199 lines
6.6 KiB
C
|
/*
|
||
|
|
||
|
ucg_dev_oled_160x128_samsung.c
|
||
|
|
||
|
Specific code for the Samsung 160x128 OLED (LD50T6160 Controller)
|
||
|
|
||
|
Universal uC Color Graphics Library
|
||
|
|
||
|
Copyright (c) 2015, olikraus@gmail.com
|
||
|
All rights reserved.
|
||
|
|
||
|
Redistribution and use in source and binary forms, with or without modification,
|
||
|
are permitted provided that the following conditions are met:
|
||
|
|
||
|
* Redistributions of source code must retain the above copyright notice, this list
|
||
|
of conditions and the following disclaimer.
|
||
|
|
||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||
|
list of conditions and the following disclaimer in the documentation and/or other
|
||
|
materials provided with the distribution.
|
||
|
|
||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
|
||
|
*/
|
||
|
|
||
|
#include "ucg.h"
|
||
|
|
||
|
/*
|
||
|
Samsung 1.8" OLED
|
||
|
VCC_R (4) connected to 4.7uF
|
||
|
VCC_R1 (41) connected to 4.7uF
|
||
|
VCC connected to 18V
|
||
|
VCC3 connected to 18V
|
||
|
|
||
|
==> Internal regulator mit be enabled
|
||
|
==> DC-DC must be switched off
|
||
|
|
||
|
From the Samsung 1.8" OLED datasheet:
|
||
|
|
||
|
PREC_WIDTH = 06h, (pre charge width?)
|
||
|
PEAKDELAY = 01h,
|
||
|
Frame Freq.(*1)) = 02h(90Hz)
|
||
|
|
||
|
Red : PEAKWIDTH = 03h,
|
||
|
Green : PEAKWIDTH = 05h,
|
||
|
Blue : PEAKWIDTH = 03h
|
||
|
|
||
|
Red : DOT CURRENT = 9Ah,
|
||
|
Green : DOT CURRENT = 5Ch,
|
||
|
Blue : DOT CURRENT = B1h
|
||
|
|
||
|
*/
|
||
|
|
||
|
|
||
|
static const ucg_pgm_uint8_t ucg_samsung_160x128_init_seq[] = {
|
||
|
/* init sequence for the Samsung OLED with LD50T6160 controller */
|
||
|
UCG_CFG_CD(0,1), /* DC=0 for command mode, DC=1 for data and args */
|
||
|
UCG_RST(1),
|
||
|
UCG_CS(1), /* disable chip */
|
||
|
UCG_DLY_MS(1),
|
||
|
UCG_RST(0),
|
||
|
UCG_DLY_MS(1),
|
||
|
UCG_RST(1),
|
||
|
UCG_DLY_MS(150),
|
||
|
UCG_CS(0), /* enable chip */
|
||
|
|
||
|
|
||
|
UCG_C10(0x01), /* software reset */
|
||
|
UCG_C11(0x02, 0x00), /* display on/off: display off */
|
||
|
UCG_C11(0x03, 0x00), /* standby off, OSCA start */
|
||
|
UCG_C11(0x04, 0x02), /* set frame rate: 0..7, 60Hz to 150Hz, default is 2=90Hz */
|
||
|
UCG_C11(0x05, 0x00), /* write dir, bit 3: RGB/BGR */
|
||
|
UCG_C11(0x06, 0x00), /* row scan dir (0=default) */
|
||
|
|
||
|
UCG_C11(0x06, 0x00), /* row scan dir (0=default) */
|
||
|
|
||
|
UCG_C10(0x07), /* set screen size */
|
||
|
UCG_A2(0x00, 0x00), /* x min = 0 */
|
||
|
UCG_A2(0x07, 0x0f), /* x max = 127 */
|
||
|
UCG_A2(0x00, 0x00), /* y min = 0 */
|
||
|
UCG_A2(0x09, 0x0f), /* y max = 159 */
|
||
|
|
||
|
UCG_C11(0x08, 0x00), /* interface bus width: 6 bit */
|
||
|
UCG_C11(0x09, 0x07), /* no data (RGB) masking (default) */
|
||
|
|
||
|
|
||
|
UCG_C10(0x0a), /* write box (probably not req. during init */
|
||
|
UCG_A2(0x00, 0x00), /* x min = 0 */
|
||
|
UCG_A2(0x07, 0x0f), /* x max = 127 */
|
||
|
UCG_A2(0x00, 0x00), /* y min = 0 */
|
||
|
UCG_A2(0x09, 0x0f), /* y max = 159 */
|
||
|
|
||
|
UCG_C10(0x0e), /* set some minimal dot current first */
|
||
|
UCG_A2(0x00, 0x03), /* red */
|
||
|
UCG_A2(0x00, 0x03), /* green */
|
||
|
UCG_A2(0x00, 0x03), /* blue */
|
||
|
|
||
|
UCG_C11(0x1b, 0x03), /* Pre-Charge Mode Select:Enable Pre-Charge and Peakboot for the Samsung OLED */
|
||
|
UCG_C12(0x1c, 0x00, 0x06), /* Pre-Charge Width, Samsung OLED: 0x06, controller default is 0x08 */
|
||
|
|
||
|
UCG_C10(0x1d), /* Peak Pulse Width Set */
|
||
|
UCG_A2(0x00, 0x03), /* red */
|
||
|
UCG_A2(0x00, 0x05), /* green */
|
||
|
UCG_A2(0x00, 0x03), /* blue */
|
||
|
|
||
|
UCG_C11(0x1e, 0x01), /* Peak Pulse Delay Set, Samsung OLED: 0x01, controller default is 0x05 */
|
||
|
|
||
|
/*
|
||
|
Row Scan Operation Set (cmd 0x1f)
|
||
|
|
||
|
bits 0, 1: scan mode
|
||
|
mode 00: alternate scan mode (Oliver: not sure if this is true, prob. this is seq. mode)
|
||
|
mode 01: seq. scan mode (Oliver: could be mode 00)
|
||
|
mode 10: simultaneous scan mode (Oliver: No idea what this is)
|
||
|
Samsung OLED: probably mode 00
|
||
|
bit 3:
|
||
|
if set to 1, then all rows are connected to GND
|
||
|
Samsung OLED: must be 0 for normal operation
|
||
|
bit 4,5: row timing setting
|
||
|
00: none
|
||
|
01: pre charge
|
||
|
10: pre charge + peak delay
|
||
|
11: pre charge + peak delay + peak boot
|
||
|
Samsung OLED: No idea, maybe 11 must be set here
|
||
|
*/
|
||
|
UCG_C11(0x1f, 0x30), /* Samsung OLED: pre charge + peak delay + peak boot */
|
||
|
|
||
|
UCG_C11(0x2d, 0x00), /* Write data through system interface (bit 4 = 0) */
|
||
|
|
||
|
/*
|
||
|
ICON Display control
|
||
|
bit 0/1 = 01: ALL ICON ON
|
||
|
bit 0/1 = 10: normal display mode (depends on ICON data)
|
||
|
*/
|
||
|
UCG_C11(0x20, 0x01), /* ICON Display control */
|
||
|
UCG_C11(0x21, 0x00), /* ICON Stand-by Setting, bit 0 = 0: no standby, start OSCB */
|
||
|
UCG_C11(0x29, 0x00), /* DC-DC Control for ICON: bit 0&1 = 01: stop DC-DC, use VICON (Samsung OLED has external 18V) */
|
||
|
UCG_C11(0x2a, 0x04), /* ICON Frame Frequency Set: 89Hz */
|
||
|
|
||
|
UCG_C11(0x30, 0x13), /* Internal Regulator for Row Scan, value taken from Samsung OLED flow chart */
|
||
|
|
||
|
/*
|
||
|
Set full dot current
|
||
|
Red : DOT CURRENT = 9Ah,
|
||
|
Green : DOT CURRENT = 5Ch,
|
||
|
Blue : DOT CURRENT = B1h
|
||
|
*/
|
||
|
UCG_DLY_MS(10),
|
||
|
UCG_C10(0x0e), /* set dot current */
|
||
|
UCG_A2(0x09, 0x0a), /* red */
|
||
|
UCG_A2(0x05, 0x0c), /* green */
|
||
|
UCG_A2(0x0b, 0x01), /* blue */
|
||
|
UCG_DLY_MS(10),
|
||
|
|
||
|
UCG_C11(0x02, 0x01), /* Display on */
|
||
|
|
||
|
UCG_CS(1), /* disable chip */
|
||
|
UCG_END(), /* end of sequence */
|
||
|
};
|
||
|
|
||
|
ucg_int_t ucg_dev_ld50t6160_18x160x128_samsung(ucg_t *ucg, ucg_int_t msg, void *data)
|
||
|
{
|
||
|
switch(msg)
|
||
|
{
|
||
|
case UCG_MSG_DEV_POWER_UP:
|
||
|
/* 1. Call to the controller procedures to setup the com interface */
|
||
|
if ( ucg_dev_ic_ld50t6160_18(ucg, msg, data) == 0 )
|
||
|
return 0;
|
||
|
|
||
|
/* 2. Send specific init sequence for this display module */
|
||
|
ucg_com_SendCmdSeq(ucg, ucg_samsung_160x128_init_seq);
|
||
|
return 1;
|
||
|
|
||
|
case UCG_MSG_DEV_POWER_DOWN:
|
||
|
/* let do power down by the controller procedures */
|
||
|
return ucg_dev_ic_ld50t6160_18(ucg, msg, data);
|
||
|
|
||
|
case UCG_MSG_GET_DIMENSION:
|
||
|
((ucg_wh_t *)data)->w = 128;
|
||
|
((ucg_wh_t *)data)->h = 160;
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
/* all other messages are handled by the controller procedures */
|
||
|
return ucg_dev_ic_ld50t6160_18(ucg, msg, data);
|
||
|
}
|