summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorMarc Guay <marcguay@rockbox.org>2008-06-21 15:18:36 +0000
committerMarc Guay <marcguay@rockbox.org>2008-06-21 15:18:36 +0000
commitb93667b30699a18daf3699cc969ad858077e406f (patch)
treeb3a1932ff6227f0434e86efded2205a16864898b /firmware
parentfdd5c3f1a3c18806329a88b8f243c8775f2a8571 (diff)
Add the Sansa c100 as a build target with basic drivers.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17742 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r--firmware/SOURCES21
-rw-r--r--firmware/export/config-m200.h2
-rw-r--r--firmware/export/config.h7
-rw-r--r--firmware/target/arm/tcc77x/c100/adc-target.h24
-rw-r--r--firmware/target/arm/tcc77x/c100/backlight-target.h38
-rw-r--r--firmware/target/arm/tcc77x/c100/button-c100.c62
-rw-r--r--firmware/target/arm/tcc77x/c100/button-target.h52
-rw-r--r--firmware/target/arm/tcc77x/c100/lcd-S6B33B2.c349
-rw-r--r--firmware/target/arm/tcc77x/c100/power-c100.c66
-rw-r--r--firmware/target/arm/tcc77x/system-tcc77x.c34
10 files changed, 648 insertions, 7 deletions
diff --git a/firmware/SOURCES b/firmware/SOURCES
index 88e48bb226..1a01fd5af4 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -972,7 +972,26 @@ target/arm/tcc77x/debug-tcc77x.c
target/arm/tcc77x/pcm-tcc77x.c
#endif /* BOOTLOADER */
#endif /* SIMULATOR */
-#endif /* LOGIK_DAX */
+#endif /* SANSA_M200 */
+
+#ifdef SANSA_C100
+#ifndef SIMULATOR
+target/arm/tcc77x/adc-tcc77x.c
+target/arm/tcc77x/ata-nand-tcc77x.c
+target/arm/tcc77x/kernel-tcc77x.c
+target/arm/tcc77x/c100/lcd-S6B33B2.c
+target/arm/tcc77x/powermgmt-tcc77x.c
+target/arm/tcc77x/system-tcc77x.c
+target/arm/tcc77x/timer-tcc77x.c
+target/arm/tcc77x/usb-tcc77x.c
+target/arm/tcc77x/c100/button-c100.c
+target/arm/tcc77x/c100/power-c100.c
+#ifndef BOOTLOADER
+target/arm/tcc77x/debug-tcc77x.c
+target/arm/tcc77x/pcm-tcc77x.c
+#endif /* BOOTLOADER */
+#endif /* SIMULATOR */
+#endif /* SANSA_C100 */
#ifdef IAUDIO_7
#ifndef SIMULATOR
diff --git a/firmware/export/config-m200.h b/firmware/export/config-m200.h
index 760474d628..e3cb42e403 100644
--- a/firmware/export/config-m200.h
+++ b/firmware/export/config-m200.h
@@ -4,7 +4,7 @@
#define TARGET_TREE /* this target is using the target tree system */
/* For Rolo and boot loader */
-#define MODEL_NUMBER 28
+#define MODEL_NUMBER 29
/* define this if you have recording possibility */
//#define HAVE_RECORDING
diff --git a/firmware/export/config.h b/firmware/export/config.h
index c7e204c5df..c0e2b43d97 100644
--- a/firmware/export/config.h
+++ b/firmware/export/config.h
@@ -51,6 +51,7 @@
#define DSC25 25
#define DM320 320
#define IMX31L 31
+#define TCC770 770
#define TCC771L 771
#define TCC773L 773
#define TCC7801 7801
@@ -83,6 +84,7 @@
#define SANSA_M200_PAD 25
#define CREATIVEZV_PAD 26
#define PHILIPS_SA9200_PAD 27
+#define SANSA_C100_PAD 28
/* CONFIG_REMOTE_KEYPAD */
#define H100_REMOTE 1
@@ -122,6 +124,7 @@
#define LCD_TL0350A 23 /* as used by the iAudio M3 remote, treated as main LCD */
#define LCD_COWOND2 24 /* as used by Cowon D2 - LTV250QV, TCC7801 driver */
#define LCD_SA9200 25 /* as used by the Philips SA9200 */
+#define LCD_S6B33B2 26 /* as used by the Sansa c100 */
/* LCD_PIXELFORMAT */
#define HORIZONTAL_PACKING 1
@@ -262,6 +265,8 @@
#include "config-creativezv.h"
#elif defined(PHILIPS_SA9200)
#include "config-sa9200.h"
+#elif defined(SANSA_C100)
+#include "config-c100.h"
#else
/* no known platform */
#endif
@@ -391,7 +396,7 @@
#endif
/* define for all cpus from TCC77X family */
-#if (CONFIG_CPU == TCC771L) || (CONFIG_CPU == TCC773L)
+#if (CONFIG_CPU == TCC771L) || (CONFIG_CPU == TCC773L) || (CONFIG_CPU == TCC770)
#define CPU_TCC77X
#endif
diff --git a/firmware/target/arm/tcc77x/c100/adc-target.h b/firmware/target/arm/tcc77x/c100/adc-target.h
new file mode 100644
index 0000000000..a4dcab437e
--- /dev/null
+++ b/firmware/target/arm/tcc77x/c100/adc-target.h
@@ -0,0 +1,24 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id: adc-target.h 15339 2007-10-28 11:08:10Z dave $
+ *
+ * Copyright (C) 2007 Dave Chapman
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#ifndef _ADC_TARGET_H_
+#define _ADC_TARGET_H_
+
+#define NUM_ADC_CHANNELS 8
+
+#endif /* _ADC_TARGET_H_ */
diff --git a/firmware/target/arm/tcc77x/c100/backlight-target.h b/firmware/target/arm/tcc77x/c100/backlight-target.h
new file mode 100644
index 0000000000..fefd5bc5dc
--- /dev/null
+++ b/firmware/target/arm/tcc77x/c100/backlight-target.h
@@ -0,0 +1,38 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id: backlight-target.h 15599 2007-11-12 18:49:53Z amiconn $
+ *
+ * Copyright (C) 2007 by Dave Chapman
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#ifndef BACKLIGHT_TARGET_H
+#define BACKLIGHT_TARGET_H
+
+#include "tcc77x.h"
+
+#define _backlight_init() true
+
+static inline void _backlight_on(void)
+{
+ /* Enable backlight */
+ GPIOE |= 0x2;
+}
+
+static inline void _backlight_off(void)
+{
+ /* Disable backlight */
+ GPIOE &= ~0x2;
+}
+
+#endif
diff --git a/firmware/target/arm/tcc77x/c100/button-c100.c b/firmware/target/arm/tcc77x/c100/button-c100.c
new file mode 100644
index 0000000000..0183a833ae
--- /dev/null
+++ b/firmware/target/arm/tcc77x/c100/button-c100.c
@@ -0,0 +1,62 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id: button-logikdax.c 15396 2007-11-01 23:38:57Z dave $
+ *
+ * Copyright (C) 2007 by Dave Chapman
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include "config.h"
+#include "cpu.h"
+#include "button.h"
+#include "adc.h"
+
+void button_init_device(void)
+{
+ GPIOA_DIR |= 0xC;
+}
+
+int button_read_device(void)
+{
+ int btn = BUTTON_NONE;
+
+ if (!button_hold()){
+ GPIOA |= 0x4;
+ GPIOA &= ~0x8;
+
+ int i=20; while (i--);
+
+ if (GPIOA & 0x10) btn |= BUTTON_PLAYPAUSE; /* up */
+ if (GPIOA & 0x20) btn |= BUTTON_RIGHT;
+ if (GPIOA & 0x40) btn |= BUTTON_LEFT;
+
+ GPIOA |= 0x8;
+ GPIOA &= ~0x4;
+
+ i=20; while (i--);
+
+ if (GPIOA & 0x10) btn |= BUTTON_VOLUP;
+ if (GPIOA & 0x20) btn |= BUTTON_VOLDOWN;
+ if (GPIOA & 0x40) btn |= BUTTON_REPEATAB; /* down */
+
+ if (GPIOA & 0x80) btn |= BUTTON_SELECT;
+ if (GPIOA & 0x100) btn |= BUTTON_MENU;
+ }
+ return btn;
+}
+
+bool button_hold(void)
+{
+ return (GPIOA & 0x2);
+}
diff --git a/firmware/target/arm/tcc77x/c100/button-target.h b/firmware/target/arm/tcc77x/c100/button-target.h
new file mode 100644
index 0000000000..139be97b55
--- /dev/null
+++ b/firmware/target/arm/tcc77x/c100/button-target.h
@@ -0,0 +1,52 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id: button-target.h 15396 2007-11-01 23:38:57Z dave $
+ *
+ * Copyright (C) 2007 by Dave Chapman
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#ifndef _BUTTON_TARGET_H_
+#define _BUTTON_TARGET_H_
+
+#include <stdbool.h>
+#include "config.h"
+
+#define HAS_BUTTON_HOLD
+
+void button_init_device(void);
+int button_read_device(void);
+bool button_hold(void);
+
+/* Main unit's buttons */
+#define BUTTON_MENU 0x00000001
+#define BUTTON_VOLUP 0x00000002
+#define BUTTON_VOLDOWN 0x00000004
+#define BUTTON_PLAYPAUSE 0x00000008
+#define BUTTON_REPEATAB 0x00000010
+#define BUTTON_LEFT 0x00000020
+#define BUTTON_RIGHT 0x00000040
+#define BUTTON_SELECT 0x00000080
+
+#define BUTTON_MAIN (BUTTON_MENU|BUTTON_VOLUP|BUTTON_VOLDOWN\
+ |BUTTON_PLAYPAUSE|BUTTON_REPEATAB|BUTTON_LEFT\
+ |BUTTON_RIGHT|BUTTON_SELECT)
+
+#define BUTTON_REMOTE 0
+
+/* Software power-off */
+#define POWEROFF_BUTTON BUTTON_MENU
+#define POWEROFF_COUNT 40
+
+#endif /* _BUTTON_TARGET_H_ */
diff --git a/firmware/target/arm/tcc77x/c100/lcd-S6B33B2.c b/firmware/target/arm/tcc77x/c100/lcd-S6B33B2.c
new file mode 100644
index 0000000000..79e14aba70
--- /dev/null
+++ b/firmware/target/arm/tcc77x/c100/lcd-S6B33B2.c
@@ -0,0 +1,349 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id: lcd-S6B33B2.c 16981 2008-06-09 04:34:57Z jethead71 $
+ *
+ * Copyright (C) 2007 by Mark Arigo
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#include "config.h"
+#include "cpu.h"
+#include "lcd.h"
+#include "kernel.h"
+#include "system.h"
+
+/* Display status */
+static unsigned lcd_yuv_options SHAREDBSS_ATTR = 0;
+
+/* LCD command set for Samsung S6B33B2 */
+
+#define R_NOP 0x00
+#define R_OSCILLATION_MODE 0x02
+#define R_DRIVER_OUTPUT_MODE 0x10
+#define R_DCDC_SET 0x20
+#define R_BIAS_SET 0x22
+#define R_DCDC_CLOCK_DIV 0x24
+#define R_DCDC_AMP_ONOFF 0x26
+#define R_TEMP_COMPENSATION 0x28
+#define R_CONTRAST_CONTROL1 0x2a
+#define R_CONTRAST_CONTROL2 0x2b
+#define R_STANDBY_OFF 0x2c
+#define R_STANDBY_ON 0x2d
+#define R_DDRAM_BURST_OFF 0x2e
+#define R_DDRAM_BURST_ON 0x2f
+#define R_ADDRESSING_MODE 0x30
+#define R_ROW_VECTOR_MODE 0x32
+#define R_N_LINE_INVERSION 0x34
+#define R_FRAME_FREQ_CONTROL 0x36
+#define R_RED_PALETTE 0x38
+#define R_GREEN_PALETTE 0x3a
+#define R_BLUE_PALETTE 0x3c
+#define R_ENTRY_MODE 0x40
+#define R_X_ADDR_AREA 0x42
+#define R_Y_ADDR_AREA 0x43
+#define R_RAM_SKIP_AREA 0x45
+#define R_DISPLAY_OFF 0x50
+#define R_DISPLAY_ON 0x51
+#define R_SPEC_DISPLAY_PATTERN 0x53
+#define R_PARTIAL_DISPLAY_MODE 0x55
+#define R_PARTIAL_START_LINE 0x56
+#define R_PARTIAL_END_LINE 0x57
+#define R_AREA_SCROLL_MODE 0x59
+#define R_SCROLL_START_LINE 0x5a
+#define R_DATA_FORMAT_SELECT 0x60
+
+/* TCC77x specific defines */
+#define LCD_BASE 0x50000000
+#define LCD_CMD *(volatile unsigned char*)(LCD_BASE)
+#define LCD_DATA *(volatile unsigned char*)(LCD_BASE+1)
+
+static void lcd_send_command(unsigned cmd)
+{
+ LCD_CMD = cmd;
+
+ asm volatile (
+ "nop \n\t"
+ "nop \n\t"
+ "nop \n\t"
+ );
+}
+
+static void lcd_send_data(unsigned data)
+{
+ LCD_DATA = (data & 0xff00) >> 8;
+ LCD_DATA = (data & 0x00ff);
+}
+
+/* End of TCC77x specific defines */
+
+/* LCD init */
+void lcd_init_device(void)
+{
+ uint32_t bus_width;
+
+ /* Telechips init the same as the original firmware */
+ bus_width = ((MCFG >> 11) & 0x3) ^ 3;
+
+ CSCFG1 = (bus_width << 28) |
+ (3 << 26) | /* MTYPE = 3 */
+ ((LCD_BASE >> 28) << 22) | /* CSBASE = 0x5 */
+ (1 << 20) | /* Unknown */
+ (2 << 11) | /* Setup time = 2 cycles */
+ (2 << 3) | /* Pulse width = 2+1 cycles */
+ (2 << 0); /* Hold time = 2 cycle */
+
+ GPIOE &= ~0x8;
+ sleep(HZ/100); /* 10ms */
+
+ GPIOE |= 0x08;
+ sleep(HZ/100); /* 10ms */
+
+ lcd_send_command(R_STANDBY_OFF);
+ sleep(HZ/20); /* 50ms */
+
+ lcd_send_command(R_OSCILLATION_MODE);
+ lcd_send_command(0x01);
+ sleep(HZ/100); /* 10ms */
+
+ lcd_send_command(R_DCDC_AMP_ONOFF);
+ lcd_send_command(0x01);
+ sleep(HZ/100); /* 10ms */
+
+ lcd_send_command(R_DCDC_AMP_ONOFF);
+ lcd_send_command(0x09);
+ sleep(HZ/100); /* 10ms */
+
+ lcd_send_command(R_DCDC_AMP_ONOFF);
+ lcd_send_command(0x0b);
+ sleep(HZ/100); /* 10ms */
+
+ lcd_send_command(R_DCDC_AMP_ONOFF);
+ lcd_send_command(0x0f);
+ sleep(HZ/100); /* 10ms */
+
+ lcd_send_command(R_DCDC_SET);
+ lcd_send_command(0x01);
+ sleep(HZ/100); /* 10ms */
+ sleep(HZ/10); /* 100ms */
+
+ lcd_send_command(R_TEMP_COMPENSATION);
+ lcd_send_command(0x01);
+ sleep(HZ/100); /* 10ms */
+
+ lcd_send_command(R_DRIVER_OUTPUT_MODE);
+ lcd_send_command(0x03);
+
+ lcd_send_command(R_ENTRY_MODE);
+ lcd_send_command(0x81);
+
+ lcd_send_command(R_N_LINE_INVERSION);
+ lcd_send_command(0x04);
+ lcd_send_command(0xfa);
+ lcd_send_command(0x5f);
+
+ lcd_set_contrast(0x28);
+
+ lcd_send_command(R_SPEC_DISPLAY_PATTERN);
+ lcd_send_command(0x0);
+ sleep(HZ/100); /* 10ms */
+
+ lcd_send_command(R_ADDRESSING_MODE);
+ lcd_send_command(0x0);
+ sleep(HZ/100); /* 10ms */
+
+ lcd_send_command(R_PARTIAL_DISPLAY_MODE);
+ lcd_send_command(0x0);
+ sleep(HZ/100); /* 10ms */
+
+ lcd_send_command(R_X_ADDR_AREA);
+ lcd_send_command(0);
+ lcd_send_command(0x80);
+
+ lcd_send_command(R_Y_ADDR_AREA);
+ lcd_send_command(0x0);
+ lcd_send_command(0x80);
+
+ lcd_send_command(R_DISPLAY_ON);
+
+ lcd_send_command(R_SPEC_DISPLAY_PATTERN);
+ lcd_send_command(0x0);
+
+ /* Rockbox init */
+ lcd_clear_display();
+ lcd_update();
+}
+
+/*** hardware configuration ***/
+int lcd_default_contrast(void)
+{
+ return 0x28;
+}
+
+void lcd_set_contrast(int val)
+{
+ //val &= 0xFF;
+ lcd_send_command(R_CONTRAST_CONTROL1);
+ lcd_send_command(val);
+}
+
+void lcd_set_invert_display(bool yesno)
+{
+ /* TODO: Implement lcd_set_invert_display() */
+ (void)yesno;
+}
+
+/* turn the display upside down (call lcd_update() afterwards) */
+void lcd_set_flip(bool yesno)
+{
+ lcd_send_command(R_DRIVER_OUTPUT_MODE);
+ lcd_send_command(yesno ? 0x02 : 0x07);
+}
+
+/*** update functions ***/
+
+/*** update functions ***/
+
+void lcd_yuv_set_options(unsigned options)
+{
+ lcd_yuv_options = options;
+}
+
+/* Line write helper function for lcd_yuv_blit. Write two lines of yuv420. */
+extern void lcd_write_yuv420_lines(unsigned char const * const src[3],
+ int width,
+ int stride);
+extern void lcd_write_yuv420_lines_odither(unsigned char const * const src[3],
+ int width,
+ int stride,
+ int x_screen, /* To align dither pattern */
+ int y_screen);
+/* Performance function to blit a YUV bitmap directly to the LCD */
+void lcd_blit_yuv(unsigned char * const src[3],
+ int src_x, int src_y, int stride,
+ int x, int y, int width, int height)
+{
+ unsigned char const * yuv_src[3];
+ off_t z;
+
+ /* Sorry, but width and height must be >= 2 or else */
+ width &= ~1;
+ height >>= 1;
+
+ y += 0x1a;
+
+ z = stride*src_y;
+ yuv_src[0] = src[0] + z + src_x;
+ yuv_src[1] = src[1] + (z >> 2) + (src_x >> 1);
+ yuv_src[2] = src[2] + (yuv_src[1] - src[1]);
+
+ lcd_send_command(R_ENTRY_MODE);
+ lcd_send_command(0x80);
+
+ lcd_send_command(R_X_ADDR_AREA);
+ lcd_send_command(x);
+ lcd_send_command(x + width - 1);
+
+ if (lcd_yuv_options & LCD_YUV_DITHER)
+ {
+ do
+ {
+ lcd_send_command(R_Y_ADDR_AREA);
+ lcd_send_command(y);
+ lcd_send_command(y + 1);
+
+ /* NOP needed because on some c200s, the previous lcd_send_command
+ is interpreted as a separate command instead of part of
+ R_Y_ADDR_AREA. */
+ lcd_send_command(R_NOP);
+
+ lcd_write_yuv420_lines_odither(yuv_src, width, stride, x, y);
+ yuv_src[0] += stride << 1; /* Skip down two luma lines */
+ yuv_src[1] += stride >> 1; /* Skip down one chroma line */
+ yuv_src[2] += stride >> 1;
+ y += 2;
+ }
+ while (--height > 0);
+ }
+ else
+ {
+ do
+ {
+ lcd_send_command(R_Y_ADDR_AREA);
+ lcd_send_command(y);
+ lcd_send_command(y + 1);
+
+ lcd_send_command(R_NOP);
+
+ lcd_write_yuv420_lines(yuv_src, width, stride);
+ yuv_src[0] += stride << 1; /* Skip down two luma lines */
+ yuv_src[1] += stride >> 1; /* Skip down one chroma line */
+ yuv_src[2] += stride >> 1;
+ y += 2;
+ }
+ while (--height > 0);
+ }
+}
+
+
+/* Update the display.
+ This must be called after all other LCD functions that change the display. */
+void lcd_update(void)
+{
+ lcd_update_rect(0, 0, LCD_WIDTH, LCD_HEIGHT);
+}
+
+/* Update a fraction of the display. */
+void lcd_update_rect(int x, int y, int width, int height)
+{
+ const fb_data *addr;
+
+ if (x + width >= LCD_WIDTH)
+ width = LCD_WIDTH - x;
+ if (y + height >= LCD_HEIGHT)
+ height = LCD_HEIGHT - y;
+
+ if ((width <= 0) || (height <= 0))
+ return; /* Nothing left to do. */
+
+ addr = &lcd_framebuffer[y][x];
+
+ if (width <= 1) {
+ lcd_send_command(R_ENTRY_MODE); /* The X end address must be larger */
+ lcd_send_command(0x80); /* that the X start address, so we */
+ lcd_send_command(R_X_ADDR_AREA); /* switch to vertical mode for */
+ lcd_send_command(x); /* single column updates and set */
+ lcd_send_command(x + 1); /* the window width to 2 */
+ } else {
+ lcd_send_command(R_ENTRY_MODE);
+ lcd_send_command(0x82);
+ lcd_send_command(R_X_ADDR_AREA);
+ lcd_send_command(x);
+ lcd_send_command(x + width - 1);
+ }
+
+ lcd_send_command(R_Y_ADDR_AREA);
+ lcd_send_command(y);
+ lcd_send_command(y + height - 1);
+
+ /* NOP needed because on some c200s, the previous lcd_send_command is
+ interpreted as a separate command instead of part of R_Y_ADDR_AREA. */
+ lcd_send_command(R_NOP);
+
+ do {
+ int w = width;
+ do {
+ lcd_send_data(*addr++);
+ } while (--w > 0);
+ addr += LCD_WIDTH - width;
+ } while (--height > 0);
+}
diff --git a/firmware/target/arm/tcc77x/c100/power-c100.c b/firmware/target/arm/tcc77x/c100/power-c100.c
new file mode 100644
index 0000000000..eb3012fde6
--- /dev/null
+++ b/firmware/target/arm/tcc77x/c100/power-c100.c
@@ -0,0 +1,66 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id: power-logikdax.c 15339 2007-10-28 11:08:10Z dave $
+ *
+ * Copyright (C) 2007 Dave Chapman
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#include "config.h"
+#include "cpu.h"
+#include <stdbool.h>
+#include "kernel.h"
+#include "system.h"
+#include "power.h"
+
+#ifndef SIMULATOR
+
+void power_init(void)
+{
+}
+
+void ide_power_enable(bool on)
+{
+}
+
+bool ide_powered(void)
+{
+ return true;
+}
+
+void power_off(void)
+{
+}
+
+#else /* SIMULATOR */
+
+bool charger_inserted(void)
+{
+ return false;
+}
+
+void charger_enable(bool on)
+{
+ (void)on;
+}
+
+void power_off(void)
+{
+}
+
+void ide_power_enable(bool on)
+{
+ (void)on;
+}
+
+#endif /* SIMULATOR */
diff --git a/firmware/target/arm/tcc77x/system-tcc77x.c b/firmware/target/arm/tcc77x/system-tcc77x.c
index 2628d9f0ed..b338281c48 100644
--- a/firmware/target/arm/tcc77x/system-tcc77x.c
+++ b/firmware/target/arm/tcc77x/system-tcc77x.c
@@ -61,15 +61,19 @@ static void gpio_init(void)
GPIOD_FUNC = 0;
GPIOD_DIR = 0x3f0;
GPIOD = 0xe0;
+
GPIOE_FUNC = 0;
GPIOE_DIR = 0xe0;
GPIOE = 0;
+
GPIOA_FUNC = 0;
GPIOA_DIR = 0xffff1000; /* 0 - 0xf000 */
GPIOA = 0x1080;
+
GPIOB_FUNC = 0x16a3;
GPIOB_DIR = 0x6ffff;
GPIOB = 0;
+
GPIOC_FUNC = 1;
GPIOC_DIR = 0x03ffffff; /* mvn r2, 0xfc000000 */
GPIOC = 0;
@@ -99,6 +103,28 @@ static void gpio_init(void)
{
/* TODO - Implement for M200 */
}
+#elif defined(SANSA_C100)
+static void gpio_init(void)
+{
+ /* Do what the original firmware does */
+ GPIOA_FUNC = 0;
+ GPIOB_FUNC = 0x16A3;
+ GPIOC_FUNC = 1;
+ GPIOD_FUNC |= 2;
+ GPIOE_FUNC = 0;
+
+ GPIOA_DIR = 0xFFFF0E00;
+ GPIOB_DIR = 0x6FFFF;
+ GPIOC_DIR = 0x03FFFFFF;
+ GPIOD_DIR = 0x3F7;
+ GPIOE_DIR = 0x9B;
+
+ GPIOA = 0x80;
+ GPIOB = 0;
+ GPIOC = 0;
+ GPIOD |= 0xC0;
+ GPIOE = 0x9B;
+}
#endif
/* Second function called in the original firmware's startup code - we just
@@ -158,7 +184,7 @@ http://infocenter.arm.com/help/topic/com.arm.doc.ddi0201d/DDI0201D_arm946es_r1p1
"mcr p15, 0, r0, c6, c0, 0 \n\t"
"mcr p15, 0, r0, c6, c0, 1 \n\t"
-#ifdef LOGIK_DAX
+#if defined(LOGIK_DAX) || defined(SANSA_C100)
/* Address region 1 - addr 0x2fff0000, size=64KB, enabled*/
"ldr r0, =0x2fff001f \n\t"
#elif defined(IAUDIO_7)
@@ -208,7 +234,7 @@ http://infocenter.arm.com/help/topic/com.arm.doc.ddi0201d/DDI0201D_arm946es_r1p1
"mcr p15, 0, r0, c6, c7, 0 \n\t"
"mcr p15, 0, r0, c6, c7, 1 \n\t"
-
+
/* Register 5 - Access Permission Registers */
"ldr r0, =0xffff \n\t"
@@ -218,9 +244,9 @@ http://infocenter.arm.com/help/topic/com.arm.doc.ddi0201d/DDI0201D_arm946es_r1p1
"mov r0, #0xa7 \n\t"
"mcr p15, 0, r0, c3, c0, 0 \n\t" /* set write buffer control register */
-#ifdef LOGIK_DAX
+#if defined(LOGIK_DAX) || defined(SANSA_C100)
"mov r0, #0xa5 \n\t"
-#elif defined(IAUDIO_7) || defined(SANSA_M200)
+#elif defined(IAUDIO_7) || defined(SANSA_M200)
"mov r0, #0xa7 \n\t"
#elif
#error NOT DEFINED FOR THIS TARGET!