Initial commit for the Creative ZEN V

Change-Id: I3408cfdf742ea5995d5c87bf76653f436e1ec2b0
diff --git a/firmware/SOURCES b/firmware/SOURCES
index b96912e..49a4edc 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -1163,13 +1163,16 @@
 target/arm/tms320dm320/creative-zvm/usb-creativezvm.c
 #endif /* CREATIVE_ZVx */
 
-#if defined(CREATIVE_ZEN) || defined(CREATIVE_ZENXFI) || defined(CREATIVE_ZENMOZAIC)
+#if defined(CREATIVE_ZEN) || defined(CREATIVE_ZENXFI) || defined(CREATIVE_ZENMOZAIC) \
+    || defined(CREATIVE_ZENV)
 target/arm/imx233/creative-zen/fmradio-i2c-zen.c
 target/arm/imx233/creative-zen/backlight-zen.c
 # if defined(CREATIVE_ZEN) || defined(CREATIVE_ZENXFI)
 target/arm/imx233/creative-zen/lcd-zen.c
 # elif defined(CREATIVE_ZENMOZAIC)
 target/arm/imx233/creative-zen/lcd-zenmozaic.c
+# elif defined(CREATIVE_ZENV)
+target/arm/imx233/creative-zen/lcd-zenv.c
 #endif
 target/arm/imx233/creative-zen/button-zen.c
 target/arm/imx233/creative-zen/debug-zen.c
diff --git a/firmware/export/config.h b/firmware/export/config.h
index ffe34fb..3c4c72c 100644
--- a/firmware/export/config.h
+++ b/firmware/export/config.h
@@ -257,6 +257,7 @@
 #define LCD_CREATIVEZEN  55 /* as used by the Creative ZEN (X-Fi) (LMS250GF03-001(S6D0139)) */
 #define LCD_CREATIVEZENMOZAIC 56 /* as used by the Creative ZEN Mozaic (FGD0801) */
 #define LCD_ILI9342C   57 /* another type of lcd used by HiFi E.T MA9/MA8 */
+#define LCD_CREATIVEZENV  58 /* as used by the Creativr Zen V (Plus) */
 
 /* LCD_PIXELFORMAT */
 #define HORIZONTAL_PACKING 1
@@ -531,6 +532,8 @@
 #include "config/creativezenmozaic.h"
 #elif defined(CREATIVE_ZEN)
 #include "config/creativezen.h"
+#elif defined(CREATIVE_ZENV)
+#include "config/creativezenv.h"
 #elif defined(MA9)
 #include "config/hifietma9.h"
 #elif defined(MA9C)
