summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/keymaps/keymap-mr500.c57
-rw-r--r--firmware/drivers/rtc/rtc_rx5x348ab.c4
-rw-r--r--firmware/drivers/tsc2100.c78
-rw-r--r--firmware/export/config-mrobe500.h19
-rw-r--r--firmware/export/tsc2100.h6
-rw-r--r--firmware/target/arm/tms320dm320/mrobe-500/adc-mr500.c21
-rw-r--r--firmware/target/arm/tms320dm320/mrobe-500/backlight-mr500.c3
-rw-r--r--firmware/target/arm/tms320dm320/mrobe-500/button-mr500.c28
-rw-r--r--firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c24
-rwxr-xr-xfirmware/target/arm/tms320dm320/mrobe-500/powermgmt-mr500.c32
-rw-r--r--firmware/target/arm/tms320dm320/spi-dm320.c8
-rw-r--r--firmware/target/arm/tms320dm320/spi-target.h1
-rw-r--r--firmware/target/arm/tms320dm320/system-dm320.c48
-rwxr-xr-xfirmware/target/arm/tms320dm320/system-target.h8
14 files changed, 220 insertions, 117 deletions
diff --git a/apps/keymaps/keymap-mr500.c b/apps/keymaps/keymap-mr500.c
index b044cb5..cd3e30d 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 286cd77..2b4e17c 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 14b56b7..271a557 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<sizeof(adc_data); i+=2)
@@ -44,28 +52,55 @@ void tsc2100_read_data(void)
}
/* Read X, Y, Z1, Z2 touchscreen coordinates. */
-void tsc2100_read_touch(short *x, short* y, short *z1, short *z2)
+bool tsc2100_read_touch(short *x, short* y, short *z1, short *z2)
{
- *x = adc_data[0];
- *y = adc_data[1];
- *z1 = adc_data[2];
- *z2 = adc_data[3];
+ /* Note: This could cause problems if the current tick is not reset in ~1.3
+ * years. Noting this in the event that a suspend/resume function
+ * is added.
+ */
+ if( (adc_status&(3<<9)) && (adc_last_read - adc_last_touch_read>=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<<TSADC_ADSCM_SHIFT)| /* mode */
(0x3<<TSADC_RESOL_SHIFT)| /* 12 bit resolution */
(0x2<<TSADC_ADCR_SHIFT )| /* 2 MHz internal clock */
(0x2<<TSADC_PVSTC_SHIFT);
+ if(!poweron)
+ {
+ tsadc|=TSADC_ADST;
+ }
+
if(scan_mode<6)
tsadc|=TSADC_PSTCM;
@@ -75,12 +110,15 @@ void tsc2100_set_mode(unsigned char scan_mode)
void tsc2100_adc_init(void)
{
/* Set the TSC2100 to read touchscreen */
- tsc2100_set_mode(0x01);
-
+ tsc2100_set_mode(true, 0x01);
+
tsc2100_writereg(TSSTAT_PAGE, TSSTAT_ADDRESS,
(0x1<<TSSTAT_PINTDAV_SHIFT) /* Data available only */
);
-
+
+ /* An additional 2 mA can be saved here by powering down vref between
+ * conversions, but it adds a click to the audio on the M:Robe 500
+ */
tsc2100_writereg(TSREF_PAGE, TSREF_ADDRESS,
TSREF_VREFM|TSREF_IREFV);
}
@@ -90,7 +128,7 @@ short tsc2100_readreg(int page, int address)
unsigned short command = 0x8000|(page << 11)|(address << 5);
unsigned char out[] = {command >> 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 78802e3..5a97d8b 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 06714db..7a06593 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 da3e2e9..e7e57a4 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 ab22898..751a59da 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 09ff6cb..3e7077b 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 af5a650..1dc453b 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 654ec96..60949b2 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(&current_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 6375298..2d5637b 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 013737b..7fc0b72 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 638e378..0142f7b 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 f1e52ad..63d314f 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 */