Index: rockbox-c240v2/firmware/target/arm/as3525/system-as3525.c
===================================================================
--- rockbox-c240v2.orig/firmware/target/arm/as3525/system-as3525.c 2010-04-07 01:47:32.500448422 +0900
+++ rockbox-c240v2/firmware/target/arm/as3525/system-as3525.c 2010-04-07 02:20:39.552631265 +0900
@@ -163,6 +163,41 @@
);
}

+#if defined(SANSA_C200V2)
+#include "dbop-as3525.h"
+
+int c200v2_variant = 0;
+
+static void check_model_variant(void)
+{
+ unsigned int i;
+ unsigned int saved_dir = GPIOA_DIR;
+
+ /* Make A7 input */
+ GPIOA_DIR &= ~(1<<7);
+ /* wait a little to allow the pullup/pulldown resistor
+ * to charge the input capacitance */
+ for (i=0; i<1000; i++) asm volatile ("nop\n");
+ /* read the pullup/pulldown value on A7 to determine the variant */
+ if (GPIOA_PIN(7) == 0) {
+ /*
+ * Backlight on A7.
+ */
+ c200v2_variant = 1;
+ } else {
+ /*
+ * Backlight on A5.
+ */
+ c200v2_variant = 0;
+ }
+ GPIOA_DIR = saved_dir;
+}
+#else
+static inline void check_model_variant(void)
+{
+}
+#endif /* SANSA_C200V2*/
+
#if defined(BOOTLOADER)
static void sdram_delay(void)
{
@@ -319,6 +354,7 @@
fmradio_i2c_init();
#endif
#endif /* !BOOTLOADER */
+ check_model_variant();
}

void system_reboot(void)
Index: rockbox-c240v2/firmware/target/arm/as3525/system-target.h
===================================================================
--- rockbox-c240v2.orig/firmware/target/arm/as3525/system-target.h 2010-04-07 01:47:32.464446370 +0900
+++ rockbox-c240v2/firmware/target/arm/as3525/system-target.h 2010-04-07 02:22:42.660376620 +0900
@@ -32,4 +32,10 @@
#define UNCACHED_ADDR(a) ((typeof(a)) ((uintptr_t)(a) + 0x10000000))
#endif

+
+#ifdef SANSA_C200V2
+/* 0: Backlight on A5, 1: Backlight on A7 */
+extern int c200v2_variant;
+#endif
+
#endif /* SYSTEM_TARGET_H */
Index: rockbox-c240v2/firmware/target/arm/as3525/debug-as3525.c
===================================================================
--- rockbox-c240v2.orig/firmware/target/arm/as3525/debug-as3525.c 2010-04-07 01:47:32.484448955 +0900
+++ rockbox-c240v2/firmware/target/arm/as3525/debug-as3525.c 2010-04-07 02:20:52.669452702 +0900
@@ -256,6 +256,21 @@
{
while(1)
{
+#ifdef SANSA_C200V2
+ lcd_clear_display();
+ line = 0;
+ lcd_puts(0, line++, "[Submodel:]");
+ lcd_putsf(0, line++, "C200v2 variant %d", c200v2_variant);
+ lcd_update();
+ int btn = button_get(1);
+ if(btn == (DEBUG_CANCEL|BUTTON_REL))
+ goto end;
+ else if(btn == (BUTTON_DOWN|BUTTON_REL))
+ break;
+ }
+ while(1)
+ {
+#endif
lcd_clear_display();
line = 0;
lcd_puts(0, line++, "[Clock Frequencies:]");
Index: rockbox-c240v2/firmware/target/arm/as3525/sansa-c200v2/backlight-c200v2.c
===================================================================
--- rockbox-c240v2.orig/firmware/target/arm/as3525/sansa-c200v2/backlight-c200v2.c 2010-04-07 01:47:32.476446845 +0900
+++ rockbox-c240v2/firmware/target/arm/as3525/sansa-c200v2/backlight-c200v2.c 2010-04-07 01:47:44.781215996 +0900
@@ -37,26 +37,45 @@

static void _ll_backlight_on(void)
{
- GPIOA_PIN(5) = 1<<5;
+ if (c200v2_variant == 0) {
+ GPIOA_PIN(5) = 1<<5;
+ } else {
+ GPIOA_PIN(7) = 1<<7;
+ }
}

static void _ll_backlight_off(void)
{
- GPIOA_PIN(5) = 0;
+ if (c200v2_variant == 0) {
+ GPIOA_PIN(5) = 0;
+ } else {
+ GPIOA_PIN(7) = 0;
+ }
}

void _backlight_pwm(int on)
{
if (on) {
_ll_backlight_on();
+ if (c200v2_variant == 1) {
+ GPIOA_PIN(5) = 1<<5;
+ }
} else {
_ll_backlight_off();
+ if (c200v2_variant == 1) {
+ GPIOA_PIN(5) = 0;
+ }
}
}

bool _backlight_init(void)
{
GPIOA_DIR |= 1<<5;
+ if (c200v2_variant == 1) {
+ /* On this variant A7 is the backlight and
+ * A5 is the buttonlight */
+ GPIOA_DIR |= 1<<7;
+ }
return true;
}

@@ -93,20 +112,30 @@

void _buttonlight_on(void)
{
- /* Needed for buttonlight and MicroSD to work at the same time */
- /* Turn ROD control on, as the OF does */
- GPIOD_DIR |= (1<<7);
- SD_MCI_POWER |= (1<<7);
- GPIOD_PIN(7) = (1<<7);
+ if (c200v2_variant == 0) {
+ /* Needed for buttonlight and MicroSD to work at the same time */
+ /* Turn ROD control on, as the OF does */
+ GPIOD_DIR |= (1<<7);
+ SD_MCI_POWER |= (1<<7);
+ GPIOD_PIN(7) = (1<<7);
+ } else {
+ GPIOA_PIN(5) = 1<<5;
+ }
buttonlight_is_on = 1;
}

void _buttonlight_off(void)
{
- /* Needed for buttonlight and MicroSD to work at the same time */
- /* Turn ROD control off, as the OF does */
- SD_MCI_POWER &= ~(1<<7);
- GPIOD_PIN(7) = 0;
- GPIOD_DIR &= ~(1<<7);
+ if (c200v2_variant == 0) {
+ /* Needed for buttonlight and MicroSD to work at the same time */
+ /* Turn ROD control off, as the OF does */
+ SD_MCI_POWER &= ~(1<<7);
+ GPIOD_PIN(7) = 0;
+ GPIOD_DIR &= ~(1<<7);
+ } else {
+ GPIOA_PIN(5) = 0;
+ }
buttonlight_is_on = 0;
}
+
+/* vim:set ts=4 sw=4 et: */