diff --git a/firmware/export/config/creativezenv.h b/firmware/export/config/creativezenv.h
new file mode 100644
index 0000000..e175848
--- /dev/null
+++ b/firmware/export/config/creativezenv.h
@@ -0,0 +1,196 @@
+/*
+ * This config file is for the Creative ZEN V
+ */
+#define IMX233_SUBTARGET    3600
+#define IMX233_PACKAGE      IMX233_BGA169
+#define IMX233_PARTITIONS   IMX233_CREATIVE
+
+/* For Rolo and boot loader */
+#define MODEL_NUMBER 85
+#define MODEL_NAME   "Creative ZEN V"
+
+#define HW_SAMPR_CAPS       SAMPR_CAP_ALL
+
+/* define this if you have recording possibility */
+#define HAVE_RECORDING
+
+#define REC_SAMPR_CAPS      SAMPR_CAP_ALL
+
+/* Default recording levels */
+#define DEFAULT_REC_MIC_GAIN    23
+#define DEFAULT_REC_LEFT_GAIN   23
+#define DEFAULT_REC_RIGHT_GAIN  23
+
+/* Define bitmask of input sources - recordable bitmask can be defined
+   explicitly if different */
+#define INPUT_SRC_CAPS SRC_CAP_MIC
+
+/* define this if you have a bitmap LCD display */
+#define HAVE_LCD_BITMAP
+/* define this if you have a colour LCD */
+#define HAVE_LCD_COLOR
+
+#ifndef BOOTLOADER
+#define HAVE_ALBUMART
+
+/* define this to enable bitmap scaling */
+#define HAVE_BMP_SCALING
+
+/* define this to enable JPEG decoding */
+#define HAVE_JPEG
+
+/* Define this if a programmable hotkey is mapped */
+#define HAVE_HOTKEY
+
+/* define this if you have access to the quickscreen */
+#define HAVE_QUICKSCREEN
+
+/* define this if you would like tagcache to build on this target */
+#define HAVE_TAGCACHE
+
+/* define this if the target has volume keys which can be used in the lists */
+#define HAVE_VOLUME_IN_LIST
+
+/* define this if you have LCD enable function */
+//#define HAVE_LCD_ENABLE
+
+/* Define this if your LCD can be put to sleep. HAVE_LCD_ENABLE
+   should be defined as well.
+#define HAVE_LCD_SLEEP
+#define HAVE_LCD_SLEEP_SETTING
+*/
+
+/* define this if you can flip your LCD
+#define HAVE_LCD_FLIP
+*/
+
+/* define this if you can invert the colours on your LCD
+#define HAVE_LCD_INVERT
+*/
+
+/* define this if you have a real-time clock */
+#define CONFIG_RTC RTC_IMX233
+
+/* define this if you have a real-time clock with alarm facilities */
+#define HAVE_RTC_ALARM
+
+#endif /* !BOOTLOADER */
+
+/* define this if you have an i.MX23 codec */
+#define HAVE_IMX233_CODEC
+
+/* There is no hardware tone control */
+#define HAVE_SW_TONE_CONTROLS
+
+#define CONFIG_KEYPAD CREATIVE_ZEN_PAD
+
+/* Define this to enable morse code input */
+#define HAVE_MORSE_INPUT
+
+/* Define this if you do software codec */
+#define CONFIG_CODEC SWCODEC
+
+/* LCD dimensions */
+#define LCD_WIDTH  132
+#define LCD_HEIGHT 132
+#define LCD_DEPTH  16   /* 65536 colours */
+#define LCD_PIXELFORMAT RGB565 /* rgb565 */
+
+/* Define this if you have a software controlled poweroff */
+#define HAVE_SW_POWEROFF
+
+/* Some devices seem to be FAT16 formatted */
+#define HAVE_FAT16SUPPORT
+
+/* The number of bytes reserved for loadable codecs */
+#define CODEC_SIZE 0x100000
+
+/* The number of bytes reserved for loadable plugins */
+#define PLUGIN_BUFFER_SIZE 0x80000
+
+#define AB_REPEAT_ENABLE
+
+/* Define this for LCD backlight available */
+#define HAVE_BACKLIGHT
+#define HAVE_BACKLIGHT_BRIGHTNESS
+
+/* Main LCD backlight brightness range and defaults */
+#define MIN_BRIGHTNESS_SETTING      0
+#define MAX_BRIGHTNESS_SETTING      16
+#define DEFAULT_BRIGHTNESS_SETTING  10
+
+/* Which backlight fading type? */
+#define CONFIG_BACKLIGHT_FADING BACKLIGHT_FADING_SW_SETTING
+
+/* define this if you have a flash memory storage */
+#define HAVE_FLASH_STORAGE
+
+/* define this if the flash memory uses the SecureDigital Memory Card protocol */
+#define CONFIG_STORAGE STORAGE_ATA
+
+/* todo */
+#define BATTERY_CAPACITY_DEFAULT 550    /* default battery capacity */
+#define BATTERY_CAPACITY_MIN 550        /* min. capacity selectable */
+#define BATTERY_CAPACITY_MAX 550        /* max. capacity selectable */
+#define BATTERY_CAPACITY_INC 0          /* capacity increment */
+#define BATTERY_TYPES_COUNT  1          /* only one type */
+
+#define CONFIG_BATTERY_MEASURE VOLTAGE_MEASURE
+
+/* Charging implemented in a target-specific algorithm */
+//#warning FIXME change this to CHARGING_TARGET when powermgmt is ready
+#define CONFIG_CHARGING CHARGING_TARGET
+
+/* define this if the unit can be powered or charged via USB */
+#define HAVE_USB_POWER
+
+/* Define this if you have an IMX233*/
+#define CONFIG_CPU IMX233
+
+/* Define this if you want to use the IMX233 i2c interface */
+#define CONFIG_I2C I2C_IMX233
+
+/* define current usage levels (based on battery bench) */
+#define CURRENT_NORMAL     35
+#define CURRENT_BACKLIGHT  30
+#define CURRENT_RECORD     CURRENT_NORMAL
+
+/* maximum charging current */
+#define CURRENT_MAX_CHG   200
+
+/* Define this to the CPU frequency */
+#define CPU_FREQ      454000000
+
+/* Type of LCD */
+#define CONFIG_LCD LCD_CREATIVEZENV
+
+/* Offset ( in the firmware file's header ) to the file CRC and data. These are
+   only used when loading the old format rockbox.e200 file */
+#define FIRMWARE_OFFSET_FILE_CRC    0x0
+#define FIRMWARE_OFFSET_FILE_DATA   0x8
+
+/* USB On-the-go */
+#define CONFIG_USBOTG USBOTG_ARC
+
+/* enable these for the experimental usb stack */
+#define HAVE_USBSTACK
+//#define USB_HANDLED_BY_OF
+#define USE_ROCKBOX_USB
+#define USB_VENDOR_ID 0x041e
+#define USB_PRODUCT_ID 0x4133
+#define HAVE_USB_HID_MOUSE
+#define HAVE_BOOTLOADER_USB_MODE
+
+/* Define this if you have adjustable CPU frequency */
+//#define HAVE_ADJUSTABLE_CPU_FREQ
+
+/* Virtual LED (icon) */
+#define CONFIG_LED LED_VIRTUAL
+
+#define BOOTFILE_EXT    "creative"
+#define BOOTFILE        "rockbox." BOOTFILE_EXT
+#define BOOTDIR "/.rockbox"
+
+#define INCLUDE_TIMEOUT_API
+
+ 
diff --git a/firmware/target/arm/imx233/creative-zen/backlight-zen.c b/firmware/target/arm/imx233/creative-zen/backlight-zen.c
index 0d223b5..74e1e91 100644
--- a/firmware/target/arm/imx233/creative-zen/backlight-zen.c
+++ b/firmware/target/arm/imx233/creative-zen/backlight-zen.c
@@ -29,6 +29,9 @@
 
 void _backlight_set_brightness(int level)
 {
+#ifdef CREATIVE_ZENV
+    lcd_set_contrast(level);
+#else
     unsigned val = (level + 200) * level / 1000;
     if(level != 0)
     {
@@ -39,14 +42,17 @@
     }
     else
         imx233_pinctrl_set_gpio(1, 12, false);
+#endif
 }
 
 bool _backlight_init(void)
 {
+#ifndef CREATIVE_ZENV
     imx233_pinctrl_acquire(1, 12, "backlight_enable");
     imx233_pinctrl_set_function(1, 12, PINCTRL_FUNCTION_GPIO);
     imx233_pinctrl_enable_gpio(1, 12, true);
     imx233_uartdbg_init(BAUD_38400);
+#endif
     return true;
 }
 
