[Balloon-svn] r1198 - balloon/branches/display-dev/bootldr

Top Page
Attachments:
Message as email
+ (text/plain)
Delete this message
Reply to this message
Author: subversion@balloonboard.org
Date:  
To: balloon-svn
Subject: [Balloon-svn] r1198 - balloon/branches/display-dev/bootldr
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
+ *