From 977a6c3ce7a2ab960590e9d997388cca2e4c29ee Mon Sep 17 00:00:00 2001 From: Amaury Pouly Date: Mon, 18 Nov 2013 20:07:02 +0000 Subject: Initial commit for the Creative ZEN V Change-Id: I3408cfdf742ea5995d5c87bf76653f436e1ec2b0 --- firmware/SOURCES | 5 +- firmware/export/config.h | 3 + firmware/export/config/creativezenv.h | 196 +++++++++++++++++++++ .../target/arm/imx233/creative-zen/backlight-zen.c | 6 + .../target/arm/imx233/creative-zen/button-target.h | 6 +- .../target/arm/imx233/creative-zen/button-zen.c | 16 +- .../target/arm/imx233/creative-zen/power-zen.c | 12 +- firmware/target/arm/imx233/emi-imx233.c | 2 + firmware/target/arm/imx233/power-imx233.c | 4 + firmware/target/arm/imx233/power-imx233.h | 9 + firmware/target/arm/imx233/powermgmt-imx233.c | 2 +- 11 files changed, 256 insertions(+), 5 deletions(-) create mode 100644 firmware/export/config/creativezenv.h (limited to 'firmware') diff --git a/firmware/SOURCES b/firmware/SOURCES index b96912e880..49a4edcc1d 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES @@ -1163,13 +1163,16 @@ target/arm/tms320dm320/creative-zvm/powermgmt-creativezvm.c 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 ffe34fb81b..3c4c72c054 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 @@ Lyre prototype 1 */ #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 0000000000..e1758488ec --- /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 0d223b52e9..74e1e91a49 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 @@ void _backlight_set_brightness(int level) } 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 cddff4d9cc..7974ae42ad 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 @@ bool button_debug_screen(void); #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 1997f91357..8f20961a57 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 @@ struct imx233_button_lradc_mapping_t imx233_button_lradc_mapping[] = {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 @@ bool headphones_inserted(void) 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 2c68325432..c1ad5989c0 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_power(bool enable) 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 1ae6e22f48..259ada0e94 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 imx233_emi_get_info(void) { 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 b0e614afe7..af333dea59 100644 --- a/firmware/target/arm/imx233/power-imx233.c +++ b/firmware/target/arm/imx233/power-imx233.c @@ -124,7 +124,9 @@ void INT_VDD5V(void) 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,7 +157,9 @@ void imx233_power_init(void) 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 diff --git a/firmware/target/arm/imx233/power-imx233.h b/firmware/target/arm/imx233/power-imx233.h index 59ffcd37a2..9888bebe1f 100644 --- a/firmware/target/arm/imx233/power-imx233.h +++ b/firmware/target/arm/imx233/power-imx233.h @@ -119,6 +119,15 @@ static inline void imx233_power_set_dcdc_freq(bool pll, unsigned freq) } #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 9819406974..895c91dda2 100644 --- a/firmware/target/arm/imx233/powermgmt-imx233.c +++ b/firmware/target/arm/imx233/powermgmt-imx233.c @@ -48,9 +48,9 @@ void imx233_powermgmt_init(void) { 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); -- cgit v1.2.3