diff --git a/firmware/target/arm/imx233/creative-zen/button-target.h b/firmware/target/arm/imx233/creative-zen/button-target.h
index cddff4d..7974ae4 100644
--- a/firmware/target/arm/imx233/creative-zen/button-target.h
+++ b/firmware/target/arm/imx233/creative-zen/button-target.h
@@ -47,8 +47,12 @@
 #define BUTTON_TOPLEFT              0x00001000
 #define BUTTON_TOPRIGHT             0x00002000
 #endif
+#ifdef CREATIVE_ZENV
+#define BUTTON_VOL_UP               0x00004000
+#define BUTTON_VOL_DOWN             0x00008000
+#endif
 
-#define BUTTON_MAIN                 0x00003fff
+#define BUTTON_MAIN                 0x0000ffff
 
 /* Software power-off */
 #define POWEROFF_BUTTON BUTTON_POWER
diff --git a/firmware/target/arm/imx233/creative-zen/button-zen.c b/firmware/target/arm/imx233/creative-zen/button-zen.c
index 1997f91..8f20961 100644
--- a/firmware/target/arm/imx233/creative-zen/button-zen.c
+++ b/firmware/target/arm/imx233/creative-zen/button-zen.c
@@ -57,6 +57,20 @@
     {2945, BUTTON_PLAYPAUSE},
     {3400, 0},
     {0, IMX233_BUTTON_LRADC_END},
