diff --git a/apps/keymaps/keymap-mr500.c b/apps/keymaps/keymap-mr500.c index b044cb5e93..cd3e30dae1 100644 --- a/apps/keymaps/keymap-mr500.c +++ b/apps/keymaps/keymap-mr500.c @@ -73,17 +73,17 @@ static const struct button_mapping button_context_wps[] = { { ACTION_WPS_SEEKBACK, BUTTON_RC_REW|BUTTON_REPEAT,BUTTON_NONE }, { ACTION_WPS_SEEKFWD, BUTTON_RC_FF|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_WPS_STOPSEEK, BUTTON_RC_REW|BUTTON_REL, BUTTON_RC_REW|BUTTON_REPEAT }, - { ACTION_WPS_STOPSEEK, BUTTON_RC_FF|BUTTON_REL, BUTTON_RC_FF|BUTTON_REPEAT }, + { ACTION_WPS_STOPSEEK,BUTTON_RC_REW|BUTTON_REL, BUTTON_RC_REW|BUTTON_REPEAT}, + { ACTION_WPS_STOPSEEK, BUTTON_RC_FF|BUTTON_REL, BUTTON_RC_FF|BUTTON_REPEAT}, { ACTION_WPS_VOLDOWN, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, { ACTION_WPS_VOLDOWN, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, { ACTION_WPS_VOLUP, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, { ACTION_WPS_VOLUP, BUTTON_RC_VOL_UP, BUTTON_NONE }, - { ACTION_WPS_QUICKSCREEN, BUTTON_RC_MODE|BUTTON_REPEAT, BUTTON_RC_MODE }, - { ACTION_WPS_MENU, BUTTON_RC_MODE|BUTTON_REL, BUTTON_RC_MODE }, - { ACTION_WPS_CONTEXT, BUTTON_RC_HEART|BUTTON_REPEAT, BUTTON_RC_HEART }, + { ACTION_WPS_QUICKSCREEN, BUTTON_RC_MODE|BUTTON_REPEAT, BUTTON_RC_MODE }, + { ACTION_WPS_MENU, BUTTON_RC_MODE|BUTTON_REL, BUTTON_RC_MODE }, + { ACTION_WPS_CONTEXT, BUTTON_RC_HEART|BUTTON_REPEAT, BUTTON_RC_HEART }, { ACTION_WPS_BROWSE, BUTTON_RC_HEART|BUTTON_REL, BUTTON_RC_HEART }, @@ -91,6 +91,12 @@ static const struct button_mapping button_context_wps[] = { }; /* button_context_wps */ static const struct button_mapping button_context_list[] = { +#ifdef HAVE_VOLUME_IN_LIST + { ACTION_LIST_VOLUP, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_LIST_VOLUP, BUTTON_RC_VOL_UP, BUTTON_NONE }, + { ACTION_LIST_VOLDOWN, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, + { ACTION_LIST_VOLDOWN, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, +#endif LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) }; /* button_context_list */ @@ -107,22 +113,36 @@ static const struct button_mapping button_context_listtree_scroll_without_combo[ }; static const struct button_mapping button_context_settings[] = { - { ACTION_SETTINGS_INC, BUTTON_RC_VOL_UP, BUTTON_NONE }, - { ACTION_SETTINGS_INCREPEAT, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_SETTINGS_DEC, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, - { ACTION_SETTINGS_DECREPEAT, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_STD_OK, BUTTON_RC_HEART, BUTTON_NONE }, - { ACTION_STD_CANCEL, BUTTON_RC_MODE, BUTTON_NONE }, + + { ACTION_SETTINGS_INC, BUTTON_RC_PLAY, BUTTON_NONE }, + { ACTION_SETTINGS_INCREPEAT, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_SETTINGS_DEC, BUTTON_RC_DOWN, BUTTON_NONE }, + { ACTION_SETTINGS_DECREPEAT, BUTTON_RC_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_PREV, BUTTON_RC_REW, BUTTON_NONE }, + { ACTION_STD_PREVREPEAT, BUTTON_RC_REW|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_NEXT, BUTTON_RC_FF, BUTTON_NONE }, + { ACTION_STD_NEXTREPEAT, BUTTON_RC_FF|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_SETTINGS_RESET, BUTTON_RC_MODE, BUTTON_NONE }, LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) }; /* button_context_settings */ static const struct button_mapping button_context_settings_right_is_inc[] = { + { ACTION_SETTINGS_INC, BUTTON_RC_FF, BUTTON_NONE }, + { ACTION_SETTINGS_INCREPEAT, BUTTON_RC_FF|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_SETTINGS_DEC, BUTTON_RC_REW, BUTTON_NONE }, + { ACTION_SETTINGS_DECREPEAT, BUTTON_RC_REW|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_PREV, BUTTON_RC_PLAY, BUTTON_NONE }, + { ACTION_STD_PREVREPEAT, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_NEXT, BUTTON_RC_DOWN, BUTTON_NONE }, + { ACTION_STD_NEXTREPEAT, BUTTON_RC_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_SETTINGS_RESET, BUTTON_RC_MODE, BUTTON_NONE }, LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) }; /* button_context_settingsgraphical */ static const struct button_mapping button_context_yesno[] = { + { ACTION_YESNO_ACCEPT, BUTTON_RC_PLAY|BUTTON_REL, BUTTON_NONE }, LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) }; /* button_context_settings_yesno */ @@ -140,6 +160,8 @@ static const struct button_mapping button_context_bmark[] = { }; /* button_context_bmark */ static const struct button_mapping button_context_time[] = { + { ACTION_STD_CANCEL, BUTTON_POWER, BUTTON_NONE }, + { ACTION_STD_OK, BUTTON_RC_HEART, BUTTON_NONE }, LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS), }; /* button_context_time */ @@ -154,6 +176,19 @@ static const struct button_mapping button_context_pitchscreen[] = { }; /* button_context_pitchcreen */ static const struct button_mapping button_context_keyboard[] = { + { ACTION_KBD_LEFT, BUTTON_RC_REW, BUTTON_NONE }, + { ACTION_KBD_LEFT, BUTTON_RC_REW|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_RIGHT, BUTTON_RC_FF, BUTTON_NONE }, + { ACTION_KBD_RIGHT, BUTTON_RC_FF|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_SELECT, BUTTON_RC_HEART, BUTTON_NONE }, + { ACTION_KBD_DONE, BUTTON_RC_MODE|BUTTON_REL, BUTTON_NONE }, + { ACTION_KBD_ABORT, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, + { ACTION_KBD_BACKSPACE, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, + { ACTION_KBD_BACKSPACE, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_UP, BUTTON_RC_PLAY, BUTTON_NONE }, + { ACTION_KBD_UP, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_DOWN, BUTTON_RC_DOWN, BUTTON_NONE }, + { ACTION_KBD_DOWN, BUTTON_RC_DOWN|BUTTON_REPEAT, BUTTON_NONE }, LAST_ITEM_IN_LIST }; /* button_context_keyboard */ diff --git a/firmware/drivers/rtc/rtc_rx5x348ab.c b/firmware/drivers/rtc/rtc_rx5x348ab.c index 286cd774e3..2b4e17c81d 100644 --- a/firmware/drivers/rtc/rtc_rx5x348ab.c +++ b/firmware/drivers/rtc/rtc_rx5x348ab.c @@ -36,7 +36,7 @@ void rtc_init(void) int rtc_read_datetime(unsigned char* buf) { char command = ADDR_READ|ADDR_BURST; /* burst read from the start of the time/date reg */ - spi_block_transfer(SPI_target_RX5X348AB, + spi_block_transfer(SPI_target_RX5X348AB, true, &command, 1, buf, 7); return 1; } @@ -48,7 +48,7 @@ int rtc_write_datetime(unsigned char* buf) data[0] = command; for (i=1;i<8;i++) data[i] = buf[i-1]; - spi_block_transfer(SPI_target_RX5X348AB, + spi_block_transfer(SPI_target_RX5X348AB, true, data, 8, NULL, 0); return 1; } diff --git a/firmware/drivers/tsc2100.c b/firmware/drivers/tsc2100.c index 14b56b76c9..271a557822 100644 --- a/firmware/drivers/tsc2100.c +++ b/firmware/drivers/tsc2100.c @@ -27,6 +27,10 @@ /* adc_data contains the last readings from the tsc2100 */ static short adc_data[10]; +static short adc_status; +static long adc_last_read=0; +static long adc_last_touch_read=0; +static long adc_last_volt_read=0; void tsc2100_read_data(void) { @@ -36,7 +40,11 @@ void tsc2100_read_data(void) unsigned char out[] = {command >> 8, command & 0xff}; unsigned char *p_adc_data=(unsigned char *)&adc_data; - spi_block_transfer(SPI_target_TSC2100, + adc_status|=tsc2100_readreg(TSSTAT_PAGE, TSSTAT_ADDRESS); + + adc_last_read=current_tick; + + spi_block_transfer(SPI_target_TSC2100, false, out, sizeof(out), (char *)adc_data, sizeof(adc_data)); for(i=0; i=0) ) { + *x = adc_data[0]; + *y = adc_data[1]; + *z1 = adc_data[2]; + *z2 = adc_data[3]; + + adc_status&=~(3<<9); + + adc_last_touch_read=current_tick; + + return true; + } else { + return false; + } } -void tsc2100_read_volt(short *bat1, short *bat2, short *aux) +bool tsc2100_read_volt(short *bat1, short *bat2, short *aux) { - *bat1 = adc_data[5]; - *bat2 = adc_data[6]; - *aux = adc_data[7]; + if( (adc_status&(7<<4)) && TIME_BEFORE(adc_last_volt_read, adc_last_read)) { + *bat1 = adc_data[5]; + *bat2 = adc_data[6]; + *aux = adc_data[7]; + + adc_status&=~(7<<4); + adc_last_volt_read=current_tick; + return true; + } else { + return false; + } } -void tsc2100_set_mode(unsigned char scan_mode) +void tsc2100_set_mode(bool poweron, unsigned char scan_mode) { short tsadc=(scan_mode<> 8, command & 0xff}; unsigned char in[2]; - spi_block_transfer(SPI_target_TSC2100, + spi_block_transfer(SPI_target_TSC2100, false, out, sizeof(out), in, sizeof(in)); return (in[0]<<8)|in[1]; } @@ -101,7 +139,7 @@ void tsc2100_writereg(int page, int address, short value) unsigned short command = (page << 11)|(address << 5); unsigned char out[4] = {command >> 8, command & 0xff, value >> 8, value & 0xff}; - spi_block_transfer(SPI_target_TSC2100, + spi_block_transfer(SPI_target_TSC2100, false, out, sizeof(out), NULL, 0); } @@ -111,3 +149,11 @@ void tsc2100_keyclick(void) //short val = 0xC410; tsc2100_writereg(TSAC2_PAGE, TSAC2_ADDRESS, tsc2100_readreg(TSAC2_PAGE, TSAC2_ADDRESS)&0x8000); } + +#ifdef HAVE_HARDWARE_BEEP + +void pcmbuf_beep(unsigned int frequency, size_t duration, int amplitude) +{ + tsc2100_keyclick(); +} +#endif diff --git a/firmware/export/config-mrobe500.h b/firmware/export/config-mrobe500.h index 78802e3adf..5a97d8ba85 100644 --- a/firmware/export/config-mrobe500.h +++ b/firmware/export/config-mrobe500.h @@ -82,9 +82,7 @@ /* 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 -/* Do this for now till lcd sleeping is working properly */ -#define LCD_SLEEP_TIMEOUT 0 +#define HAVE_LCD_SLEEP_SETTING /* remote LCD */ #define HAVE_REMOTE_LCD @@ -110,9 +108,14 @@ #define HAVE_TOUCHSCREEN #define HAVE_BUTTON_DATA +/* define this if the target has volume keys which can be used in the lists */ +#define HAVE_VOLUME_IN_LIST + /* Define this if you do software codec */ #define CONFIG_CODEC SWCODEC +//#define HAVE_HARDWARE_BEEP + /* There is no hardware tone control */ #define HAVE_SW_TONE_CONTROLS @@ -152,8 +155,8 @@ #define BATTERY_TYPES_COUNT 1 /* only one type */ /* define current usage levels */ -#define CURRENT_NORMAL 120 /* Measured */ -#define CURRENT_BACKLIGHT 80 /* Over 200 mA total measured when on */ +#define CURRENT_NORMAL 100 /* Measured */ +#define CURRENT_BACKLIGHT 100 /* Over 200 mA total measured when on */ #define CURRENT_RECORD 0 /* no recording */ /* Hardware controlled charging with monitoring */ @@ -178,11 +181,13 @@ #define FLASH_SIZE 0x400000 /* Define this to the CPU frequency */ -#define CPU_FREQ 16934400 +#define CPU_FREQ 87500000 /* Define this if you have ATA power-off control */ #define HAVE_ATA_POWER_OFF +#define CONFIG_BACKLIGHT_FADING BACKLIGHT_FADING_SW_HW_REG + /* Virtual LED (icon) */ #define CONFIG_LED LED_VIRTUAL @@ -196,7 +201,7 @@ #define FIRMWARE_OFFSET_FILE_DATA 8 /* Define this if you have adjustable CPU frequency */ -/* #define HAVE_ADJUSTABLE_CPU_FREQ */ +#define HAVE_ADJUSTABLE_CPU_FREQ #define BOOTFILE_EXT "mrobe500" #define BOOTFILE "rockbox." BOOTFILE_EXT diff --git a/firmware/export/tsc2100.h b/firmware/export/tsc2100.h index 06714db862..7a06593fd7 100644 --- a/firmware/export/tsc2100.h +++ b/firmware/export/tsc2100.h @@ -22,9 +22,9 @@ #define __TSC2100_H_ void tsc2100_read_data(void); -void tsc2100_read_touch(short *x, short* y, short *z1, short *z2); -void tsc2100_read_volt(short *bat1, short *bat2, short *aux); -void tsc2100_set_mode(unsigned char scan_mode); +bool tsc2100_read_touch(short *x, short* y, short *z1, short *z2); +bool tsc2100_read_volt(short *bat1, short *bat2, short *aux); +void tsc2100_set_mode(bool poweron, unsigned char scan_mode); void tsc2100_adc_init(void); /* read a register */ diff --git a/firmware/target/arm/tms320dm320/mrobe-500/adc-mr500.c b/firmware/target/arm/tms320dm320/mrobe-500/adc-mr500.c index da3e2e9f44..e7e57a4f11 100644 --- a/firmware/target/arm/tms320dm320/mrobe-500/adc-mr500.c +++ b/firmware/target/arm/tms320dm320/mrobe-500/adc-mr500.c @@ -26,8 +26,6 @@ #include "tsc2100.h" #include "button-target.h" -void read_battery_inputs(void); - void adc_init(void) { /* Initialize the touchscreen and the battery readout */ @@ -48,13 +46,24 @@ void GIO14(void) switch (adscm) { - case 1: - case 2: - touch_read_coord(); + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + /* do a battery read - this will shutdown the adc till the next tick + */ +// tsc2100_set_mode(true, 0x0B); break; + case 0x06: + case 0x07: + case 0x08: + case 0x09: case 0x0B: - read_battery_inputs(); + tsc2100_set_mode(true, 0x01); break; } + IO_INTC_IRQ2 = (1<<3); /* IRQ_GIO14 == 35 */ } + diff --git a/firmware/target/arm/tms320dm320/mrobe-500/backlight-mr500.c b/firmware/target/arm/tms320dm320/mrobe-500/backlight-mr500.c index ab2289822b..751a59da94 100644 --- a/firmware/target/arm/tms320dm320/mrobe-500/backlight-mr500.c +++ b/firmware/target/arm/tms320dm320/mrobe-500/backlight-mr500.c @@ -34,7 +34,7 @@ int _backlight_brightness=DEFAULT_BRIGHTNESS_SETTING; static void _backlight_write_brightness(int brightness) { uint8_t bl_command[] = {0xa4, 0x00, brightness, 0xbb}; - spi_block_transfer(SPI_target_BACKLIGHT, bl_command, 4, 0, 0); + spi_block_transfer(SPI_target_BACKLIGHT, false, bl_command, 4, 0, 0); } void _backlight_on(void) @@ -47,7 +47,6 @@ void _backlight_on(void) void _backlight_off(void) { _backlight_write_brightness(0); - lcd_sleep(); /* HACK to get lcd_sleep called again */ } /* Assumes that the backlight has been initialized */ diff --git a/firmware/target/arm/tms320dm320/mrobe-500/button-mr500.c b/firmware/target/arm/tms320dm320/mrobe-500/button-mr500.c index 09ff6cbd78..3e7077bd6d 100644 --- a/firmware/target/arm/tms320dm320/mrobe-500/button-mr500.c +++ b/firmware/target/arm/tms320dm320/mrobe-500/button-mr500.c @@ -19,8 +19,6 @@ * ****************************************************************************/ -/* this file also handles the touch screen driver interface */ - #include "config.h" #include "cpu.h" #include "system.h" @@ -34,12 +32,8 @@ #include "string.h" #include "touchscreen.h" -static bool touch_available = false; static bool hold_button = false; -static short touch_x, touch_y, touch_z1, touch_z2; -static long last_touch = 0; - static struct touch_calibration_point topleft, bottomright; /* Jd's tests.. These will hopefully work for everyone so we dont have to @@ -85,7 +79,6 @@ static int touch_to_pixels(short *val_x, short *val_y) void button_init_device(void) { - touch_available = false; /* GIO is the power button, set as input */ IO_GIO_DIR0 |= 0x01; @@ -115,33 +108,25 @@ inline bool button_hold(void) return hold_button; } -/* This is called from the tsc2100 interupt handler in adc-mr500.c */ -void touch_read_coord(void) -{ - touch_available = true; - tsc2100_read_touch(&touch_x, &touch_y, &touch_z1, &touch_z2); -} - int button_read_device(int *data) { int button_read = BUTTON_NONE; + short touch_x, touch_y, touch_z1, touch_z2; static bool hold_button_old = false; *data = 0; /* Handle touchscreen */ - if (touch_available) + if (tsc2100_read_touch(&touch_x, &touch_y, &touch_z1, &touch_z2)) { *data = touch_to_pixels(&touch_x, &touch_y); button_read |= touchscreen_to_pixels(touch_x, touch_y, data); - - touch_available = false; - last_touch=current_tick; } + tsc2100_set_mode(true, 0x01); + /* Handle power button */ - if ((IO_GIO_BITSET0&0x01) == 0) - { + if ((IO_GIO_BITSET0&0x01) == 0) { button_read |= BUTTON_POWER; } @@ -152,8 +137,7 @@ int button_read_device(int *data) /* Take care of hold notifications */ #ifndef BOOTLOADER /* give BL notice if HB state chaged */ - if (hold_button != hold_button_old) - { + if (hold_button != hold_button_old) { backlight_hold_changed(hold_button); hold_button_old=hold_button; } diff --git a/firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c b/firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c index af5a6504e6..1dc453b800 100644 --- a/firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c +++ b/firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c @@ -60,15 +60,17 @@ void lcd_sleep() { if (lcd_on) { + lcd_on = false; + memset16(FRAME, 0xFFFF, LCD_WIDTH*LCD_HEIGHT); + sleep(HZ/5); /* Disabling these saves another ~15mA */ - IO_OSD_OSDWINMD0&=~(0x01); - IO_VID_ENC_VMOD&=~(0x01); - - sleep(HZ/5); + IO_OSD_OSDWINMD0&= ~(0x01); + IO_VID_ENC_VMOD &= ~(0x01); + +// IO_CLK_MOD1 &= ~(0x0018); /* Disabling the LCD saves ~50mA */ IO_GIO_BITCLR2=1<<4; - lcd_on = false; } } @@ -79,15 +81,19 @@ void lcd_awake(void) { lcd_on=true; - IO_OSD_OSDWINMD0|=0x01; - IO_VID_ENC_VMOD|=0x01; +// IO_CLK_MOD1 |= 0x0018; + IO_OSD_OSDWINMD0|= 0x01; + IO_VID_ENC_VMOD |= 0x01; sleep(2); IO_GIO_BITSET2=1<<4; - /* Wait long enough for a frame to be written */ - sleep(HZ/20); lcd_update(); + + /* Wait long enough for a frame to be written */ + sleep(HZ/10); + + lcd_activation_call_hook(); } } diff --git a/firmware/target/arm/tms320dm320/mrobe-500/powermgmt-mr500.c b/firmware/target/arm/tms320dm320/mrobe-500/powermgmt-mr500.c index 654ec96591..60949b2c18 100755 --- a/firmware/target/arm/tms320dm320/mrobe-500/powermgmt-mr500.c +++ b/firmware/target/arm/tms320dm320/mrobe-500/powermgmt-mr500.c @@ -36,37 +36,41 @@ const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] = 0 }; +/* 6.10 format */ + /* voltages (millivolt) of 0%, 10%, ... 100% when charging disabled */ const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] = { - { 100, 300, 400, 500, 600, 700, 800, 900, 1000, 1200, 1320 }, + { 375, 1125, 1500, 1875, 2250, 2625, 3000, 3375, 3750, 4500, 4950 }, }; /* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */ const unsigned short percent_to_volt_charge[11] = { - 100, 300, 400, 500, 600, 700, 800, 900, 1000, 1200, 1320, + 375, 1125, 1500, 1875, 2250, 2625, 3000, 3375, 3750, 4500, 4950, }; - -void read_battery_inputs(void) -{ - short dummy1, dummy2; - tsc2100_read_volt(¤t_voltage, &dummy1, &dummy2); - - /* Set the TSC2100 back to read touches */ - tsc2100_set_mode(0x01); -} /* Returns battery voltage from ADC [millivolts] */ unsigned int battery_adc_voltage(void) { + short bat1, bat2, aux; static unsigned last_tick = 0; + short tsadc; + + if(tsc2100_read_volt(&bat1, &bat2, &aux)){ + current_voltage=((short)((int)(bat1<<10)/4096*6*2.5)); + } if (TIME_BEFORE(last_tick+2*HZ, current_tick)) { - /* Set the TSC2100 to read voltages */ - tsc2100_set_mode(0x0B); - last_tick = current_tick; + tsadc=tsc2100_readreg(TSADC_PAGE, TSADC_ADDRESS); + + /* Set the TSC2100 to read voltages if not busy with pen */ + if(!(tsadc & TSADC_PSTCM)) + { + tsc2100_set_mode(true, 0x0B); + last_tick = current_tick; + } } return current_voltage; diff --git a/firmware/target/arm/tms320dm320/spi-dm320.c b/firmware/target/arm/tms320dm320/spi-dm320.c index 6375298c0f..2d5637b70e 100644 --- a/firmware/target/arm/tms320dm320/spi-dm320.c +++ b/firmware/target/arm/tms320dm320/spi-dm320.c @@ -65,10 +65,14 @@ static void spi_disable_all_targets(void) } int spi_block_transfer(enum SPI_target target, + const bool spi_msb_first, const uint8_t *tx_bytes, unsigned int tx_size, uint8_t *rx_bytes, unsigned int rx_size) { mutex_lock(&spi_mtx); + + IO_SERIAL0_MODE = (IO_SERIAL0_MODE& ~(spi_msb_first<<9))|(spi_msb_first<<9); + /* Activate the slave select pin */ *spi_targets[target].setreg = spi_targets[target].bit; @@ -102,8 +106,8 @@ int spi_block_transfer(enum SPI_target target, void spi_init(void) { mutex_init(&spi_mtx); - /* Set SCLK idle level = 0 */ - IO_SERIAL0_MODE |= IO_SERIAL0_MODE_SCLK; + + IO_SERIAL0_MODE = 0x3607; /* Enable TX */ IO_SERIAL0_TX_ENABLE = 0x0001; #ifndef CREATIVE_ZVx diff --git a/firmware/target/arm/tms320dm320/spi-target.h b/firmware/target/arm/tms320dm320/spi-target.h index 013737b291..7fc0b72a28 100644 --- a/firmware/target/arm/tms320dm320/spi-target.h +++ b/firmware/target/arm/tms320dm320/spi-target.h @@ -38,6 +38,7 @@ enum SPI_target { void spi_init(void); int spi_block_transfer(enum SPI_target target, + const bool spi_msb_first, const uint8_t *tx_bytes, unsigned int tx_size, uint8_t *rx_bytes, unsigned int rx_size); diff --git a/firmware/target/arm/tms320dm320/system-dm320.c b/firmware/target/arm/tms320dm320/system-dm320.c index 638e378159..0142f7b18b 100644 --- a/firmware/target/arm/tms320dm320/system-dm320.c +++ b/firmware/target/arm/tms320dm320/system-dm320.c @@ -217,6 +217,29 @@ void system_init(void) IO_INTC_FISEL0 = 0; IO_INTC_FISEL1 = 0; IO_INTC_FISEL2 = 0; + + /* setup the clocks */ + IO_CLK_DIV0=0x0003; + IO_CLK_DIV1=0x0102; + IO_CLK_DIV2=0x021F; + IO_CLK_DIV3=0x1FFF; + IO_CLK_DIV4=0x1F00; + + IO_CLK_PLLA=0x80A0; + IO_CLK_PLLB=0x80C0; + + IO_CLK_SEL0=0x017E; + IO_CLK_SEL1=0x1000; + IO_CLK_SEL2=0x1001; + + /* need to wait before bypassing */ + + IO_CLK_BYP=0x0000; + + /* turn off some unneeded modules */ + IO_CLK_MOD0 &= ~0x0018; + IO_CLK_MOD1 = 0x0918; + IO_CLK_MOD2 = ~0x7C58; /* IRQENTRY only reflects enabled interrupts */ IO_INTC_RAW = 0; @@ -224,6 +247,7 @@ void system_init(void) IO_INTC_ENTRY_TBA0 = 0; IO_INTC_ENTRY_TBA1 = 0; + int i; /* Set interrupt priorities to predefined values */ for(i = 0; i < 23; i++) @@ -275,27 +299,13 @@ int system_memory_guard(int newmode) } #ifdef HAVE_ADJUSTABLE_CPU_FREQ - void set_cpu_frequency(long frequency) { - if (frequency == CPUFREQ_MAX) - { - asm volatile("mov r0, #0\n" - "mrc p15, 0, r0, c1, c0, 0\n" - "orr r0, r0, #3<<30\n" /* set to Asynchronous mode*/ - "mcr p15, 0, r0, c1, c0, 0" : : : "r0"); - - FREQ = CPUFREQ_MAX; - } - else - { - asm volatile("mov r0, #0\n" - "mrc p15, 0, r0, c1, c0, 0\n" - "bic r0, r0, #3<<30\n" /* set to FastBus mode*/ - "mcr p15, 0, r0, c1, c0, 0" : : : "r0"); - - FREQ = CPUFREQ_NORMAL; + if (frequency == CPUFREQ_MAX) { + IO_CLK_DIV0 = 0x0101; /* 175 MHz ARM */ + } else { + IO_CLK_DIV0 = 0x0003; /* 87.5 MHz ARM - not much savings, about 3 mA */ } } - #endif + diff --git a/firmware/target/arm/tms320dm320/system-target.h b/firmware/target/arm/tms320dm320/system-target.h index f1e52ad5a0..63d314f572 100755 --- a/firmware/target/arm/tms320dm320/system-target.h +++ b/firmware/target/arm/tms320dm320/system-target.h @@ -23,9 +23,9 @@ #include "system-arm.h" -#define CPUFREQ_SLEEP 32768 -#define CPUFREQ_DEFAULT 24000000 -#define CPUFREQ_NORMAL 30000000 -#define CPUFREQ_MAX 80000000 +#define CPUFREQ_SLEEP 32768 +#define CPUFREQ_DEFAULT 87500000 +#define CPUFREQ_NORMAL 87500000 +#define CPUFREQ_MAX 175000000 #endif /* SYSTEM_TARGET_H */