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: */