+#elif defined(CREATIVE_ZENV)
+    {190, IMX233_BUTTON_LRADC_HOLD},
+    {250, BUTTON_PLAYPAUSE},
+    {530, BUTTON_BACK},
+    {785, BUTTON_VOL_UP},
+    {1040, BUTTON_VOL_DOWN},
+    {1295, BUTTON_MENU},
+    {1540, BUTTON_UP},
+    {1800, BUTTON_SELECT},
+    {2070, BUTTON_LEFT},
+    {2315, BUTTON_RIGHT},
+    {2550, BUTTON_DOWN},
+    {3450, 0},
+    {0, IMX233_BUTTON_LRADC_END},
 #elif defined(CREATIVE_ZENMOZAIC)
     {0, IMX233_BUTTON_LRADC_HOLD},
     {200, BUTTON_MENU},
@@ -100,7 +114,7 @@
 int button_read_device(void)
 {
     int btn = 0;
-    if(BF_RD(POWER_STS, PSWITCH) == 1)
+    if(imx233_power_read_pswitch() == 1)
         btn |= BUTTON_POWER;
     return imx233_button_lradc_read(btn);
 }
diff --git a/firmware/target/arm/imx233/creative-zen/power-zen.c b/firmware/target/arm/imx233/creative-zen/power-zen.c
index 2c68325..c1ad598 100644
--- a/firmware/target/arm/imx233/creative-zen/power-zen.c
+++ b/firmware/target/arm/imx233/creative-zen/power-zen.c
@@ -58,4 +58,14 @@
 bool tuner_powered(void)
 {
     return tuner_enable;
-}
\ No newline at end of file
+}
+
+void ide_power_enable(bool on)
+{
+    (void) on;
+}
+
+bool ide_powered(void)
+{
+    return true;
+}
diff --git a/firmware/target/arm/imx233/emi-imx233.c b/firmware/target/arm/imx233/emi-imx233.c
index 1ae6e22..259ada0 100644
--- a/firmware/target/arm/imx233/emi-imx233.c
+++ b/firmware/target/arm/imx233/emi-imx233.c
@@ -196,11 +196,13 @@
 {
     struct imx233_emi_info_t info;
     memset(&info, 0,  sizeof(info));
+#if IMX233_SUBTARGET >= 3700
     info.rows = 13 - BF_RD(DRAM_CTL10, ADDR_PINS);
     info.columns = 12 - BF_RD(DRAM_CTL11, COLUMN_SIZE);
     info.cas = BF_RD(DRAM_CTL13, CASLAT_LIN);
     info.banks = 4;
     info.chips = __builtin_popcount(BF_RD(DRAM_CTL14, CS_MAP));
     info.size = 2 * (1 << (info.rows + info.columns)) * info.chips * info.banks;
+#endif
     return info;
 }
