Author: daveb
Date: 2010-08-18 17:43:48 +0100 (Wed, 18 Aug 2010)
New Revision: 1198
Added:
balloon/branches/display-dev/bootldr/s6e63d6.c
balloon/branches/display-dev/bootldr/s6e63d6.h
balloon/branches/display-dev/bootldr/ssd1305.c
balloon/branches/display-dev/bootldr/ssd1305.h
Modified:
balloon/branches/display-dev/bootldr/Makefile-level2
balloon/branches/display-dev/bootldr/config.local.mk
Log:
First working drivers for OLED displays
Modified: balloon/branches/display-dev/bootldr/Makefile-level2
===================================================================
--- balloon/branches/display-dev/bootldr/Makefile-level2 2010-08-18 16:37:17 UTC (rev 1197)
+++ balloon/branches/display-dev/bootldr/Makefile-level2 2010-08-18 16:43:48 UTC (rev 1198)
@@ -44,7 +44,6 @@
#
-include config.local.mk
-
#
# Normally you need not worry about the stuff below.
#
@@ -186,6 +185,14 @@
CONFIG_ST7529=y
endif
+ifeq ($(CONFIG_BEAN),y)
+ ARCH_DEFS += -DCONFIG_BEAN
+ CONFIG_SSD1305=y
+ CONFIG_S6E63D6=y
+# CONFIG_LCD=y
+# ARCH_DEFS += -DNO_SPLASH
+endif
+
ifeq ($(CONFIG_BALLOON_FPGA),y)
ARCH_DEFS += -DCONFIG_BALLOON_FPGA
OTHEROBJS += fpga.o
@@ -422,8 +429,18 @@
OTHEROBJS +=st7529.o
ARCH_DEFS += -DCONFIG_ST7529
endif
+ifeq ($(CONFIG_SSD1305),y)
+ OTHEROBJS +=ssd1305.o
+ ARCH_DEFS += -DCONFIG_SSD1305
endif
+ifeq ($(CONFIG_S6E63D6),y)
+ OTHEROBJS +=s6e63d6.o
+ ARCH_DEFS += -DCONFIG_S6E63D6
+endif
+endif
+
+
OBJS = $(BOOTO) $(OTHEROBJS)
VER_STR=$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_MICRO)$(VERSION_SPECIAL)
Modified: balloon/branches/display-dev/bootldr/config.local.mk
===================================================================
--- balloon/branches/display-dev/bootldr/config.local.mk 2010-08-18 16:37:17 UTC (rev 1197)
+++ balloon/branches/display-dev/bootldr/config.local.mk 2010-08-18 16:43:48 UTC (rev 1198)
@@ -36,5 +36,6 @@
else
CONFIG_BALLOON_LARGE=n
CONFIG_BALLOON_SLOW_CPU=n
+CONFIG_BEAN=y
#CONFIG_PODPOINT=y
endif
Added: balloon/branches/display-dev/bootldr/s6e63d6.c
===================================================================
--- balloon/branches/display-dev/bootldr/s6e63d6.c (rev 0)
+++ balloon/branches/display-dev/bootldr/s6e63d6.c 2010-08-18 16:43:48 UTC (rev 1198)
@@ -0,0 +1,297 @@
+// s6e63d6 LCD Display Driver interface.
+// Driver for CO240QGLH-T Active OLED display (240 x 320)
+// D L Bisset Toby Churchill Ltd.
+// August 2010
+
+// Samosa bus
+#include "nand/nandif.h"
+
+#include "s6e63d6.h"
+
+#include "commands.h"
+#include "bootldr.h"
+
+
+#define SAMOSA_ADDRESS_BYTE (*(volatile unsigned int *)(0x10c00000))
+#define SAMOSA_DATA_BYTE (*(volatile unsigned int *)(0x10c00004))
+
+
+void s6e63d6_Init(void)
+{
+ s6e63d6_PowerEnable(0);
+ s6e63d6_Reset();
+ s6e63d6_ReadID();
+ s6e63d6_WriteReg(S6E63D6_STAND_BY, S6E63D6_STAND_BY_DISABLE);
+// msleep(10);
+ s6e63d6_WriteReg(S6E63D6_RGB_INTERFACE_CONTROL, S6E63D6_SYSTEM_MODE | S6E63D6_RGB_18_BIT | S6E63D6_VSYNC_POL_0 | S6E63D6_HSYNC_POL_0 | S6E63D6_EN_POL_1 | S6E63D6_DOT_CLK_POL_0);
+ s6e63d6_WriteReg(S6E63D6_ENTRY_MODE, S6E63D6_COLOUR_MODE_262k | S6E63D6_VERT_ADDRESS_AUTO_INC | S6E63D6_HORIZ_ADDRESS_AUTO_INC);
+ msleep(100); // Delay of 10 is too short need to find minimum delay FIXME
+ s6e63d6_PowerEnable(1);
+ s6e63d6_WriteReg(S6E63D6_DISPLAY_CONTROL_1, S6E63D6_DISPLAY_ON);
+}
+
+void s6e63d6_Draw_Block(UWORD x_start, UWORD y_start, UWORD value, int xsize, int ysize)
+{
+ int x, y;
+
+ for (y=0; y<ysize; y++)
+ {
+ for (x=0; x<xsize; x++)
+ {
+ s6e63d6_Set_Pixel(x_start + x, y_start + y, value);
+ }
+ }
+}
+
+void s6e63d6_Set_Pixel(UWORD x, UWORD y, UWORD value)
+{
+ s6e63d6_Set_Address( x, y);
+ s6e63d6_WriteReg(S6E63D6_GRAM_WRITE, value);
+}
+
+void s6e63d6_Set_Address(UWORD x, UWORD y)
+{
+ unsigned long int address;
+
+ address = x * S6E63D6_ROW_SIZE + y;
+// putLabeledWord("Address = ", address);
+ s6e63d6_WriteReg(S6E63D6_GRAM_SET_ADD_LOW, address & 0xff);
+ s6e63d6_WriteReg(S6E63D6_GRAM_SET_ADD_HIGH, (address & 0x1ff00) >> 8);
+}
+
+
+UWORD s6e63d6_ReadID(void)
+{
+ UWORD idcode;
+
+ idcode = s6e63d6_ReadReg(S6E63D6_DEVICE_CODE_READ);
+ putLabeledWord("Display IDCode ", idcode);
+ return idcode;
+}
+
+void s6e63d6_WriteRegIndex(UWORD index)
+{
+// while ( s6e63d6_Busy() );
+ SAMOSA_ADDRESS_BYTE = SAMOSA_REG_AMOLED_SPI_REG1;
+ SAMOSA_DATA_BYTE = index & 0xff;
+ SAMOSA_ADDRESS_BYTE = SAMOSA_REG_AMOLED_SPI_REG2;
+ SAMOSA_DATA_BYTE = 0;
+ SAMOSA_ADDRESS_BYTE = SAMOSA_REG_AMOLED_SPI_STATUS;
+ SAMOSA_DATA_BYTE = S6E63D6_REG_WRITE | S6E63D6_INX_STAT_SEL;
+ s6e63d6_SPI_Start_TX();
+}
+
+int s6e63d6_Busy(void)
+{
+ int count = 0;
+ UWORD volatile busy;
+
+ do {
+ SAMOSA_ADDRESS_BYTE = SAMOSA_REG_AMOLED_SPI_STATUS;
+ busy = SAMOSA_DATA_BYTE & 0x01;
+ count ++;
+ } while (busy == 0 && count < 100);
+ if (count > 50) putLabeledWord("count ", count);
+}
+
+void s6e63d6_WriteData(UWORD data)
+{
+ s6e63d6_Busy();
+ SAMOSA_ADDRESS_BYTE = SAMOSA_REG_AMOLED_SPI_REG1;
+ SAMOSA_DATA_BYTE = data & 0xff;
+ SAMOSA_ADDRESS_BYTE = SAMOSA_REG_AMOLED_SPI_REG2;
+ SAMOSA_DATA_BYTE = (data >> 8) & 0xff;
+ SAMOSA_ADDRESS_BYTE = SAMOSA_REG_AMOLED_SPI_STATUS;
+ SAMOSA_DATA_BYTE = S6E63D6_REG_WRITE | S6E63D6_REGISTER_SELECT;
+ s6e63d6_SPI_Start_TX();
+}
+
+UWORD s6e63d6_ReadData(void)
+{
+ UWORD ret_val;
+ UWORD lsb, msb;
+
+ s6e63d6_Busy();
+ SAMOSA_ADDRESS_BYTE = SAMOSA_REG_AMOLED_SPI_STATUS;
+ SAMOSA_DATA_BYTE = S6E63D6_REGISTER_SELECT | S6E63D6_REG_READ;
+ s6e63d6_SPI_Start_TX();
+ s6e63d6_Busy();
+ SAMOSA_ADDRESS_BYTE = SAMOSA_REG_AMOLED_SPI_REG1;
+ lsb = SAMOSA_DATA_BYTE;
+// putLabeledWord("lsb ", lsb);
+ SAMOSA_ADDRESS_BYTE = SAMOSA_REG_AMOLED_SPI_REG2;
+ msb = SAMOSA_DATA_BYTE;
+// putLabeledWord("msb ", msb);
+ /*FIXME Endian assumption*/
+ ret_val = ((msb & 0xff) << 8) | (lsb & 0xff);
+ return ret_val;
+}
+
+
+UWORD s6e63d6_ReadStatus(void)
+{
+ UWORD ret_val;
+ UWORD lsb, msb;
+
+ s6e63d6_Busy();
+ SAMOSA_ADDRESS_BYTE = SAMOSA_REG_AMOLED_SPI_STATUS;
+ SAMOSA_DATA_BYTE = S6E63D6_REG_READ | S6E63D6_INX_STAT_SEL;
+ s6e63d6_SPI_Start_TX();
+ s6e63d6_Busy();
+ SAMOSA_ADDRESS_BYTE = SAMOSA_REG_AMOLED_SPI_REG1;
+ lsb = SAMOSA_DATA_BYTE;
+ SAMOSA_ADDRESS_BYTE = SAMOSA_REG_AMOLED_SPI_REG2;
+ msb = SAMOSA_DATA_BYTE;
+ /*FIXME Endian assumption*/
+ ret_val = ((msb & 0xff) << 8) | (lsb & 0xff);
+ return ret_val;
+}
+
+void s6e63d6_WriteReg(UWORD index, UWORD data)
+{
+ msleep(1);
+ s6e63d6_WriteRegIndex(index);
+// msleep(1);
+ s6e63d6_WriteData(data);
+}
+
+UWORD s6e63d6_ReadReg(UWORD index)
+{
+ UWORD ret_val;
+
+// msleep(1);
+ s6e63d6_WriteRegIndex(index);
+// msleep(1);
+ ret_val = s6e63d6_ReadData();
+ return ret_val;
+}
+
+UWORD s6e63d6_ReadRAM()
+{
+ UWORD ret_val;
+
+// msleep(1);
+ s6e63d6_WriteRegIndex(0x22);
+// msleep(1);
+ ret_val = s6e63d6_ReadData();
+ return ret_val;
+}
+
+void s6e63d6_Reset()
+{
+ SAMOSA_ADDRESS_BYTE = SAMOSA_REG_CTRL_SET;
+ SAMOSA_DATA_BYTE = S6E63D6_RESET;
+ msleep(1);
+ SAMOSA_ADDRESS_BYTE = SAMOSA_REG_CTRL_CLR;
+ SAMOSA_DATA_BYTE = S6E63D6_RESET;
+ msleep(10);
+}
+
+void s6e63d6_SPI_Start_TX()
+{
+ SAMOSA_ADDRESS_BYTE = SAMOSA_REG_CTRL_SET;
+ SAMOSA_DATA_BYTE = S6E63D6_START_TX;
+ msleep(1);
+ SAMOSA_ADDRESS_BYTE = SAMOSA_REG_CTRL_CLR;
+ SAMOSA_DATA_BYTE = S6E63D6_START_TX;
+}
+
+void s6e63d6_PowerEnable(int state)
+{
+ if (state) {
+ SAMOSA_ADDRESS_BYTE = SAMOSA_REG_CTRL_SET;
+ SAMOSA_DATA_BYTE = S6E63D6_POWER;
+ }else
+ {
+ SAMOSA_ADDRESS_BYTE = SAMOSA_REG_CTRL_CLR;
+ SAMOSA_DATA_BYTE = S6E63D6_POWER;
+ }
+ msleep(1);
+}
+
+UWORD s6e63d6_ReadVer()
+{
+ UWORD ver;
+ SAMOSA_ADDRESS_BYTE = SAMOSA_REG_VERSION;
+ ver = SAMOSA_DATA_BYTE;
+ return ver;
+}
+
+
+
+s6e63d6_SetDisplayMode()
+{
+}
+
+COMMAND(amoled, command_amoled, "[command] -- ver | init | on | off | status | idcode | reset | cmd r v | ram | block x y v xs ys");
+void command_amoled(int argc, const char *argv[]) {
+
+ unsigned char cmd, num_args;
+ unsigned char args[4];
+ int c;
+ UWORD val;
+
+ if (argc<2) {
+ putstr("amoled ver | init | on | off | status | idcode | reset | cmd r v | ram | block x y v xs ys\r\n");
+ return;
+ }
+
+ if (!strcmp(argv[1],"init")) {
+ s6e63d6_Init();
+ } else if(!strcmp(argv[1],"idcode")) {
+ s6e63d6_ReadID();
+ //s6e63d6_WriteRegIndex((UWORD)(strtoul(argv[2], NULL, 0)));
+ } else if(!strcmp(argv[1],"status")) {
+ val = s6e63d6_ReadStatus();
+ putLabeledWord("Status = ", val);
+ } else if(!strcmp(argv[1],"reset")) {
+ s6e63d6_Reset();
+ } else if(!strcmp(argv[1],"off")) {
+ s6e63d6_PowerEnable(0);
+ } else if(!strcmp(argv[1],"on")) {
+ s6e63d6_PowerEnable(1);
+ } else if(!strcmp(argv[1],"cmd")) {
+ s6e63d6_WriteReg((UWORD)strtoul(argv[2], NULL, 0), (UWORD)strtoul(argv[3], NULL, 0));
+ } else if(!strcmp(argv[1],"ram")) {
+ val = s6e63d6_ReadRAM();
+ putLabeledWord("ram = ", val);
+ } else if(!strcmp(argv[1],"ver")) {
+ val = s6e63d6_ReadVer();
+ putLabeledWord("CPLD Ver ", val);
+ } else if(!strcmp(argv[1],"block")) {
+ if (argc < 7) {
+ putstr("Too few args to Draw Block\r\n");
+ }
+ else {
+ s6e63d6_Draw_Block( (UWORD)strtoul(argv[2], NULL, 0),
+ (UWORD)strtoul(argv[3], NULL, 0),
+ (UWORD)strtoul(argv[4], NULL, 0),
+ (UWORD)strtoul(argv[5], NULL, 0),
+ (UWORD)strtoul(argv[6], NULL, 0));
+ }
+// } else if(!strcmp(argv[1],"cmd")) {
+// cmd = (unsigned char)strtoul(argv[2], NULL, 0);
+// num_args = argc - 3;
+// for (c=0; c<num_args; c++){
+// args[c] = (unsigned char)strtoul(argv[c+3], NULL, 0);
+// }
+// ssd1305_cmd( cmd, num_args, args);
+// } else if(!strcmp(argv[1],"data")) {
+// num_args = argc - 2;
+// for (c=0; c<num_args; c++){
+// args[c] = (unsigned char)strtoul(argv[c+2], NULL, 0);
+// }
+// ssd1305_data(num_args, args);
+// } else if(!strcmp(argv[1], "fill")) {
+// ssd1305_fill((int)strtoul(argv[2], NULL, 0));
+ }
+ else {
+ putstr("Command not known: ");
+ putstr(argv[1]);
+ putstr("\r\n");
+ }
+}
+
+
+
+
Added: balloon/branches/display-dev/bootldr/s6e63d6.h
===================================================================
--- balloon/branches/display-dev/bootldr/s6e63d6.h (rev 0)
+++ balloon/branches/display-dev/bootldr/s6e63d6.h 2010-08-18 16:43:48 UTC (rev 1198)
@@ -0,0 +1,183 @@
+// s6e63d6 LCD Display Driver interface.
+// Driver for CO240QGLH-T Active OLED display (240 x 320)
+// D L Bisset Toby Churchill Ltd.
+// August 2010
+
+#ifndef _S6E63D6_H
+#define _S6E63D6_H
+
+typedef unsigned short int UWORD ;
+
+#define S6E63D6_XSIZE 320
+#define S6E63D6_YSIZE 240
+#define S6E63D6_ROW_SIZE 0x100
+
+//SAMOSA Registers
+#define SAMOSA_REG_CTRL_CLR 0x06
+#define SAMOSA_REG_CTRL_SET 0x07
+#define SAMOSA_REG_AMOLED_SPI_REG1 0x03
+#define SAMOSA_REG_AMOLED_SPI_REG2 0x04
+#define SAMOSA_REG_AMOLED_SPI_STATUS 0x05
+#define SAMOSA_REG_VERSION 0xff
+
+//SPI interface control
+#define S6E63D6_REG_READ 0x80
+#define S6E63D6_REG_WRITE 0x00
+#define S6E63D6_REGISTER_SELECT 0x40
+#define S6E63D6_INX_STAT_SEL 0x00
+
+//interface control register
+#define S6E63D6_START_TX 0x01
+#define S6E63D6_RESET 0x02
+#define S6E63D6_POWER 0x04
+
+//Register Numbers
+
+typedef enum {
+ S6E63D6_DISPLAY_DUTY_CONTROL = 0x01,
+ S6E63D6_RGB_INTERFACE_CONTROL = 0x02,
+ S6E63D6_ENTRY_MODE = 0x03,
+ S6E63D6_CLOCK_CONTROL = 0x04,
+ S6E63D6_DISPLAY_CONTROL_1 = 0x05,
+ S6E63D6_DISPLAY_CONTROL_2 = 0x06,
+ S6E63D6_PANEL_IF_CONTROL_1A = 0x07,
+ S6E63D6_PANEL_IF_CONTROL_1B = 0x08,
+ S6E63D6_PANEL_IF_CONTROL_2 = 0x09,
+ S6E63D6_DEVICE_CODE_READ = 0x0f, /* Read only register returns 0x63D6 */
+ S6E63D6_STAND_BY = 0x10,
+ S6E63D6_POWER_GEN_1 = 0x12,
+ S6E63D6_POWER_GEN_2 = 0x13,
+ S6E63D6_POWER_GEN_3 = 0xF8,
+ S6E63D6_POWER_GEN_4 = 0xF9,
+ S6E63D6_POWER_BOOST_CTRL = 0x14,
+ S6E63D6_OSC_CONTROL = 0x18,
+ S6E63D6_SOURC_DRV_CTRL = 0x1a,
+ S6E63D6_GRAM_SET_ADD_LOW = 0x20,
+ S6E63D6_GRAM_SET_ADD_HIGH = 0x21,
+ S6E63D6_GRAM_WRITE = 0x22,
+ S6E63D6_GRAM_READ = 0x22,
+ S6E63D6_IF_SELECT_18_16 = 0x23,
+ S6E63D6_IF_SELECT_9_8 = 0x24,
+ S6E63D6_VERT_SCROLL_CTRL_1_START = 0x30,
+ S6E63D6_VERT_SCROLL_CTRL_1_END = 0x31,
+ S6E63D6_VERT_SCROLL_CTRL_2 = 0x32,
+ S6E63D6_PART_SCRN_DRV_POS_START = 0x33,
+ S6E63D6_PART_SCRN_DRV_POS_END = 0x34,
+ S6E63D6_VERT_RAM_ADD_POS_START = 0x35,
+ S6E63D6_VERT_RAM_ADD_POS_END = 0x36,
+ S6E63D6_HORIZ_RAM_ADD_POS = 0x37,
+ S6E63D6_CLIENT_INIT_WAKEUP = 0x38,
+ S6E63D6_MDDI_LNK_WAKEUP_START = 0x39,
+ S6E63D6_SUB_CTRL_1 = 0x3a,
+ S6E63D6_SUB_CTRL_2 = 0x3b,
+ S6E63D6_SUB_CTRL_3 = 0x3c,
+ S6E63D6_TEST_KEY = 0x60,
+ S6E63D6_MTP_CTRL = 0x61,
+ S6E63D6_MTP_REG_SET_R = 0x62,
+ S6E63D6_MTP_REG_SET_G = 0x63,
+ S6E63D6_MTP_REG_SET_B = 0x64,
+ S6E63D6_MTP_REG_SET_OFFSET = 0x65,
+ S6E63D6_GPIO_VALUE = 0x66,
+ S6E63D6_GPIO_IO_CTRL = 0x67,
+ S6E63D6_GPIO_CLEAR = 0x68,
+ S6E63D6_GPIO_INT_EN = 0x69,
+ S6E63D6_GPIO_POL_SEL = 0x6a,
+ S6E63D6_GAMMA_T_B_CTRL_R = 0x70,
+ S6E63D6_GAMMA_T_B_CTRL_G = 0x71,
+ S6E63D6_GAMMA_T_B_CTRL_B = 0x72,
+ S6E63D6_GAMMA_CTRL_R_1_2 = 0x73,
+ S6E63D6_GAMMA_CTRL_R_3_4 = 0x74,
+ S6E63D6_GAMMA_CTRL_G_1_2 = 0x75,
+ S6E63D6_GAMMA_CTRL_G_3_4 = 0x76,
+ S6E63D6_GAMMA_CTRL_B_1_2 = 0x77,
+ S6E63D6_GAMMA_CTRL_B_3_4 = 0x78,
+ S6E63D6_EL_CTRL = 0xf4
+} S6E63D6_Registers_t;
+
+//***Register 0x01 Display Duty Control
+//Porch Range 8-12
+#define S6E63D6_FRONT_PORCH 0x08
+#define S6E63D6_BACK_PORCH 0x08
+//Value 0x28 represents 240x320 (320 line)
+#define S6E63D6_NUM_LINES 0x28
+
+//***Register 0x02 RGB Interface control
+#define S6E63D6_RGB_MODE (0x03 << 7)
+#define S6E63D6_SYSTEM_MODE 0
+#define S6E63D6_RGB_18_BIT 0
+#define S6E63D6_RGB_16_BIT (0x01 << 4)
+#define S6E63D6_RGB_6_BIT (0x02 << 4)
+#define S6E63D6_RGB_DISABLE (0x03 << 4)
+#define S6E63D6_VSYNC_POL_0 0
+#define S6E63D6_VSYNC_POL_1 (1 << 3)
+#define S6E63D6_HSYNC_POL_0 0
+#define S6E63D6_HSYNC_POL_1 (1 << 2)
+#define S6E63D6_EN_POL_0 0
+#define S6E63D6_EN_POL_1 (1 << 1)
+#define S6E63D6_DOT_CLK_POL_0 0
+#define S6E63D6_DOT_CLK_POL_1 1
+
+//**Register 0x03 Entry Mode
+#define S6E63D6_COLOUR_MODE_65k (0 << 15)
+#define S6E63D6_COLOUR_MODE_262k (1 << 15)
+//Note MDT is 0 in RGB mode.
+//Reverses RGB to BGR in 18 bit transfers
+#define S6E63D6_BGR_COLOUR_MODE (1 << 12)
+#define S6E63D6_SOURCE_DIRECTION (1 << 8)
+#define S6E63D6_VERT_ADDRESS_AUTO_INC (1 << 5)
+#define S6E63D6_HORIZ_ADDRESS_AUTO_INC (1 << 4)
+#define S6E63D6_VERT_UPDATE (1)
+
+//***Register 0x04 Clock Control
+#define S6E63D6_CLOCK_CTL_POS 4
+
+//***Register 0x05 Display Control 1
+#define S6E63D6_DISPLAY_ON 1
+#define S6E63D6_DISPLAY_OFF 0
+
+//***Register 0x06 Display Control 2
+#define S6E63D6_COLOUR_DEPTH_8 (1 << 4)
+#define S6E63D6_COLOUR_DEPTH_HIGH (0)
+#define S6E63D6_TEMON_ENABLE (1 << 1)
+#define S6E63D6_REVERSE_DISPLAY_COLOUR 1
+
+//***Register 0x07/0x08 Panel Interface Control 1
+// Values from 0x0c - 0x1f
+#define S6E63D6_CLWEA_POS 8
+#define S6E63D6_CLWEB_POS 8
+#define S6E63D6_CLEWC_POS 8
+
+//***Register 0x09 Panel Interface Control 2
+
+//***Register 0x10 Stand By
+#define S6E63D6_STAND_BY_ENABLE 1
+#define S6E63D6_STAND_BY_DISABLE 0
+#define S6E63D6_MDDI_NAP_MODE_ON (1 << 2)
+#define S6E63D6_MDDI_NAP_MODE_OFF 0
+
+//Register 0x12 Power Gen 1
+//Register 0x13 Power Gen 2
+//Register 0xf8 Power Gen 3
+//Register 0xf9 Power Gen 4
+
+//Register 0x14 Power Booster Control
+//Register 0x18 Oscillator Control
+//Register 0x1a Source Driver Control
+
+//REgister 0x20 0x21 GRAM Address set
+
+void s6e63d6_Init(void);
+UWORD s6e63d6_ReadStatus(void);
+UWORD s6e63d6_ReadID(void);
+void s6e63d6_WriteRegIndex(UWORD index);
+int s6e63d6_Busy(void);
+void s6e63d6_WriteData(UWORD data);
+UWORD s6e63d6_ReadData(void);
+void s6e63d6_WriteReg(UWORD index, UWORD data);
+UWORD s6e63d6_ReadReg(UWORD index);
+void s6e63d6_SPI_Start_TX(void);
+void s6e63d6_Draw_Block(UWORD x_start, UWORD y_start, UWORD value, int xsize, int ysize);
+void s6e63d6_Set_Pixel(UWORD x, UWORD y, UWORD value);
+void s6e63d6_Set_Address(UWORD x, UWORD y);
+
+#endif
Added: balloon/branches/display-dev/bootldr/ssd1305.c
===================================================================
--- balloon/branches/display-dev/bootldr/ssd1305.c (rev 0)
+++ balloon/branches/display-dev/bootldr/ssd1305.c 2010-08-18 16:43:48 UTC (rev 1198)
@@ -0,0 +1,236 @@
+// SSD1305.c
+// bootldr interface to SSD1305 Based OLED dot matrix Display
+// including the Densitron LMR5428, which this code is intended for
+// Chris Jones, Martin-Jones Technology Ltd
+// David Bisset, Toby Churchill Ltd
+// August 2009
+// July 2010
+
+#include "ssd1305.h"
+#include "charset.h"
+// needed for file access
+#include "yaffs.h"
+
+// Samosa bus
+#include "nand/nandif.h"
+
+// used by free
+#include "heap.h"
+
+// needed for msleep
+#include "balloon.h"
+#include "commands.h"
+#include "bootldr.h"
+
+// internal functions for direct access to display
+int display_address=1;
+
+//#define write_cmd(data) balloon_samosa_write(display_address+1,data)
+//#define write_data(data) balloon_samosa_write(display_address,data)
+
+#define SAMOSA_ADDRESS_BYTE (*(volatile unsigned int *)(0x10c00000))
+#define SAMOSA_DATA_BYTE (*(volatile unsigned int *)(0x10c00004))
+
+#define write_data_block(data,count) balloon_samosa_write_block(display_address,data,count)
+#define write_data_repeat(data,count) balloon_samosa_write_repeat(display_address,data,count)
+#define read_data() balloon_samosa_read(display_address)
+#define read_status() balloon_samosa_read(display_address+1)
+
+#define COLS 128
+#define COLS3 80
+#define ROWS 64
+
+#define WHITE 0x00
+#define BLACK 0xf8
+
+// masks for locations of adjacent pixels in pleft, pcentre and pright
+// for font smoothing
+#define PIX_DOWN 0x04
+#define PIX_CENTRE 0x02
+#define PIX_UP 0x01
+
+// contrast value
+// 0x00 is towards 6 o'clock viewing angle
+// 0x3f is towards 12 o'clock or beyond
+// default value in data sheet is 0x12
+#define CONTRAST 0x06
+
+unsigned char st7529_grayscale[16]={0x00,0x03,0x06,0x09,0x0b,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x14,0x16,0x18,0x1b,0x1f};
+
+void write_cmd(unsigned char);
+void write_data(unsigned char);
+
+
+
+void ssd1305_init() {
+ display_address=0;
+
+ // initialisation procedure from Display document
+ // Software Reset
+ write_cmd(SSD1305_CMD_SWRES);
+ // Set Lower Column address
+ write_cmd(SSD1305_CMD_SETLOWCOLADD + 0x0);
+ // Set Higher Column Address
+ write_cmd(SSD1305_CMD_SETHIGHCOLADD + 0x0);
+ // Set Memory Addressing Mode
+ write_cmd(SSD1305_CMD_SETMEMADDMODE);
+ write_cmd(0x00); //Horizontal Addressing mode (0x00), vertical (0x01), Page (0x10)
+ // Set Column Start and End Address
+ // When wrapping on successive writes this ensures data wraps at correct columns
+ write_cmd(SSD1305_CMD_SETCOLADD);
+ write_cmd(0x4);
+ write_cmd(131); // SSD1305 max = 127 decimal
+ // Set Page Address
+ write_cmd(SSD1305_CMD_SETPAGEADD);
+ write_cmd(0x00); // Start at Page 0
+ write_cmd(0x07); // End at Page 7 (SSD1305 max = 0x07)
+ // Set Display Start Line (0x40 & (0-63 decimal)
+ write_cmd(SSD1305_CMD_SETDISPSTART & 0x00);
+ // Contrast Control
+ write_cmd(SSD1305_CMD_SETCONTRAST);
+ write_cmd(0x7b); // 0 - 255
+ // Re-map
+ write_cmd(SSD1305_CMD_SETSEGREMAP & 0x01); //Map column 131 to SEG0
+ //Switch Display to show RAM content
+ write_cmd(SSD1305_CMD_ALLDISPON & 0x0); //0x01 turns all pixels on
+ // Set Normal Display (Not inverse)
+ write_cmd(SSD1305_CMD_NORMALINV & 0x0);
+ // Set Multiplex Ratio
+ write_cmd(SSD1305_CMD_SETMUXRATIO);
+ write_cmd(0x3f); // Set to 64 decimal
+ // Set DC-DC enable external Vc supply
+ write_cmd(SSD1305_CMD_MASTERCONFIG);
+ write_cmd(0x8e); //0x8f on 0x8e off
+ // Display On
+ write_cmd(SSD1305_CMD_DISPON);
+ // Set COM Output scan direction
+ write_cmd(SSD1305_CMD_SETSCANDIR & 0x08); //Scan from COM{n] downto COM(0)
+ // Set Display Offset
+ write_cmd(SSD1305_CMD_SETDISPOFFSET);
+ write_cmd(0x00); //No vertical offset 0-63 decimal
+ // Display Clock divide
+ write_cmd(SSD1305_CMD_SETCLKDIV);
+ write_cmd(0xa0); //Set to 130Hz
+ // Set Area colour mode
+ write_cmd(SSD1305_CMD_SETAREACOLRMODE);
+ write_cmd(0x00); //Mono mode
+ // Set Precharge Period
+ write_cmd(SSD1305_CMD_SETPRECHARGE);
+ write_cmd(0x28); //Default
+ // COM Pins Hardware Configuration
+ write_cmd(SSD1305_CMD_SETHWCONFIG);
+ write_cmd(0x12); //Alt COM pins config
+ // Set VCOMH
+ write_cmd(SSD1305_CMD_VCOMLEVEL);
+ write_cmd(0x1b); // 0.605*12.5v = 7.56v, actual = 7.1v
+}
+
+void ssd1305_clear()
+{
+ ssd1305_fill(0);
+}
+
+void ssd1305_on()
+{
+ write_cmd(SSD1305_CMD_DISPON);
+}
+
+void ssd1305_off()
+{
+ write_cmd(SSD1305_CMD_DISPOFF);
+}
+
+void ssd1305_fill(int v)
+{
+ int x,y;
+ write_cmd(SSD1305_CMD_SETPAGEADD_PGMODE + 0);
+ write_cmd(SSD1305_CMD_SETLOWCOLADD + 0);
+ write_cmd(SSD1305_CMD_SETHIGHCOLADD + 0);
+ for(y=0; y<(SSD1305_BUFFYSIZE-1); y++) {
+ for(x=0; x<SSD1305_BUFFXSIZE - 1; x++)
+ write_data(v);
+ }
+}
+
+void ssd1305_cmd(unsigned char cmd, unsigned char num_args, unsigned char arg[])
+{
+ int i;
+
+ if (num_args > 2) return;
+ //putLabeledWord("num_args =", num_args);
+ write_cmd( cmd );
+ //putLabeledWord("cmd =", cmd);
+ for (i=0; i<num_args; i++)
+ {
+ write_cmd( arg[i] );
+ // putLabeledWord("arg =", arg[i]);
+ }
+}
+
+void ssd1305_data(unsigned char num_args, unsigned char arg[])
+{
+ int i;
+
+// if (num_args > 128) return;
+ //putLabeledWord("num_args =", num_args);
+ for (i=0; i<num_args; i++)
+ {
+ write_data( arg[i] );
+ // putLabeledWord("arg =", arg[i]);
+ }
+}
+
+void write_cmd(unsigned char cmd)
+{
+ SAMOSA_ADDRESS_BYTE = 0x02;
+ SAMOSA_DATA_BYTE = cmd;
+}
+
+void write_data(unsigned char data)
+{
+ (*(volatile unsigned long int *)(0x10c00000)) = 0x01;
+ (*(volatile unsigned long int *)(0x10c00004)) = (unsigned int)data;
+}
+
+COMMAND(ssd1305, command_ssd1305, "[command] -- init | clear | fill n| on | off | cmd c [a1] [a2] | data d1 [d2]...");
+void command_ssd1305(int argc, const char *argv[]) {
+
+ unsigned char cmd, num_args;
+ unsigned char args[4];
+ int c;
+
+ if (argc<2) {
+ putstr("ssd1305 init | clear | fill n | on | off | cmd c [a1] [a2] | data d1 [d2]...\r\n");
+ return;
+ }
+
+ if (!strcmp(argv[1],"init")) {
+ ssd1305_init();
+ } else if(!strcmp(argv[1],"clear")) {
+ ssd1305_clear();
+ } else if(!strcmp(argv[1],"on")) {
+ ssd1305_on();
+ } else if(!strcmp(argv[1],"off")) {
+ ssd1305_off();
+ } else if(!strcmp(argv[1],"cmd")) {
+ cmd = (unsigned char)strtoul(argv[2], NULL, 0);
+ num_args = argc - 3;
+ for (c=0; c<num_args; c++){
+ args[c] = (unsigned char)strtoul(argv[c+3], NULL, 0);
+ }
+ ssd1305_cmd( cmd, num_args, args);
+ } else if(!strcmp(argv[1],"data")) {
+ num_args = argc - 2;
+ for (c=0; c<num_args; c++){
+ args[c] = (unsigned char)strtoul(argv[c+2], NULL, 0);
+ }
+ ssd1305_data(num_args, args);
+ } else if(!strcmp(argv[1], "fill")) {
+ ssd1305_fill((int)strtoul(argv[2], NULL, 0));
+ }
+ else {
+ putstr("Command not known: ");
+ putstr(argv[1]);
+ putstr("\r\n");
+ }
+}
Property changes on: balloon/branches/display-dev/bootldr/ssd1305.c
___________________________________________________________________
Added: svn:executable
+ *
Added: balloon/branches/display-dev/bootldr/ssd1305.h
===================================================================
--- balloon/branches/display-dev/bootldr/ssd1305.h (rev 0)
+++ balloon/branches/display-dev/bootldr/ssd1305.h 2010-08-18 16:43:48 UTC (rev 1198)
@@ -0,0 +1,63 @@
+// SSD1305.h
+// bootldr interface to SSD1305 Based OLED dot matrix Display
+// including the Densitron LMR5428, which this code is intended for
+// Chris Jones, Martin-Jones Technology Ltd
+// David Bisset, Toby Churchill Ltd
+// August 2009
+// July 2010
+
+#ifndef _SSD1305_H
+#define _SSD1305_H
+
+#define SSD1305_XSIZE 128
+#define SSD1305_YSIZE 64
+#define SSD1305_BUFFXSIZE 131
+#define SSD1305_BUFFYSIZE 64
+
+// command table
+#define ST7529_CMD_EXT_IN 0x30
+#define ST7529_CMD_EXT_OUT 0x31
+
+#define SSD1305_CMD_SWRES 0xe2
+#define SSD1305_CMD_SETLOWCOLADD 0x00
+#define SSD1305_CMD_SETHIGHCOLADD 0x10
+#define SSD1305_CMD_SETMEMADDMODE 0x20
+#define SSD1305_CMD_SETCOLADD 0x21
+#define SSD1305_CMD_SETPAGEADD 0x22
+#define SSD1305_CMD_SETDISPSTART 0x40
+#define SSD1305_CMD_SETCONTRAST 0x81
+#define SSD1305_CMD_SETCBRIGHTNESS 0x82
+#define SSD1305_CMD_SETCLUT 0x91
+#define SSD1305_CMD_SETP0COLR 0x92
+#define SSD1305_CMD_SETP1COLR 0x93
+#define SSD1305_CMD_SETSEGREMAP 0xa0
+
+#define SSD1305_CMD_ALLDISPON 0xa4
+#define SSD1305_CMD_NORMALINV 0xa6
+#define SSD1305_CMD_SETMUXRATIO 0xa8
+#define SSD1305_CMD_DIMMODESETTING 0xab
+#define SSD1305_CMD_DISPOFF 0xae
+#define SSD1305_CMD_DISPDIM 0xac
+#define SSD1305_CMD_DISPON 0xaf
+
+#define SSD1305_CMD_SETSCANDIR 0xc0
+
+#define SSD1305_CMD_SETPAGEADD_PGMODE 0xb0
+#define SSD1305_CMD_SETSCANDIR 0xc0
+#define SSD1305_CMD_SETDISPOFFSET 0xd3
+#define SSD1305_CMD_SETCLKDIV 0xd5
+#define SSD1305_CMD_SETAREACOLRMODE 0xd8
+#define SSD1305_CMD_SETPRECHARGE 0xd9
+#define SSD1305_CMD_SETHWCONFIG 0xda
+#define SSD1305_CMD_SETRGHTHORIZSCROLL 0x29
+#define SSD1305_CMD_SETVERLEFTHORIZSCROLL 0x2a
+#define SSD1305_CMD_SETVERTSCROLLAREA 0xA3
+#define SSD1305_CMD_HORIZSCROLLEN 0x2f
+#define SSD1305_CMD_HORIZSCROLLDIS 0x2e
+#define SSD1305_CMD_VCOMLEVEL 0xdb
+#define SSD1305_CMD_MASTERCONFIG 0xad
+
+extern void ssd1305_init();
+extern void ssd1305_clear();
+extern void ssd1305_fill(int );
+#endif // _SSD1305_H
Property changes on: balloon/branches/display-dev/bootldr/ssd1305.h
___________________________________________________________________
Added: svn:executable
+ *