diff options
| -rw-r--r-- | firmware/drivers/audio/as3514.c | 2 | ||||
| -rw-r--r-- | firmware/export/pp5020.h | 7 | ||||
| -rw-r--r-- | firmware/target/arm/iriver/h10/adc-h10.c | 90 | ||||
| -rw-r--r-- | firmware/target/arm/iriver/h10/adc-target.h | 3 | ||||
| -rw-r--r-- | firmware/target/arm/iriver/h10/button-h10.c | 12 | ||||
| -rw-r--r-- | firmware/target/arm/iriver/h10/powermgmt-h10.c | 18 | ||||
| -rw-r--r-- | firmware/target/arm/sandisk/power-c200_e200.c | 4 | ||||
| -rw-r--r-- | firmware/target/arm/sandisk/sansa-c200/lcd-c200.c | 2 | ||||
| -rw-r--r-- | firmware/target/arm/sandisk/sansa-e200/lcd-e200.c | 2 | ||||
| -rw-r--r-- | firmware/target/arm/system-pp502x.c | 12 | ||||
| -rw-r--r-- | firmware/target/arm/usb-fw-pp502x.c | 4 | ||||
| -rw-r--r-- | firmware/target/arm/wmcodec-pp.c | 2 |
12 files changed, 98 insertions, 60 deletions
diff --git a/firmware/drivers/audio/as3514.c b/firmware/drivers/audio/as3514.c index 650dd27..7e101d7 100644 --- a/firmware/drivers/audio/as3514.c +++ b/firmware/drivers/audio/as3514.c @@ -138,7 +138,7 @@ void audiohw_init(void) i2c_init(); /* normal outputs for CDI and I2S pin groups */ - DEV_INIT &= ~0x300; + DEV_INIT2 &= ~0x300; /*mini2?*/ outl(inl(0x70000010) & ~0x3000000, 0x70000010); diff --git a/firmware/export/pp5020.h b/firmware/export/pp5020.h index b591bce..865b0b2 100644 --- a/firmware/export/pp5020.h +++ b/firmware/export/pp5020.h @@ -121,8 +121,9 @@ /* Device Controller */ #define DEV_RS (*(volatile unsigned long *)(0x60006004)) -#define DEV_OFF_MASK (*(volatile unsigned long *)(0x60006008)) +#define DEV_RS2 (*(volatile unsigned long *)(0x60006008)) #define DEV_EN (*(volatile unsigned long *)(0x6000600c)) +#define DEV_EN2 (*(volatile unsigned long *)(0x60006010)) #define DEV_SYSTEM 0x00000004 #define DEV_SER0 0x00000040 @@ -141,6 +142,7 @@ #define CLOCK_SOURCE (*(volatile unsigned long *)(0x60006020)) #define PLL_CONTROL (*(volatile unsigned long *)(0x60006034)) #define PLL_STATUS (*(volatile unsigned long *)(0x6000603c)) +#define ADC_CLOCK_SRC (*(volatile unsigned long *)(0x60006094)) #define CLCD_CLOCK_SRC (*(volatile unsigned long *)(0x600060a0)) /* Processors Control */ @@ -304,7 +306,8 @@ #define RAM_TYPE_MASK 0x000000c0 #define ROM_TYPE_MASK 0x00000008 -#define DEV_INIT (*(volatile unsigned long *)(0x70000020)) +#define DEV_INIT1 (*(volatile unsigned long *)(0x70000010)) +#define DEV_INIT2 (*(volatile unsigned long *)(0x70000020)) /* some timing that needs to be handled during clock setup */ #define DEV_TIMING1 (*(volatile unsigned long *)(0x70000034)) #define XMB_NOR_CFG (*(volatile unsigned long *)(0x70000038)) diff --git a/firmware/target/arm/iriver/h10/adc-h10.c b/firmware/target/arm/iriver/h10/adc-h10.c index df9b163..f63e8b8 100644 --- a/firmware/target/arm/iriver/h10/adc-h10.c +++ b/firmware/target/arm/iriver/h10/adc-h10.c @@ -25,29 +25,21 @@ static unsigned short adcdata[NUM_ADC_CHANNELS]; -/* Scan ADC so that adcdata[channel] gets updated */ +/* Scan ADC so that adcdata[channel] gets updated. */ unsigned short adc_scan(int channel) { unsigned int adc_data_1; unsigned int adc_data_2; - /* Initialise */ - ADC_ADDR=0x130; - ADC_STATUS=0; /* 4 bytes, 1 per channel. Each byte is 0 if the channel is - off, 0x40 if the channel is on */ + /* Start conversion */ + ADC_ADDR |= 0x80000000; - /* Enable Channel */ - ADC_ADDR |= (0x1000000<<channel); + /* Wait for conversion to complete */ + while((ADC_STATUS & (0x40<<8*channel))==0); + + /* Stop conversion */ + ADC_ADDR &=~ 0x80000000; - /* Start? */ - ADC_ADDR |= 0x20000000; - ADC_ADDR |= 0x80000000; - -#if 0 - /* wait for ADC ready. THIS IS NOT WORKING (locks up) */ - while(ADC_STATUS & (0x40 << (channel*8))); /* add loop protection here */ -#endif - /* ADC_DATA_1 and ADC_DATA_2 are both four bytes, one byte per channel. For each channel, ADC_DATA_1 stores the 8-bit msb, ADC_DATA_2 stores the 2-bit lsb (in bits 0 and 1). Each channel is 10 bits total. */ @@ -56,6 +48,13 @@ unsigned short adc_scan(int channel) adcdata[channel] = (adc_data_1<<2 | adc_data_2); + /* ADC values read low if PLL is enabled */ + if(PLL_CONTROL & 0x80000000){ + adcdata[channel] += 0x14; + if(adcdata[channel] > 0x400) + adcdata[channel] = 0x400; + } + return adcdata[channel]; } @@ -79,25 +78,64 @@ static void adc_tick(void) } } +/* Figured out from how the OF does things */ void adc_init(void) { - /* Enable ADC */ - ADC_ENABLE_ADDR |= ADC_ENABLE; + ADC_INIT |= 1; + ADC_INIT |= 0x40000000; + udelay(100); + + /* Reset ADC */ + DEV_RS2 |= 0x20; + udelay(100); + + DEV_RS2 &=~ 0x20; + udelay(100); - /* Initialise */ - ADC_INIT=0; + /* Enable ADC */ + DEV_EN2 |= 0x20; + udelay(100); + + ADC_CLOCK_SRC |= 0x3; + udelay(100); + + ADC_ADDR |= 0x40; + ADC_ADDR |= 0x20000000; + udelay(100); + + ADC_INIT; + ADC_INIT = 0; + udelay(100); + + ADC_STATUS = 0; + + /* Enable channel 0 (battery) */ + DEV_INIT1 &=~0x3; + ADC_ADDR |= 0x1000000; + ADC_STATUS |= 0x20; + + /* Enable channel 1 (unknown, temperature?) */ + DEV_INIT1 &=~30; + ADC_ADDR |= 0x2000000; + ADC_STATUS |= 0x2000; + + /* Enable channel 2 (remote) */ + DEV_INIT1 &=~0x300; + DEV_INIT1 |= 0x100; + ADC_ADDR |= 0x4000000; + ADC_STATUS |= 0x200000; + + /* Enable channel 3 (scroll pad) */ + DEV_INIT1 &=~0x3000; + DEV_INIT1 |= 0x1000; + ADC_ADDR |= 0x8000000; + ADC_STATUS |= 0x20000000; /* Force a scan of all channels to get initial values */ adc_scan(ADC_BATTERY); adc_scan(ADC_UNKNOWN_1); adc_scan(ADC_REMOTE); adc_scan(ADC_SCROLLPAD); - - /* FIXME: The ADC sometimes reads 0 for the battery - voltage for the first few seconds. It would be better to fix this by - figuring out how to use the ADC properly. Until then, work around the - problem by waiting until it reads a proper value*/ - while(adc_scan(ADC_UNREG_POWER)==0); tick_add_task(adc_tick); } diff --git a/firmware/target/arm/iriver/h10/adc-target.h b/firmware/target/arm/iriver/h10/adc-target.h index 741c293..f761e76 100644 --- a/firmware/target/arm/iriver/h10/adc-target.h +++ b/firmware/target/arm/iriver/h10/adc-target.h @@ -19,9 +19,6 @@ #ifndef _ADC_TARGET_H_ #define _ADC_TARGET_H_ -#define ADC_ENABLE_ADDR (*(volatile unsigned long*)(0x70000010)) -#define ADC_ENABLE 0x1100 - #define ADC_ADDR (*(volatile unsigned long*)(0x7000ad00)) #define ADC_STATUS (*(volatile unsigned long*)(0x7000ad04)) #define ADC_DATA_1 (*(volatile unsigned long*)(0x7000ad20)) diff --git a/firmware/target/arm/iriver/h10/button-h10.c b/firmware/target/arm/iriver/h10/button-h10.c index d8a82cf..ac09d24 100644 --- a/firmware/target/arm/iriver/h10/button-h10.c +++ b/firmware/target/arm/iriver/h10/button-h10.c @@ -52,7 +52,7 @@ bool button_hold(void) bool remote_button_hold(void) { - return adc_scan(ADC_REMOTE) < 0x17; + return adc_scan(ADC_REMOTE) < 0x2B; } /* @@ -102,7 +102,7 @@ int button_read_device(void) data = adc_scan(ADC_SCROLLPAD); GPIOD_OUTPUT_VAL |= 0x40; - if(data < 0x210) + if(data < 0x224) { btn |= BUTTON_SCROLL_DOWN; } else { @@ -115,7 +115,7 @@ int button_read_device(void) remote_hold_button_old = remote_hold_button; data = adc_scan(ADC_REMOTE); - remote_hold_button = data < 0x17; + remote_hold_button = data < 0x2B; #ifndef BOOTLOADER if (remote_hold_button != remote_hold_button_old) @@ -126,13 +126,13 @@ int button_read_device(void) { if (data < 0x3FF) { - if(data < 0x1F0) - if(data < 0x141) + if(data < 0x204) + if(data < 0x155) btn |= BUTTON_RC_FF; else btn |= BUTTON_RC_REW; else - if(data < 0x2BC) + if(data < 0x2D0) btn |= BUTTON_RC_VOL_DOWN; else btn |= BUTTON_RC_VOL_UP; diff --git a/firmware/target/arm/iriver/h10/powermgmt-h10.c b/firmware/target/arm/iriver/h10/powermgmt-h10.c index 18e3879..6f8cd12 100644 --- a/firmware/target/arm/iriver/h10/powermgmt-h10.c +++ b/firmware/target/arm/iriver/h10/powermgmt-h10.c @@ -25,18 +25,18 @@ const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] = { #ifdef IRIVER_H10 - 3760 + 3733 #elif defined IRIVER_H10_5GB - 3720 + 3695 #endif }; const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] = { #ifdef IRIVER_H10 - 3650 + 3627 #elif defined IRIVER_H10_5GB - 3650 + 3627 #endif }; @@ -44,9 +44,9 @@ const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] = const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] = { #ifdef IRIVER_H10 - { 3760, 3800, 3850, 3870, 3900, 3950, 4020, 4070, 4110, 4180, 4240 } + { 3733, 3772, 3821, 3840, 3869, 3917, 3985, 4034, 4072, 4140, 4198 } #elif defined IRIVER_H10_5GB - { 3720, 3740, 3800, 3820, 3840, 3880, 3940, 4020, 4060, 4150, 4240 } + { 3695, 3714, 3772, 3791, 3811, 3850, 3908, 3985, 4024, 4111, 4198 } #endif }; @@ -54,14 +54,14 @@ const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] = const unsigned short percent_to_volt_charge[11] = { #ifdef IRIVER_H10 - 3990, 4030, 4060, 4080, 4100, 4120, 4150, 4180, 4220, 4260, 4310 + 3956, 3995, 4024, 4043, 4063, 4082, 4111, 4140, 4179, 4218, 4266 #elif defined IRIVER_H10_5GB /* TODO: Not yet calibrated */ - 3880, 3920, 3960, 4000, 4060, 4100, 4150, 4190, 4240, 4280, 4330 + 3850, 3888, 3927, 3966, 4024, 4063, 4111, 4150, 4198, 4237, 4286 #endif }; -#define BATTERY_SCALE_FACTOR 4800 +#define BATTERY_SCALE_FACTOR 4650 /* full-scale ADC readout (2^10) in millivolt */ /* Returns battery voltage from ADC [millivolts] */ diff --git a/firmware/target/arm/sandisk/power-c200_e200.c b/firmware/target/arm/sandisk/power-c200_e200.c index 910c3aa..8745aa3 100644 --- a/firmware/target/arm/sandisk/power-c200_e200.c +++ b/firmware/target/arm/sandisk/power-c200_e200.c @@ -85,7 +85,7 @@ bool tuner_power_nolock(bool status) #if defined(SANSA_E200) outl(inl(0x70000084) | 0x1, 0x70000084); #else /* SANSA_C200 */ - DEV_INIT &= ~0x800; + DEV_INIT2 &= ~0x800; #endif udelay(5); @@ -120,7 +120,7 @@ bool tuner_power_nolock(bool status) #if defined (SANSA_E200) outl(inl(0x70000084) & ~0x1, 0x70000084); #else - DEV_INIT |= 0x800; + DEV_INIT2 |= 0x800; #endif } diff --git a/firmware/target/arm/sandisk/sansa-c200/lcd-c200.c b/firmware/target/arm/sandisk/sansa-c200/lcd-c200.c index 24a7585..5975ab1 100644 --- a/firmware/target/arm/sandisk/sansa-c200/lcd-c200.c +++ b/firmware/target/arm/sandisk/sansa-c200/lcd-c200.c @@ -88,7 +88,7 @@ void lcd_init_device(void) outl(inl(0x70000010) & ~0xfc000000, 0x70000010); outl(inl(0x70000010), 0x70000010); - DEV_INIT &= ~0x400; + DEV_INIT2 &= ~0x400; udelay(10000); LCD1_CONTROL &= ~0x4; diff --git a/firmware/target/arm/sandisk/sansa-e200/lcd-e200.c b/firmware/target/arm/sandisk/sansa-e200/lcd-e200.c index 41926bb..bf1fcf9 100644 --- a/firmware/target/arm/sandisk/sansa-e200/lcd-e200.c +++ b/firmware/target/arm/sandisk/sansa-e200/lcd-e200.c @@ -372,7 +372,7 @@ void lcd_init_device(void) /* Controller init */ outl((inl(0x70000084) | (1 << 28)), 0x70000084); outl((inl(0x70000080) & ~(1 << 28)), 0x70000080); - outl(((inl(0x70000010) & (0x03ffffff)) | (0x15 << 26)), 0x70000010); + DEV_INIT1 = ( (DEV_INIT1 & 0x03ffffff) | (0x15 << 26) ); outl(((inl(0x70000014) & (0x0fffffff)) | (0x5 << 28)), 0x70000014); outl((inl(0x70000020) & ~(0x3 << 10)), 0x70000020); DEV_EN |= DEV_LCD; /* Enable controller */ diff --git a/firmware/target/arm/system-pp502x.c b/firmware/target/arm/system-pp502x.c index d24d19f..0882d9f 100644 --- a/firmware/target/arm/system-pp502x.c +++ b/firmware/target/arm/system-pp502x.c @@ -240,17 +240,17 @@ void system_init(void) { #if defined(SANSA_E200) || defined(SANSA_C200) /* Reset all devices */ - DEV_OFF_MASK |= 0x20; + DEV_RS2 |= 0x20; DEV_RS = 0x3bfffef8; - DEV_OFF_MASK = -1; + DEV_RS2 = -1; DEV_RS = 0; - DEV_OFF_MASK = 0; + DEV_RS2 = 0; #elif defined (IRIVER_H10) DEV_RS = 0x3ffffef8; - DEV_OFF_MASK = -1; + DEV_RS2 = -1; outl(inl(0x70000024) | 0xc0, 0x70000024); DEV_RS = 0; - DEV_OFF_MASK = 0; + DEV_RS2 = 0; #endif #if !defined(SANSA_E200) && !defined(SANSA_C200) @@ -289,7 +289,7 @@ void system_init(void) outl(inl(0x6000a000) | 0x80000000, 0x6000a000); /* Init DMA controller? */ #endif - DEV_INIT |= 1 << 30; /* enable PLL power */ + DEV_INIT2 |= 1 << 30; /* enable PLL power */ #ifdef HAVE_ADJUSTABLE_CPU_FREQ #if NUM_CORES > 1 diff --git a/firmware/target/arm/usb-fw-pp502x.c b/firmware/target/arm/usb-fw-pp502x.c index 792a1b0..7d197f0 100644 --- a/firmware/target/arm/usb-fw-pp502x.c +++ b/firmware/target/arm/usb-fw-pp502x.c @@ -44,7 +44,7 @@ void usb_init_device(void) DEV_RS |= DEV_USB; /* reset usb start */ DEV_RS &=~DEV_USB;/* reset usb end */ - DEV_INIT |= INIT_USB; + DEV_INIT2 |= INIT_USB; while ((inl(0x70000028) & 0x80) == 0); UDC_PORTSC1 |= PORTSCX_PORT_RESET; @@ -70,7 +70,7 @@ void usb_init_device(void) /* Note from IPL source (referring to next 5 lines of code: THIS NEEDS TO BE CHANGED ONCE THERE IS KERNEL USB */ - DEV_INIT |= INIT_USB; + DEV_INIT2 |= INIT_USB; DEV_EN |= DEV_USB; while ((inl(0x70000028) & 0x80) == 0); outl(inl(0x70000028) | 0x2, 0x70000028); diff --git a/firmware/target/arm/wmcodec-pp.c b/firmware/target/arm/wmcodec-pp.c index a2c83f3..3dd0069 100644 --- a/firmware/target/arm/wmcodec-pp.c +++ b/firmware/target/arm/wmcodec-pp.c @@ -46,7 +46,7 @@ void audiohw_init(void) { #ifdef CPU_PP502x /* normal outputs for CDI and I2S pin groups */ - DEV_INIT &= ~0x300; + DEV_INIT2 &= ~0x300; /*mini2?*/ outl(inl(0x70000010) & ~0x3000000, 0x70000010); |