\ No newline at end of file
diff --git a/firmware/target/arm/imx233/power-imx233.c b/firmware/target/arm/imx233/power-imx233.c
index b0e614a..af333de 100644
--- a/firmware/target/arm/imx233/power-imx233.c
+++ b/firmware/target/arm/imx233/power-imx233.c
@@ -124,7 +124,9 @@
 
 void imx233_power_init(void)
 {
+#if IMX233_SUBTARGET >= 3700
     BF_CLR(POWER_MINPWR, HALF_FETS);
+#endif
     /* setup vbusvalid parameters: set threshold to 4v and power up comparators */
     BF_CLR(POWER_5VCTRL, VBUSVALID_TRSH);
     BF_SETV(POWER_5VCTRL, VBUSVALID_TRSH, 1);
@@ -155,8 +157,10 @@
         BF_SET(POWER_CTRL, POLARITY_VDD5V_GT_VDDIO);
     BF_SET(POWER_CTRL, ENIRQ_VDD5V_GT_VDDIO);
     /* make the vbusvalid detection way is not enabled */
+#if IMX233_SUBTARGET >= 3700
     BF_CLR(POWER_CTRL, ENIRQ_VBUS_VALID);
 #endif
+#endif
     /* the VDD5V IRQ is shared by several sources, disable them */
 #if IMX233_SUBTARGET >= 3700
     BF_CLR(POWER_CTRL, ENIRQ_PSWITCH);
diff --git a/firmware/target/arm/imx233/power-imx233.h b/firmware/target/arm/imx233/power-imx233.h
index 59ffcd3..9888beb 100644
--- a/firmware/target/arm/imx233/power-imx233.h
+++ b/firmware/target/arm/imx233/power-imx233.h
@@ -119,6 +119,15 @@
 }
 #endif
 
+static inline unsigned imx233_power_read_pswitch(void)
+{
+#if IMX233_SUBTARGET >= 3700
+    return BF_RD(POWER_STS, PSWITCH);
+#else
+    return BF_RD(DIGCTL_STATUS, PSWITCH);
+#endif
+}
+
 #if IMX233_SUBTARGET < 3700
 /* return -1 on error */
 int imx233_power_sense_die_temperature(int *min, int *max);
diff --git a/firmware/target/arm/imx233/powermgmt-imx233.c b/firmware/target/arm/imx233/powermgmt-imx233.c
index 9819406..895c91d 100644
--- a/firmware/target/arm/imx233/powermgmt-imx233.c
+++ b/firmware/target/arm/imx233/powermgmt-imx233.c
@@ -48,9 +48,9 @@
 {
     imx233_power_set_charge_current(IMX233_CHARGE_CURRENT);
     imx233_power_set_stop_current(IMX233_STOP_CURRENT);
+#if IMX233_SUBTARGET >= 3700
     /* assume that adc_init was called and battery monitoring via LRADC setup */
     BF_WR(POWER_BATTMONITOR, EN_BATADJ, 1);
-#if IMX233_SUBTARGET >= 3700
     /* setup linear regulator offsets to 25 mV below to prevent contention between
      * linear regulators and DCDC */
     BF_WR(POWER_VDDDCTRL, LINREG_OFFSET, 2);
diff --git a/rbutil/mkzenboot/dualboot.c b/rbutil/mkzenboot/dualboot.c
index 42baada..4c98468 100644
--- a/rbutil/mkzenboot/dualboot.c
+++ b/rbutil/mkzenboot/dualboot.c
@@ -41,3 +41,16 @@
     0x00, 0x00, 0x05, 0x80, 0xa4, 0x00, 0x00, 0x41, 0xda, 0x00, 0xeb, 0x1c, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
 };
