From 19cb4446919dff3b0c6e5a48c9b0192c01740ecc Mon Sep 17 00:00:00 2001 From: Karl Kurbjun Date: Wed, 24 Jun 2009 04:17:15 +0000 Subject: M:Robe 500: RTC is now working, Added some SPI flexibility per end device and modified the interrupt handler for the tsc2100 which should make it more reliable. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21483 a1c6a512-1295-4272-9138-f99709370657 --- .../target/arm/tms320dm320/mrobe-500/adc-mr500.c | 7 ++-- .../arm/tms320dm320/mrobe-500/backlight-mr500.c | 11 +++++-- firmware/target/arm/tms320dm320/spi-dm320.c | 38 +++++++++++++++------- firmware/target/arm/tms320dm320/spi-target.h | 1 - 4 files changed, 39 insertions(+), 18 deletions(-) (limited to 'firmware/target/arm/tms320dm320') diff --git a/firmware/target/arm/tms320dm320/mrobe-500/adc-mr500.c b/firmware/target/arm/tms320dm320/mrobe-500/adc-mr500.c index e7e57a4f11..7d073f4fda 100644 --- a/firmware/target/arm/tms320dm320/mrobe-500/adc-mr500.c +++ b/firmware/target/arm/tms320dm320/mrobe-500/adc-mr500.c @@ -38,6 +38,9 @@ void adc_init(void) /* Touchscreen data available interupt */ void GIO14(void) { + /* Interrupts work properly when cleared first */ + IO_INTC_IRQ2 = (1<<3); /* IRQ_GIO14 == 35 */ + short tsadc = tsc2100_readreg(TSADC_PAGE, TSADC_ADDRESS); short adscm = (tsadc&TSADC_ADSCM_MASK)>>TSADC_ADSCM_SHIFT; @@ -62,8 +65,6 @@ void GIO14(void) case 0x0B: 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 413790ae00..04778c8e50 100644 --- a/firmware/target/arm/tms320dm320/mrobe-500/backlight-mr500.c +++ b/firmware/target/arm/tms320dm320/mrobe-500/backlight-mr500.c @@ -29,10 +29,17 @@ #include "spi-target.h" #include "lcd-target.h" +short read_brightness = 0x0; + static void _backlight_write_brightness(int brightness) { - uint8_t bl_command[] = {0xa4, 0x00, brightness, 0xbb}; - spi_block_transfer(SPI_target_BACKLIGHT, false, bl_command, 4, 0, 0); + uint8_t bl_command[] = {0xA4, 0x00, brightness, 0xA4}; + + uint8_t bl_read[] = {0xA8, 0x00}; + + spi_block_transfer(SPI_target_BACKLIGHT, bl_read, 2, (char*)&read_brightness, 2); + + spi_block_transfer(SPI_target_BACKLIGHT, bl_command, 4, 0, 0); } void _backlight_on(void) diff --git a/firmware/target/arm/tms320dm320/spi-dm320.c b/firmware/target/arm/tms320dm320/spi-dm320.c index 2d5637b70e..262b0611ac 100644 --- a/firmware/target/arm/tms320dm320/spi-dm320.c +++ b/firmware/target/arm/tms320dm320/spi-dm320.c @@ -39,16 +39,24 @@ struct SPI_info { volatile unsigned short *setreg; volatile unsigned short *clrreg; int bit; + bool idle_low; + char divider; }; struct SPI_info spi_targets[] = { #ifndef CREATIVE_ZVx - [SPI_target_TSC2100] = { &IO_GIO_BITCLR1, &IO_GIO_BITSET1, GIO_TS_ENABLE }, - [SPI_target_RX5X348AB] = { &IO_GIO_BITSET0, &IO_GIO_BITCLR0, GIO_RTC_ENABLE}, - [SPI_target_BACKLIGHT] = { &IO_GIO_BITCLR1, &IO_GIO_BITSET1, GIO_BL_ENABLE }, + [SPI_target_TSC2100] = { &IO_GIO_BITCLR1, &IO_GIO_BITSET1, + GIO_TS_ENABLE, true, 0x07}, + /* RTC seems to have timing problems if the CLK idles low */ + [SPI_target_RX5X348AB] = { &IO_GIO_BITSET0, &IO_GIO_BITCLR0, + GIO_RTC_ENABLE, false, 0x3F}, + /* This appears to work properly idleing low, idling high is very glitchy */ + [SPI_target_BACKLIGHT] = { &IO_GIO_BITCLR1, &IO_GIO_BITSET1, + GIO_BL_ENABLE, true, 0x07}, #else - [SPI_target_LTV250QV] = { &IO_GIO_BITCLR2, &IO_GIO_BITSET2, GIO_LCD_ENABLE}, + [SPI_target_LTV250QV] = { &IO_GIO_BITCLR2, &IO_GIO_BITSET2, + GIO_LCD_ENABLE, true, 0x07}, #endif }; @@ -65,22 +73,27 @@ 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); + IO_SERIAL0_MODE &= ~(1<<10); + IO_SERIAL0_MODE |= (spi_targets[target].idle_low << 10); + + IO_SERIAL0_MODE &= ~(0xFF); + IO_SERIAL0_MODE |= spi_targets[target].divider; /* Activate the slave select pin */ - *spi_targets[target].setreg = spi_targets[target].bit; + if(tx_size) { + IO_SERIAL0_TX_ENABLE = 0x0001; + *spi_targets[target].setreg = spi_targets[target].bit; + } while (tx_size--) { /* Send one byte */ IO_SERIAL0_TX_DATA = *tx_bytes++; - /* Wait until transfer finished */ while (IO_SERIAL0_RX_DATA & IO_SERIAL0_XMIT); } @@ -106,8 +119,8 @@ int spi_block_transfer(enum SPI_target target, void spi_init(void) { mutex_init(&spi_mtx); - - IO_SERIAL0_MODE = 0x3607; + + IO_SERIAL0_MODE = 0x2200 | 0x3F; /* Enable TX */ IO_SERIAL0_TX_ENABLE = 0x0001; #ifndef CREATIVE_ZVx @@ -115,7 +128,8 @@ void spi_init(void) IO_GIO_DIR1 &= ~GIO_TS_ENABLE; /* Set GIO 12 to output for rtc slave enable */ IO_GIO_DIR0 &= ~GIO_RTC_ENABLE; -#endif - spi_disable_all_targets(); /* make sure only one is ever enabled at a time */ +#endif + /* make sure only one is ever enabled at a time */ + spi_disable_all_targets(); } diff --git a/firmware/target/arm/tms320dm320/spi-target.h b/firmware/target/arm/tms320dm320/spi-target.h index 7fc0b72a28..013737b291 100644 --- a/firmware/target/arm/tms320dm320/spi-target.h +++ b/firmware/target/arm/tms320dm320/spi-target.h @@ -38,7 +38,6 @@ 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); -- cgit v1.2.3