+unsigned char dualboot_zenv[168] = {
+    0x10, 0x40, 0x2d, 0xe9, 0x7c, 0x30, 0x9f, 0xe5, 0x00, 0x30, 0x93, 0xe5, 0x78, 0x20, 0x9f, 0xe5,
+    0x00, 0x00, 0x92, 0xe5, 0x74, 0x20, 0x9f, 0xe5, 0x02, 0x11, 0xa0, 0xe3, 0x08, 0x10, 0x82, 0xe5,
+    0x03, 0x11, 0x81, 0xe2, 0x08, 0x10, 0x82, 0xe5, 0xff, 0x14, 0x81, 0xe2, 0x58, 0x10, 0x82, 0xe5,
+    0xc2, 0x14, 0x81, 0xe2, 0x24, 0x10, 0x82, 0xe5, 0x01, 0x10, 0xa0, 0xe3, 0x18, 0x10, 0x82, 0xe5,
+    0x04, 0x10, 0x82, 0xe5, 0x02, 0x10, 0xa0, 0xe1, 0x10, 0x20, 0x91, 0xe5, 0x01, 0x00, 0x12, 0xe3,
+    0xfc, 0xff, 0xff, 0x0a, 0x34, 0x20, 0x9f, 0xe5, 0x50, 0x20, 0x92, 0xe5, 0xff, 0x24, 0xc2, 0xe3,
+    0x3f, 0x27, 0xc2, 0xe3, 0xa5, 0x2e, 0x42, 0xe2, 0x0a, 0x20, 0x42, 0xe2, 0x63, 0x00, 0x52, 0xe3,
+    0x00, 0x30, 0xa0, 0x93, 0x20, 0x00, 0x83, 0x95, 0x14, 0x20, 0x9f, 0xe5, 0x00, 0x00, 0x92, 0xe5,
+    0x33, 0xff, 0x2f, 0xe1, 0x10, 0x80, 0xbd, 0xe8, 0xa0, 0x00, 0x00, 0x61, 0x9c, 0x00, 0x00, 0x61,
+    0x00, 0x00, 0x05, 0x80, 0xa4, 0x00, 0x00, 0x61, 0xda, 0x00, 0xeb, 0x1c, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
diff --git a/rbutil/mkzenboot/dualboot.h b/rbutil/mkzenboot/dualboot.h
index c6c2d40..2497d29 100644
--- a/rbutil/mkzenboot/dualboot.h
+++ b/rbutil/mkzenboot/dualboot.h
@@ -3,3 +3,4 @@
 extern unsigned char dualboot_zenmozaic[168];
 extern unsigned char dualboot_zenxfi[168];
 extern unsigned char dualboot_zen[168];
+extern unsigned char dualboot_zenv[168];
diff --git a/rbutil/mkzenboot/dualboot/Makefile b/rbutil/mkzenboot/dualboot/Makefile
index cc8c604..752cc3c 100644
--- a/rbutil/mkzenboot/dualboot/Makefile
+++ b/rbutil/mkzenboot/dualboot/Makefile
@@ -11,10 +11,11 @@
 # 1) add x to the list in TARGETS
 # 2) create a variable named OPT_x of the form:
 #    OPT_x=target specific defines
-TARGETS=zenmozaic zenxfi zen
+TARGETS=zenmozaic zenxfi zen zenv
 OPT_zenmozaic=-DCREATIVE_ZENMOZAIC -DIMX233_SUBTARGET=3700
 OPT_zenxfi=-DCREATIVE_ZENXFI -DIMX233_SUBTARGET=3700
 OPT_zen=-DCREATIVE_ZEN -DIMX233_SUBTARGET=3700
+OPT_zenv=-DCREATIVE_ZENV -DIMX233_SUBTARGET=3600
 
 BOOTLDS=$(patsubst %, dualboot_%.lds, $(TARGETS))
 BOOTOBJS=$(patsubst %, dualboot_%.o, $(TARGETS))
diff --git a/rbutil/mkzenboot/dualboot/dualboot.c b/rbutil/mkzenboot/dualboot/dualboot.c
index d0587fa..0b32772 100644
--- a/rbutil/mkzenboot/dualboot/dualboot.c
+++ b/rbutil/mkzenboot/dualboot/dualboot.c
@@ -21,6 +21,7 @@
 #include "regs-pinctrl.h"
 #include "regs-power.h"
 #include "regs-lradc.h"
+#include "regs-digctl.h"
 
 typedef unsigned long uint32_t;
 
@@ -83,7 +84,8 @@
  * Boot decision functions
  */
 
-#if defined(CREATIVE_ZENMOZAIC) || defined(CREATIVE_ZEN) || defined(CREATIVE_ZENXFI)
+#if defined(CREATIVE_ZENMOZAIC) || defined(CREATIVE_ZEN) || defined(CREATIVE_ZENXFI) \
+    || defined(CREATIVE_ZENV)
 static enum boot_t boot_decision()
 {
     setup_lradc(0); // setup LRADC channel 0 to read keys
diff --git a/rbutil/mkzenboot/mkzenboot.c b/rbutil/mkzenboot/mkzenboot.c
index 0a597d1..2817b7e 100644
--- a/rbutil/mkzenboot/mkzenboot.c
+++ b/rbutil/mkzenboot/mkzenboot.c
@@ -94,7 +94,7 @@
     {"Zen SleekPhoto", null_key_v1, tl_zsp_key, true, NULL},
     {"Zen Touch", null_key_v1, tl_zt_key, true, NULL},
     {"Zen Xtra", null_key_v1, tl_zx_key, true, NULL},
-    {"Zen V", null_key_v3, tl_zenv_key, false, NULL},
+    {"Zen V", null_key_v3, tl_zenv_key, false, "Creative ZEN V"},
     {"Zen V Plus", null_key_v3, tl_zenvp_key, false, NULL},
     {"Zen V Video", null_key_v3, tl_zenvv_key, false, NULL},
     {NULL, NULL, NULL, false, NULL}
@@ -130,7 +130,7 @@
     },
     [MODEL_ZENV] =
     {
-        "Zen V", "zenv", 85, 0x60000000, NULL, 0
+        "Zen V", "zenv", 85, 0x61000000, dualboot_zenv, sizeof(dualboot_zenv)
     },
     [MODEL_ZENXFI] =
     {
diff --git a/tools/configure b/tools/configure
index fac8607..71bd8d6 100755
--- a/tools/configure
+++ b/tools/configure
@@ -2282,6 +2282,26 @@
     arm926ejscc
     ;;
 
+    95|creativezenv)
+    target_id=85
+    modelname="creativezenv"
+    target="CREATIVE_ZENV"
+    memory=32
+    bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
+    bmp2rb_native="$rootdir/tools/bmp2rb -f 4"
+    tool="$rootdir/tools/scramble -add=zenv"
+    output="rockbox.creative"
+    bootoutput="bootloader-zenv.creative"
+    appextra="radio:gui:recorder"
+    plugins=""
+    swcodec="yes"
+    toolset=$scramblebitmaptools
+    t_cpu="arm"
+    t_manufacturer="imx233"
+    t_model="creative-zen"
+    arm926ejscc
+    ;;
+
    96|creativezenxfi)
     target_id=86
     modelname="creativezenxfi"
diff --git a/tools/scramble.c b/tools/scramble.c
index 25f71e0..ef7c41b 100644
--- a/tools/scramble.c
+++ b/tools/scramble.c
@@ -129,7 +129,7 @@
            "\t                   m2v4, fuze, c2v2, clv2, y820, y920, y925, x747,\n"
            "\t                   747p, x777, nn2g, m244, cli+, fuz2, hd20, hd30,\n"
            "\t                   ip6g, rk27, clzp, zxf2, zxf3, fuz+, e370, e360,\n"
-           "\t                   zxfi, zmoz, zen)\n");
+           "\t                   zxfi, zmoz, zen, zenv)\n");
     printf("\nNo option results in Archos standard player/recorder format.\n");
 
     exit(1);
@@ -366,6 +366,8 @@
             modelnum = 82;
         else if (!strcmp(&argv[1][5], "zxf3")) /* Creative Zen X-Fi3 */
             modelnum = 83;
+        else if (!strcmp(&argv[1][5], "zenv")) /* Creative Zen V */
+            modelnum = 85;
         else if (!strcmp(&argv[1][5], "zxfi")) /* Creative ZEN X-Fi */
             modelnum = 86;
         else if (!strcmp(&argv[1][5], "zmoz")) /* Creative ZEN Mozaic*/