Move all iPod targets into the target tree. FS#5890
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11129 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
1d69db7355
commit
d4945dc0d0
33 changed files with 1395 additions and 649 deletions
|
@ -21,3 +21,5 @@ target/arm/sandisk/sansa-e200/*.[chS]
|
|||
target/arm/iriver/h10/*.[chS]
|
||||
target/arm/gigabeat/meg-fx/*.[chS]
|
||||
target/arm/tatung/tpj1022/*.[chS]
|
||||
target/arm/ipod/*.[chS]
|
||||
target/arm/ipod/3g/*.[chS]
|
||||
|
|
|
@ -87,13 +87,6 @@ drivers/lcd-h100-remote.c
|
|||
drivers/lcd-remote-2bit-vi.c
|
||||
#endif
|
||||
#endif
|
||||
#if CONFIG_LCD==LCD_IPODNANO || CONFIG_LCD==LCD_IPODCOLOR \
|
||||
|| CONFIG_LCD == LCD_IPOD2BPP || CONFIG_LCD == LCD_IPODMINI
|
||||
drivers/lcd-ipod.c
|
||||
#endif
|
||||
#if CONFIG_LCD==LCD_IPODVIDEO
|
||||
drivers/lcd-ipodvideo.c
|
||||
#endif
|
||||
#if CONFIG_LCD==LCD_H300
|
||||
drivers/lcd-h300.c
|
||||
#endif
|
||||
|
@ -318,3 +311,95 @@ target/arm/tatung/tpj1022/lcd-tpj1022.c
|
|||
target/arm/tatung/tpj1022/adc-tpj1022.c
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef IPOD_4G
|
||||
#ifndef SIMULATOR
|
||||
drivers/lcd-ipod.c
|
||||
drivers/pcf50605.c
|
||||
target/arm/ata-pp5020.c
|
||||
target/arm/ipod/adc-ipod.c
|
||||
target/arm/ipod/backlight-4g_color.c
|
||||
target/arm/ipod/button-clickwheel.c
|
||||
target/arm/ipod/power-ipod.c
|
||||
target/arm/ipod/usb-ipod.c
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef IPOD_COLOR
|
||||
#ifndef SIMULATOR
|
||||
drivers/lcd-ipod.c
|
||||
drivers/pcf50605.c
|
||||
target/arm/ata-pp5020.c
|
||||
target/arm/ipod/adc-ipod.c
|
||||
target/arm/ipod/backlight-4g_color.c
|
||||
target/arm/ipod/button-clickwheel.c
|
||||
target/arm/ipod/power-ipod.c
|
||||
target/arm/ipod/usb-ipod.c
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef IPOD_NANO
|
||||
#ifndef SIMULATOR
|
||||
drivers/lcd-ipod.c
|
||||
drivers/pcf50605.c
|
||||
target/arm/ata-pp5020.c
|
||||
target/arm/ipod/adc-ipod.c
|
||||
target/arm/ipod/backlight-nano_video.c
|
||||
target/arm/ipod/button-clickwheel.c
|
||||
target/arm/ipod/power-ipod.c
|
||||
target/arm/ipod/usb-ipod.c
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef IPOD_VIDEO
|
||||
#ifndef SIMULATOR
|
||||
drivers/pcf50605.c
|
||||
target/arm/ata-pp5020.c
|
||||
target/arm/ipod/adc-ipod.c
|
||||
target/arm/ipod/backlight-nano_video.c
|
||||
target/arm/ipod/button-clickwheel.c
|
||||
target/arm/ipod/power-ipod.c
|
||||
target/arm/ipod/usb-ipod.c
|
||||
drivers/lcd-ipodvideo.c
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef IPOD_3G
|
||||
#ifndef SIMULATOR
|
||||
drivers/lcd-ipod.c
|
||||
drivers/pcf50605.c
|
||||
target/arm/ata-pp5020.c
|
||||
target/arm/ipod/adc-ipod.c
|
||||
target/arm/ipod/3g/backlight-3g.c
|
||||
target/arm/ipod/3g/button-3g.c
|
||||
target/arm/ipod/power-ipod.c
|
||||
target/arm/ipod/usb-ipod.c
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef IPOD_MINI
|
||||
#ifndef SIMULATOR
|
||||
drivers/lcd-ipod.c
|
||||
drivers/pcf50605.c
|
||||
target/arm/ata-pp5020.c
|
||||
target/arm/ipod/adc-ipod.c
|
||||
target/arm/ipod/backlight-mini1g_mini2g.c
|
||||
target/arm/ipod/button-mini1g.c
|
||||
target/arm/ipod/power-ipod.c
|
||||
target/arm/ipod/usb-ipod.c
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef IPOD_MINI2G
|
||||
#ifndef SIMULATOR
|
||||
drivers/lcd-ipod.c
|
||||
drivers/pcf50605.c
|
||||
target/arm/ata-pp5020.c
|
||||
target/arm/ipod/adc-ipod.c
|
||||
target/arm/ipod/backlight-mini1g_mini2g.c
|
||||
target/arm/ipod/button-clickwheel.c
|
||||
target/arm/ipod/power-ipod.c
|
||||
target/arm/ipod/usb-ipod.c
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -77,23 +77,6 @@ static inline void __backlight_on(void)
|
|||
or_b(0x40, &PADRH); /* drive it high */
|
||||
#elif CONFIG_BACKLIGHT == BL_GMINI
|
||||
P1 |= 0x10;
|
||||
#elif CONFIG_BACKLIGHT == BL_IPOD4G
|
||||
/* brightness full */
|
||||
outl(0x80000000 | (0xff << 16), 0x7000a010);
|
||||
|
||||
/* set port b bit 3 on */
|
||||
outl(((0x100 | 1) << 3), 0x6000d824);
|
||||
#elif CONFIG_BACKLIGHT==BL_IPODMINI
|
||||
/* set port B03 on */
|
||||
outl(((0x100 | 1) << 3), 0x6000d824);
|
||||
#elif CONFIG_BACKLIGHT==BL_IPODNANO
|
||||
/* set port B03 on */
|
||||
outl(((0x100 | 1) << 3), 0x6000d824);
|
||||
|
||||
/* set port L07 on */
|
||||
outl(((0x100 | 1) << 7), 0x6000d12c);
|
||||
#elif CONFIG_BACKLIGHT==BL_IPOD3G
|
||||
outl(inl(0xc0001000) | 0x02, 0xc0001000);
|
||||
#elif CONFIG_BACKLIGHT==BL_IRIVER_IFP7XX
|
||||
GPIO3_SET = 1;
|
||||
#endif
|
||||
|
@ -115,23 +98,8 @@ static inline void __backlight_off(void)
|
|||
and_b(~0x40, &PADRH); /* drive it low */
|
||||
#elif CONFIG_BACKLIGHT == BL_GMINI
|
||||
P1 &= ~0x10;
|
||||
#elif CONFIG_BACKLIGHT == BL_IPOD4G
|
||||
/* fades backlight off on 4g */
|
||||
outl(inl(0x70000084) & ~0x2000000, 0x70000084);
|
||||
outl(0x80000000, 0x7000a010);
|
||||
#elif CONFIG_BACKLIGHT==BL_IPODNANO
|
||||
/* set port B03 off */
|
||||
outl(((0x100 | 0) << 3), 0x6000d824);
|
||||
|
||||
/* set port L07 off */
|
||||
outl(((0x100 | 0) << 7), 0x6000d12c);
|
||||
#elif CONFIG_BACKLIGHT==BL_IRIVER_IFP7XX
|
||||
GPIO3_CLR = 1;
|
||||
#elif CONFIG_BACKLIGHT==BL_IPOD3G
|
||||
outl(inl(0xc0001000) & ~0x02, 0xc0001000);
|
||||
#elif CONFIG_BACKLIGHT==BL_IPODMINI
|
||||
/* set port B03 off */
|
||||
outl(((0x100 | 0) << 3), 0x6000d824);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
#include "thread.h"
|
||||
#include "string.h"
|
||||
#include "adc.h"
|
||||
#include "pcf50605.h"
|
||||
#include "pcf50606.h"
|
||||
|
||||
#if CONFIG_CPU == SH7034
|
||||
|
@ -285,62 +284,6 @@ void adc_init(void)
|
|||
sleep(2); /* Ensure valid readings when adc_init returns */
|
||||
}
|
||||
|
||||
#elif defined(IPOD_ARCH)
|
||||
|
||||
struct adc_struct {
|
||||
long timeout;
|
||||
void (*conversion)(unsigned short *data);
|
||||
short channelnum;
|
||||
unsigned short data;
|
||||
};
|
||||
|
||||
static struct adc_struct adcdata[NUM_ADC_CHANNELS] IDATA_ATTR;
|
||||
|
||||
static unsigned short _adc_read(struct adc_struct *adc)
|
||||
{
|
||||
if (adc->timeout < current_tick) {
|
||||
unsigned char data[2];
|
||||
unsigned short value;
|
||||
/* 5x per 2 seconds */
|
||||
adc->timeout = current_tick + (HZ * 2 / 5);
|
||||
|
||||
/* ADCC1, 10 bit, start */
|
||||
pcf50605_write(0x2f, (adc->channelnum << 1) | 0x1);
|
||||
pcf50605_read_multiple(0x30, data, 2); /* ADCS1, ADCS2 */
|
||||
value = data[0];
|
||||
value <<= 2;
|
||||
value |= data[1] & 0x3;
|
||||
|
||||
if (adc->conversion) {
|
||||
adc->conversion(&value);
|
||||
}
|
||||
adc->data = value;
|
||||
return value;
|
||||
} else {
|
||||
return adc->data;
|
||||
}
|
||||
}
|
||||
|
||||
/* Force an ADC scan _now_ */
|
||||
unsigned short adc_scan(int channel) {
|
||||
struct adc_struct *adc = &adcdata[channel];
|
||||
adc->timeout = 0;
|
||||
return _adc_read(adc);
|
||||
}
|
||||
|
||||
/* Retrieve the ADC value, only does a scan periodically */
|
||||
unsigned short adc_read(int channel) {
|
||||
return _adc_read(&adcdata[channel]);
|
||||
}
|
||||
|
||||
void adc_init(void)
|
||||
{
|
||||
struct adc_struct *adc_battery = &adcdata[ADC_BATTERY];
|
||||
adc_battery->channelnum = 0x2; /* ADCVIN1, resistive divider */
|
||||
adc_battery->timeout = 0;
|
||||
_adc_read(adc_battery);
|
||||
}
|
||||
|
||||
#elif CONFIG_CPU == PNX0101
|
||||
|
||||
static unsigned short adcdata[NUM_ADC_CHANNELS];
|
||||
|
|
|
@ -72,8 +72,7 @@ static bool remote_filter_first_keypress;
|
|||
#define REPEAT_INTERVAL_FINISH 5
|
||||
|
||||
/* the power-off button and number of repeated keys before shutting off */
|
||||
#if (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD) ||\
|
||||
(CONFIG_KEYPAD == IRIVER_IFP7XX_PAD)
|
||||
#if (CONFIG_KEYPAD == IRIVER_IFP7XX_PAD)
|
||||
#define POWEROFF_BUTTON BUTTON_PLAY
|
||||
#define POWEROFF_COUNT 40
|
||||
#elif !defined(TARGET_TREE)
|
||||
|
@ -87,344 +86,10 @@ static int button_read(void);
|
|||
static bool remote_button_hold_only(void);
|
||||
#endif
|
||||
|
||||
#if CONFIG_KEYPAD == IPOD_4G_PAD
|
||||
/* Variable to use for setting button status in interrupt handler */
|
||||
int int_btn = BUTTON_NONE;
|
||||
#ifdef HAVE_WHEEL_POSITION
|
||||
static int wheel_position = -1;
|
||||
static bool send_events = true;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_HEADPHONE_DETECTION
|
||||
bool phones_present = false;
|
||||
#endif
|
||||
|
||||
#if (CONFIG_KEYPAD == IPOD_4G_PAD) && !defined(IPOD_MINI)
|
||||
static void opto_i2c_init(void)
|
||||
{
|
||||
int i, curr_value;
|
||||
|
||||
/* wait for value to settle */
|
||||
i = 1000;
|
||||
curr_value = (inl(0x7000c104) << 16) >> 24;
|
||||
while (i > 0)
|
||||
{
|
||||
int new_value = (inl(0x7000c104) << 16) >> 24;
|
||||
|
||||
if (new_value != curr_value) {
|
||||
i = 10000;
|
||||
curr_value = new_value;
|
||||
}
|
||||
else {
|
||||
i--;
|
||||
}
|
||||
}
|
||||
|
||||
GPIOB_OUTPUT_VAL |= 0x10;
|
||||
DEV_EN |= 0x10000;
|
||||
DEV_RS |= 0x10000;
|
||||
udelay(5);
|
||||
DEV_RS &= ~0x10000; /* finish reset */
|
||||
|
||||
outl(0xffffffff, 0x7000c120);
|
||||
outl(0xffffffff, 0x7000c124);
|
||||
outl(0xc00a1f00, 0x7000c100);
|
||||
outl(0x1000000, 0x7000c104);
|
||||
}
|
||||
|
||||
static inline int ipod_4g_button_read(void)
|
||||
{
|
||||
int whl = -1;
|
||||
|
||||
/* The ipodlinux source had a udelay(250) here, but testing has shown that
|
||||
it is not needed - tested on Nano, Color/Photo and Video. */
|
||||
/* udelay(250);*/
|
||||
|
||||
int btn = BUTTON_NONE;
|
||||
unsigned reg = 0x7000c104;
|
||||
if ((inl(0x7000c104) & 0x4000000) != 0) {
|
||||
unsigned status = inl(0x7000c140);
|
||||
|
||||
reg = reg + 0x3C; /* 0x7000c140 */
|
||||
outl(0x0, 0x7000c140); /* clear interrupt status? */
|
||||
|
||||
if ((status & 0x800000ff) == 0x8000001a) {
|
||||
static int old_wheel_value IDATA_ATTR = -1;
|
||||
static int wheel_repeat = 0;
|
||||
|
||||
if (status & 0x100)
|
||||
btn |= BUTTON_SELECT;
|
||||
if (status & 0x200)
|
||||
btn |= BUTTON_RIGHT;
|
||||
if (status & 0x400)
|
||||
btn |= BUTTON_LEFT;
|
||||
if (status & 0x800)
|
||||
btn |= BUTTON_PLAY;
|
||||
if (status & 0x1000)
|
||||
btn |= BUTTON_MENU;
|
||||
if (status & 0x40000000) {
|
||||
/* NB: highest wheel = 0x5F, clockwise increases */
|
||||
int new_wheel_value = (status << 9) >> 25;
|
||||
whl = new_wheel_value;
|
||||
backlight_on();
|
||||
/* The queue should have no other events when scrolling */
|
||||
if (queue_empty(&button_queue) && old_wheel_value >= 0) {
|
||||
|
||||
/* This is for later = BUTTON_SCROLL_TOUCH;*/
|
||||
int wheel_delta = new_wheel_value - old_wheel_value;
|
||||
unsigned long data;
|
||||
int wheel_keycode;
|
||||
|
||||
if (wheel_delta < -48)
|
||||
wheel_delta += 96; /* Forward wrapping case */
|
||||
else if (wheel_delta > 48)
|
||||
wheel_delta -= 96; /* Backward wrapping case */
|
||||
|
||||
if (wheel_delta > 4) {
|
||||
wheel_keycode = BUTTON_SCROLL_FWD;
|
||||
} else if (wheel_delta < -4) {
|
||||
wheel_keycode = BUTTON_SCROLL_BACK;
|
||||
} else goto wheel_end;
|
||||
|
||||
#ifdef HAVE_WHEEL_POSITION
|
||||
if (send_events)
|
||||
#endif
|
||||
{
|
||||
data = (wheel_delta << 16) | new_wheel_value;
|
||||
queue_post(&button_queue, wheel_keycode | wheel_repeat,
|
||||
(void *)data);
|
||||
}
|
||||
|
||||
if (!wheel_repeat) wheel_repeat = BUTTON_REPEAT;
|
||||
}
|
||||
|
||||
old_wheel_value = new_wheel_value;
|
||||
} else if (old_wheel_value >= 0) {
|
||||
/* scroll wheel up */
|
||||
old_wheel_value = -1;
|
||||
wheel_repeat = 0;
|
||||
}
|
||||
|
||||
} else if (status == 0xffffffff) {
|
||||
opto_i2c_init();
|
||||
}
|
||||
}
|
||||
|
||||
wheel_end:
|
||||
|
||||
if ((inl(reg) & 0x8000000) != 0) {
|
||||
outl(0xffffffff, 0x7000c120);
|
||||
outl(0xffffffff, 0x7000c124);
|
||||
}
|
||||
/* Save the new absolute wheel position */
|
||||
wheel_position = whl;
|
||||
return btn;
|
||||
}
|
||||
|
||||
void ipod_4g_button_int(void)
|
||||
{
|
||||
CPU_HI_INT_CLR = I2C_MASK;
|
||||
/* The following delay was 250 in the ipodlinux source, but 50 seems to
|
||||
work fine - tested on Nano, Color/Photo and Video. */
|
||||
udelay(50);
|
||||
outl(0x0, 0x7000c140);
|
||||
int_btn = ipod_4g_button_read();
|
||||
outl(inl(0x7000c104) | 0xC000000, 0x7000c104);
|
||||
outl(0x400a1f00, 0x7000c100);
|
||||
|
||||
GPIOB_OUTPUT_VAL |= 0x10;
|
||||
CPU_INT_EN = 0x40000000;
|
||||
CPU_HI_INT_EN = I2C_MASK;
|
||||
}
|
||||
#endif
|
||||
#if (CONFIG_KEYPAD == IPOD_3G_PAD) || defined(IPOD_MINI)
|
||||
/* iPod 3G and mini 1G, mini 2G uses iPod 4G code */
|
||||
void handle_scroll_wheel(int new_scroll, int was_hold, int reverse)
|
||||
{
|
||||
int wheel_keycode = BUTTON_NONE;
|
||||
static int prev_scroll = -1;
|
||||
static int direction = 0;
|
||||
static int count = 0;
|
||||
static int scroll_state[4][4] = {
|
||||
{0, 1, -1, 0},
|
||||
{-1, 0, 0, 1},
|
||||
{1, 0, 0, -1},
|
||||
{0, -1, 1, 0}
|
||||
};
|
||||
|
||||
if ( prev_scroll == -1 ) {
|
||||
prev_scroll = new_scroll;
|
||||
}
|
||||
else if (direction != scroll_state[prev_scroll][new_scroll]) {
|
||||
direction = scroll_state[prev_scroll][new_scroll];
|
||||
count = 0;
|
||||
}
|
||||
else if (!was_hold) {
|
||||
backlight_on();
|
||||
if (++count == 6) { /* reduce sensitivity */
|
||||
count = 0;
|
||||
switch (direction) {
|
||||
case 1:
|
||||
if (reverse) {
|
||||
/* 'r' keypress */
|
||||
wheel_keycode = BUTTON_SCROLL_FWD;
|
||||
}
|
||||
else {
|
||||
/* 'l' keypress */
|
||||
wheel_keycode = BUTTON_SCROLL_BACK;
|
||||
}
|
||||
break;
|
||||
case -1:
|
||||
if (reverse) {
|
||||
/* 'l' keypress */
|
||||
wheel_keycode = BUTTON_SCROLL_BACK;
|
||||
}
|
||||
else {
|
||||
/* 'r' keypress */
|
||||
wheel_keycode = BUTTON_SCROLL_FWD;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
/* only happens if we get out of sync */
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (wheel_keycode != BUTTON_NONE && queue_empty(&button_queue))
|
||||
queue_post(&button_queue, wheel_keycode, NULL);
|
||||
prev_scroll = new_scroll;
|
||||
}
|
||||
#endif
|
||||
#if (CONFIG_KEYPAD == IPOD_4G_PAD) && defined(IPOD_MINI)
|
||||
/* mini 1 only, mini 2G uses iPod 4G code */
|
||||
static int ipod_mini_button_read(void)
|
||||
{
|
||||
unsigned char source, wheel_source, state, wheel_state;
|
||||
static bool was_hold = false;
|
||||
int btn = BUTTON_NONE;
|
||||
|
||||
/* The ipodlinux source had a udelay(250) here, but testing has shown that
|
||||
it is not needed - tested on mini 1g. */
|
||||
/* udelay(250);*/
|
||||
|
||||
/* get source(s) of interupt */
|
||||
source = GPIOA_INT_STAT & 0x3f;
|
||||
wheel_source = GPIOB_INT_STAT & 0x30;
|
||||
|
||||
if (source == 0 && wheel_source == 0) {
|
||||
return BUTTON_NONE; /* not for us */
|
||||
}
|
||||
|
||||
/* get current keypad & wheel status */
|
||||
state = GPIOA_INPUT_VAL & 0x3f;
|
||||
wheel_state = GPIOB_INPUT_VAL & 0x30;
|
||||
|
||||
/* toggle interrupt level */
|
||||
GPIOA_INT_LEV = ~state;
|
||||
GPIOB_INT_LEV = ~wheel_state;
|
||||
|
||||
/* hold switch causes all outputs to go low */
|
||||
/* we shouldn't interpret these as key presses */
|
||||
if ((state & 0x20)) {
|
||||
if (!(state & 0x1))
|
||||
btn |= BUTTON_SELECT;
|
||||
if (!(state & 0x2))
|
||||
btn |= BUTTON_MENU;
|
||||
if (!(state & 0x4))
|
||||
btn |= BUTTON_PLAY;
|
||||
if (!(state & 0x8))
|
||||
btn |= BUTTON_RIGHT;
|
||||
if (!(state & 0x10))
|
||||
btn |= BUTTON_LEFT;
|
||||
|
||||
if (wheel_source & 0x30) {
|
||||
handle_scroll_wheel((wheel_state & 0x30) >> 4, was_hold, 1);
|
||||
}
|
||||
}
|
||||
|
||||
was_hold = button_hold();
|
||||
|
||||
/* ack any active interrupts */
|
||||
if (source)
|
||||
GPIOA_INT_CLR = source;
|
||||
if (wheel_source)
|
||||
GPIOB_INT_CLR = wheel_source;
|
||||
|
||||
return btn;
|
||||
}
|
||||
|
||||
void ipod_mini_button_int(void)
|
||||
{
|
||||
CPU_HI_INT_CLR = GPIO_MASK;
|
||||
int_btn = ipod_mini_button_read();
|
||||
//CPU_INT_EN = 0x40000000;
|
||||
CPU_HI_INT_EN = GPIO_MASK;
|
||||
}
|
||||
#endif
|
||||
#if CONFIG_KEYPAD == IPOD_3G_PAD
|
||||
static int ipod_3g_button_read(void)
|
||||
{
|
||||
unsigned char source, state;
|
||||
static int was_hold = 0;
|
||||
int btn = BUTTON_NONE;
|
||||
/*
|
||||
* we need some delay for g3, cause hold generates several interrupts,
|
||||
* some of them delayed
|
||||
*/
|
||||
udelay(250);
|
||||
|
||||
/* get source of interupts */
|
||||
source = GPIOA_INT_STAT;
|
||||
|
||||
|
||||
/* get current keypad status */
|
||||
state = GPIOA_INPUT_VAL;
|
||||
GPIOA_INT_LEV = ~state;
|
||||
|
||||
if (was_hold && source == 0x40 && state == 0xbf) {
|
||||
/* ack any active interrupts */
|
||||
GPIOA_INT_CLR = source;
|
||||
return BUTTON_NONE;
|
||||
}
|
||||
was_hold = 0;
|
||||
|
||||
|
||||
if ((state & 0x20) == 0) {
|
||||
/* 3g hold switch is active low */
|
||||
was_hold = 1;
|
||||
/* hold switch on 3g causes all outputs to go low */
|
||||
/* we shouldn't interpret these as key presses */
|
||||
GPIOA_INT_CLR = source;
|
||||
return BUTTON_NONE;
|
||||
}
|
||||
if ((state & 0x1) == 0) {
|
||||
btn |= BUTTON_RIGHT;
|
||||
}
|
||||
if ((state & 0x2) == 0) {
|
||||
btn |= BUTTON_SELECT;
|
||||
}
|
||||
if ((state & 0x4) == 0) {
|
||||
btn |= BUTTON_PLAY;
|
||||
}
|
||||
if ((state & 0x8) == 0) {
|
||||
btn |= BUTTON_LEFT;
|
||||
}
|
||||
if ((state & 0x10) == 0) {
|
||||
btn |= BUTTON_MENU;
|
||||
}
|
||||
|
||||
if (source & 0xc0) {
|
||||
handle_scroll_wheel((state & 0xc0) >> 6, was_hold, 0);
|
||||
}
|
||||
|
||||
/* ack any active interrupts */
|
||||
GPIOA_INT_CLR = source;
|
||||
|
||||
return btn;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void button_tick(void)
|
||||
{
|
||||
static int count = 0;
|
||||
|
@ -669,45 +334,6 @@ void button_init(void)
|
|||
/* nothing to initialize here */
|
||||
#elif CONFIG_KEYPAD == GMINI100_PAD
|
||||
/* nothing to initialize here */
|
||||
#elif (CONFIG_KEYPAD == IPOD_4G_PAD) && !defined(IPOD_MINI)
|
||||
opto_i2c_init();
|
||||
/* hold button - enable as input */
|
||||
GPIOA_ENABLE |= 0x20;
|
||||
GPIOA_OUTPUT_EN &= ~0x20;
|
||||
/* hold button - set interrupt levels */
|
||||
GPIOA_INT_LEV = ~(GPIOA_INPUT_VAL & 0x20);
|
||||
GPIOA_INT_CLR = GPIOA_INT_STAT & 0x20;
|
||||
/* enable interrupts */
|
||||
GPIOA_INT_EN = 0x20;
|
||||
/* unmask interrupt */
|
||||
CPU_INT_EN = 0x40000000;
|
||||
CPU_HI_INT_EN = I2C_MASK;
|
||||
|
||||
#elif (CONFIG_KEYPAD == IPOD_4G_PAD) && defined(IPOD_MINI)
|
||||
/* iPod Mini G1 */
|
||||
/* buttons - enable as input */
|
||||
GPIOA_ENABLE |= 0x3f;
|
||||
GPIOA_OUTPUT_EN &= ~0x3f;
|
||||
/* scroll wheel- enable as input */
|
||||
GPIOB_ENABLE |= 0x30; /* port b 4,5 */
|
||||
GPIOB_OUTPUT_EN &= ~0x30; /* port b 4,5 */
|
||||
/* buttons - set interrupt levels */
|
||||
GPIOA_INT_LEV = ~(GPIOA_INPUT_VAL & 0x3f);
|
||||
GPIOA_INT_CLR = GPIOA_INT_STAT & 0x3f;
|
||||
/* scroll wheel - set interrupt levels */
|
||||
GPIOB_INT_LEV = ~(GPIOB_INPUT_VAL & 0x30);
|
||||
GPIOB_INT_CLR = GPIOB_INT_STAT & 0x30;
|
||||
/* enable interrupts */
|
||||
GPIOA_INT_EN = 0x3f;
|
||||
GPIOB_INT_EN = 0x30;
|
||||
/* unmask interrupt */
|
||||
CPU_INT_EN = 0x40000000;
|
||||
CPU_HI_INT_EN = GPIO_MASK;
|
||||
|
||||
#elif CONFIG_KEYPAD == IPOD_3G_PAD
|
||||
GPIOA_INT_LEV = ~GPIOA_INPUT_VAL;
|
||||
GPIOA_INT_CLR = GPIOA_INT_STAT;
|
||||
GPIOA_INT_EN = 0xff;
|
||||
#endif /* CONFIG_KEYPAD */
|
||||
queue_init(&button_queue, true);
|
||||
button_read();
|
||||
|
@ -1266,35 +892,6 @@ static int button_read(void)
|
|||
if (data & 0x01)
|
||||
btn |= BUTTON_ON;
|
||||
|
||||
#elif (CONFIG_KEYPAD == IPOD_4G_PAD)
|
||||
static bool hold_button = false;
|
||||
bool hold_button_old;
|
||||
|
||||
/* normal buttons */
|
||||
hold_button_old = hold_button;
|
||||
hold_button = button_hold();
|
||||
|
||||
if (hold_button != hold_button_old)
|
||||
backlight_hold_changed(hold_button);
|
||||
|
||||
(void)data;
|
||||
/* The int_btn variable is set in the button interrupt handler */
|
||||
btn = int_btn;
|
||||
|
||||
#elif (CONFIG_KEYPAD == IPOD_3G_PAD)
|
||||
static bool hold_button = false;
|
||||
bool hold_button_old;
|
||||
|
||||
/* normal buttons */
|
||||
hold_button_old = hold_button;
|
||||
hold_button = button_hold();
|
||||
|
||||
if (hold_button != hold_button_old)
|
||||
backlight_hold_changed(hold_button);
|
||||
|
||||
(void)data;
|
||||
btn = ipod_3g_button_read();
|
||||
|
||||
#endif /* CONFIG_KEYPAD */
|
||||
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
|
@ -1313,13 +910,6 @@ static int button_read(void)
|
|||
return retval;
|
||||
}
|
||||
|
||||
#if (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD)
|
||||
bool button_hold(void)
|
||||
{
|
||||
return (GPIOA_INPUT_VAL & 0x20)?false:true;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
|
||||
bool button_hold(void)
|
||||
{
|
||||
|
@ -1357,18 +947,6 @@ int button_status(void)
|
|||
return lastbtn;
|
||||
}
|
||||
|
||||
#ifdef HAVE_WHEEL_POSITION
|
||||
int wheel_status(void)
|
||||
{
|
||||
return wheel_position;
|
||||
}
|
||||
|
||||
void wheel_send_events(bool send)
|
||||
{
|
||||
send_events = send;
|
||||
}
|
||||
#endif
|
||||
|
||||
void button_clear_queue(void)
|
||||
{
|
||||
queue_clear(&button_queue);
|
||||
|
|
|
@ -84,8 +84,6 @@ void power_init(void)
|
|||
pcf50606_init();
|
||||
#endif
|
||||
#endif
|
||||
#elif CONFIG_CPU == PP5020 || CONFIG_CPU == PP5002
|
||||
pcf50605_init();
|
||||
#else
|
||||
#ifdef HAVE_POWEROFF_ON_PB5
|
||||
PBCR2 &= ~0x0c00; /* GPIO for PB5 */
|
||||
|
@ -123,12 +121,6 @@ bool charger_inserted(void)
|
|||
return (adc_read(ADC_CHARGE_REGULATOR) < 0x1FF);
|
||||
#elif defined(TOSHIBA_GIGABEAT_F)
|
||||
return false;
|
||||
#elif defined(IPOD_VIDEO)
|
||||
return (GPIOL_INPUT_VAL & 0x08)?false:true;
|
||||
#elif defined(IPOD_ARCH)
|
||||
/* This needs filling in for other ipods. */
|
||||
return false;
|
||||
#else
|
||||
/* Player */
|
||||
return (PADR & 1) == 0;
|
||||
#endif
|
||||
|
@ -166,8 +158,6 @@ bool charging_state(void) {
|
|||
return charger_inserted();
|
||||
#elif defined IRIVER_H300_SERIES
|
||||
return (GPIO_READ & 0x00800000)?true:false;
|
||||
#elif defined IPOD_VIDEO
|
||||
return (GPIOB_INPUT_VAL & 0x01)?false:true;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
@ -201,8 +191,6 @@ void ide_power_enable(bool on)
|
|||
or_l(0x80000000, &GPIO_OUT);
|
||||
#elif defined(IAUDIO_X5)
|
||||
/* X5 TODO */
|
||||
#elif (CONFIG_CPU == PP5002) || (CONFIG_CPU == PP5020)
|
||||
/* We do nothing on the iPod */
|
||||
#elif defined(GMINI_ARCH)
|
||||
if(on)
|
||||
P1 |= 0x08;
|
||||
|
@ -259,9 +247,6 @@ bool ide_powered(void)
|
|||
return (GPIO_OUT & 0x80000000)?false:true;
|
||||
#elif defined(IAUDIO_X5)
|
||||
return false; /* X5 TODO */
|
||||
#elif (CONFIG_CPU == PP5002) || (CONFIG_CPU == PP5020)
|
||||
/* pretend we are always powered - we don't turn it off on the ipod */
|
||||
return true;
|
||||
#elif defined(GMINI_ARCH)
|
||||
return (P1 & 0x08?true:false);
|
||||
#elif defined(TOSHIBA_GIGABEAT_F)
|
||||
|
@ -296,11 +281,6 @@ void power_off(void)
|
|||
#if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES)
|
||||
and_l(~0x00080000, &GPIO1_OUT);
|
||||
asm("halt");
|
||||
#elif (CONFIG_CPU == PP5002) || (CONFIG_CPU == PP5020)
|
||||
#ifndef BOOTLOADER
|
||||
/* We don't turn off the ipod, we put it in a deep sleep */
|
||||
pcf50605_standby_mode();
|
||||
#endif
|
||||
#elif CONFIG_CPU == PNX0101
|
||||
GPIO1_CLR = 1 << 16;
|
||||
GPIO2_SET = 1;
|
||||
|
|
|
@ -24,12 +24,6 @@
|
|||
#ifdef TARGET_TREE
|
||||
#include "adc-target.h"
|
||||
|
||||
#elif defined(IPOD_ARCH)
|
||||
#define NUM_ADC_CHANNELS 1
|
||||
|
||||
#define ADC_BATTERY 0
|
||||
#define ADC_UNREG_POWER ADC_BATTERY
|
||||
|
||||
#elif defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES)
|
||||
#define NUM_ADC_CHANNELS 4
|
||||
|
||||
|
@ -106,8 +100,7 @@
|
|||
unsigned short adc_read(int channel);
|
||||
void adc_init(void);
|
||||
|
||||
#if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES)\
|
||||
|| defined(IPOD_ARCH)
|
||||
#if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES)
|
||||
/* Force a scan now */
|
||||
unsigned short adc_scan(int channel);
|
||||
#endif
|
||||
|
|
|
@ -26,9 +26,7 @@
|
|||
(CONFIG_KEYPAD == IRIVER_H300_PAD)
|
||||
#define HAS_BUTTON_HOLD
|
||||
#define HAS_REMOTE_BUTTON_HOLD
|
||||
#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
|
||||
(CONFIG_KEYPAD == IPOD_3G_PAD) || \
|
||||
(CONFIG_KEYPAD == IRIVER_IFP7XX_PAD)
|
||||
#elif (CONFIG_KEYPAD == IRIVER_IFP7XX_PAD)
|
||||
#define HAS_BUTTON_HOLD
|
||||
#endif
|
||||
extern struct event_queue button_queue;
|
||||
|
@ -222,30 +220,6 @@ void wheel_send_events(bool send);
|
|||
|
||||
#define BUTTON_REMOTE 0
|
||||
|
||||
#elif ((CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD))
|
||||
|
||||
/* iPod specific button codes */
|
||||
|
||||
#define BUTTON_SELECT 0x00000001
|
||||
#define BUTTON_MENU 0x00000002
|
||||
|
||||
#define BUTTON_LEFT 0x00000004
|
||||
#define BUTTON_RIGHT 0x00000008
|
||||
#define BUTTON_SCROLL_FWD 0x00000010
|
||||
#define BUTTON_SCROLL_BACK 0x00000020
|
||||
|
||||
#define BUTTON_PLAY 0x00000040
|
||||
|
||||
#define BUTTON_MAIN (BUTTON_SELECT|BUTTON_MENU\
|
||||
|BUTTON_LEFT|BUTTON_RIGHT|BUTTON_SCROLL_FWD\
|
||||
|BUTTON_SCROLL_BACK|BUTTON_PLAY)
|
||||
|
||||
#define BUTTON_REMOTE 0
|
||||
|
||||
/* This is for later
|
||||
#define BUTTON_SCROLL_TOUCH 0x00000200
|
||||
*/
|
||||
|
||||
#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
|
||||
|
||||
/* iriver IFP7XX specific button codes */
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* This config file is for the Apple iPod 3g
|
||||
*/
|
||||
#define IPOD_ARCH 1
|
||||
#define TARGET_TREE /* this target is using the target tree system */
|
||||
|
||||
/* For Rolo and boot loader */
|
||||
#define MODEL_NUMBER 7
|
||||
|
@ -101,6 +101,10 @@
|
|||
|
||||
#define USB_NONE
|
||||
|
||||
/* LCD contrast */
|
||||
#define MIN_CONTRAST_SETTING 5
|
||||
#define MAX_CONTRAST_SETTING 63
|
||||
#define DEFAULT_CONTRAST_SETTING 40 /* Match boot contrast */
|
||||
|
||||
/* Virtual LED (icon) */
|
||||
#define CONFIG_LED LED_VIRTUAL
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* This config file is for the Apple iPod Color/Photo
|
||||
*/
|
||||
#define IPOD_ARCH 1
|
||||
#define TARGET_TREE /* this target is using the target tree system */
|
||||
|
||||
/* For Rolo and boot loader */
|
||||
#define MODEL_NUMBER 8
|
||||
|
@ -100,6 +100,11 @@
|
|||
|
||||
#define USB_IPODSTYLE
|
||||
|
||||
/* LCD contrast */
|
||||
#define MIN_CONTRAST_SETTING 5
|
||||
#define MAX_CONTRAST_SETTING 63
|
||||
#define DEFAULT_CONTRAST_SETTING 40 /* Match boot contrast */
|
||||
|
||||
/* define this if the unit can be powered or charged via USB */
|
||||
#define HAVE_USB_POWER
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* This config file is for the Apple iPod Color/Photo
|
||||
*/
|
||||
#define IPOD_ARCH 1
|
||||
#define TARGET_TREE /* this target is using the target tree system */
|
||||
|
||||
/* For Rolo and boot loader */
|
||||
#define MODEL_NUMBER 3
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* This config file is for the Apple iPod Mini (1st Gen)
|
||||
*/
|
||||
#define IPOD_ARCH 1
|
||||
#define TARGET_TREE /* this target is using the target tree system */
|
||||
|
||||
/* For Rolo and boot loader */
|
||||
#define MODEL_NUMBER 9 /* TODO: change to 9 */
|
||||
|
@ -100,6 +100,11 @@
|
|||
|
||||
#define USB_IPODSTYLE
|
||||
|
||||
/* LCD contrast */
|
||||
#define MIN_CONTRAST_SETTING 5
|
||||
#define MAX_CONTRAST_SETTING 63
|
||||
#define DEFAULT_CONTRAST_SETTING 40 /* Match boot contrast */
|
||||
|
||||
/* define this if the unit can be powered or charged via USB */
|
||||
#define HAVE_USB_POWER
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* This config file is for the Apple iPod Mini 2nd Gen
|
||||
*/
|
||||
#define IPOD_ARCH 1
|
||||
#define TARGET_TREE /* this target is using the target tree system */
|
||||
|
||||
/* For Rolo and boot loader */
|
||||
#define MODEL_NUMBER 11
|
||||
|
@ -103,6 +103,11 @@
|
|||
|
||||
#define USB_IPODSTYLE
|
||||
|
||||
/* LCD contrast */
|
||||
#define MIN_CONTRAST_SETTING 5
|
||||
#define MAX_CONTRAST_SETTING 63
|
||||
#define DEFAULT_CONTRAST_SETTING 40 /* Match boot contrast */
|
||||
|
||||
/* define this if the unit can be powered or charged via USB */
|
||||
#define HAVE_USB_POWER
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* This config file is for the Apple iPod Nano
|
||||
*/
|
||||
#define IPOD_ARCH 1
|
||||
#define TARGET_TREE /* this target is using the target tree system */
|
||||
|
||||
/* For Rolo and boot loader */
|
||||
#define MODEL_NUMBER 4
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* This config file is for the Apple iPod Video
|
||||
*/
|
||||
#define IPOD_ARCH 1
|
||||
#define TARGET_TREE /* this target is using the target tree system */
|
||||
|
||||
/* For Rolo and boot loader */
|
||||
#define MODEL_NUMBER 5
|
||||
|
|
|
@ -20,7 +20,6 @@
|
|||
#ifndef PCF50605_H
|
||||
#define PCF50605_H
|
||||
|
||||
#ifdef IPOD_ARCH
|
||||
int pcf50605_read(int address);
|
||||
int pcf50605_read_multiple(int address, unsigned char* buf, int count);
|
||||
int pcf50605_write(int address, unsigned char val);
|
||||
|
@ -29,6 +28,5 @@ int pcf50605_a2d_read(int channel);
|
|||
bool pcf50605_charger_inserted(void);
|
||||
void pcf50605_standby_mode(void);
|
||||
void pcf50605_init(void);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1077,15 +1077,6 @@ void shutdown_hw(void)
|
|||
#endif
|
||||
backlight_off();
|
||||
#endif /* IAUDIO_X5 */
|
||||
#if defined(IPOD_ARCH) && defined(HAVE_LCD_COLOR)
|
||||
/* Clear the screen and backdrop to
|
||||
remove ghosting effect on shutdown */
|
||||
lcd_set_backdrop(NULL);
|
||||
lcd_set_background(LCD_WHITE);
|
||||
lcd_clear_display();
|
||||
lcd_update();
|
||||
sleep(HZ/16);
|
||||
#endif
|
||||
#ifndef IAUDIO_X5
|
||||
lcd_set_contrast(0);
|
||||
#endif
|
||||
|
|
42
firmware/target/arm/ipod/3g/backlight-3g.c
Normal file
42
firmware/target/arm/ipod/3g/backlight-3g.c
Normal file
|
@ -0,0 +1,42 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2002 by Linus Nielsen Feltzing
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
#include "config.h"
|
||||
#include <stdlib.h>
|
||||
#include "cpu.h"
|
||||
#include "kernel.h"
|
||||
#include "thread.h"
|
||||
#include "i2c.h"
|
||||
#include "debug.h"
|
||||
#include "rtc.h"
|
||||
#include "usb.h"
|
||||
#include "power.h"
|
||||
#include "system.h"
|
||||
#include "button.h"
|
||||
#include "timer.h"
|
||||
#include "backlight.h"
|
||||
|
||||
inline void __backlight_on(void)
|
||||
{
|
||||
outl(inl(0xc0001000) | 0x02, 0xc0001000);
|
||||
}
|
||||
|
||||
inline void __backlight_off(void)
|
||||
{
|
||||
outl(inl(0xc0001000) & ~0x02, 0xc0001000);
|
||||
}
|
189
firmware/target/arm/ipod/3g/button-3g.c
Normal file
189
firmware/target/arm/ipod/3g/button-3g.c
Normal file
|
@ -0,0 +1,189 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2002 by Daniel Stenberg
|
||||
*
|
||||
* iPod driver based on code from the ipodlinux project - http://ipodlinux.org
|
||||
* Adapted for Rockbox in December 2005
|
||||
* Original file: linux/arch/armnommu/mach-ipod/keyboard.c
|
||||
* Copyright (c) 2003-2005 Bernard Leach (leachbj@bouncycastle.org)
|
||||
*
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/*
|
||||
* Rockbox button functions
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "config.h"
|
||||
#include "cpu.h"
|
||||
#include "system.h"
|
||||
#include "button.h"
|
||||
#include "kernel.h"
|
||||
#include "backlight.h"
|
||||
#include "adc.h"
|
||||
#include "serial.h"
|
||||
#include "power.h"
|
||||
#include "system.h"
|
||||
#include "powermgmt.h"
|
||||
|
||||
/* iPod 3G and mini 1G, mini 2G uses iPod 4G code */
|
||||
void handle_scroll_wheel(int new_scroll, int was_hold, int reverse)
|
||||
{
|
||||
int wheel_keycode = BUTTON_NONE;
|
||||
static int prev_scroll = -1;
|
||||
static int direction = 0;
|
||||
static int count = 0;
|
||||
static int scroll_state[4][4] = {
|
||||
{0, 1, -1, 0},
|
||||
{-1, 0, 0, 1},
|
||||
{1, 0, 0, -1},
|
||||
{0, -1, 1, 0}
|
||||
};
|
||||
|
||||
if ( prev_scroll == -1 ) {
|
||||
prev_scroll = new_scroll;
|
||||
}
|
||||
else if (direction != scroll_state[prev_scroll][new_scroll]) {
|
||||
direction = scroll_state[prev_scroll][new_scroll];
|
||||
count = 0;
|
||||
}
|
||||
else if (!was_hold) {
|
||||
backlight_on();
|
||||
if (++count == 6) { /* reduce sensitivity */
|
||||
count = 0;
|
||||
switch (direction) {
|
||||
case 1:
|
||||
if (reverse) {
|
||||
/* 'r' keypress */
|
||||
wheel_keycode = BUTTON_SCROLL_FWD;
|
||||
}
|
||||
else {
|
||||
/* 'l' keypress */
|
||||
wheel_keycode = BUTTON_SCROLL_BACK;
|
||||
}
|
||||
break;
|
||||
case -1:
|
||||
if (reverse) {
|
||||
/* 'l' keypress */
|
||||
wheel_keycode = BUTTON_SCROLL_BACK;
|
||||
}
|
||||
else {
|
||||
/* 'r' keypress */
|
||||
wheel_keycode = BUTTON_SCROLL_FWD;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
/* only happens if we get out of sync */
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (wheel_keycode != BUTTON_NONE && queue_empty(&button_queue))
|
||||
queue_post(&button_queue, wheel_keycode, NULL);
|
||||
prev_scroll = new_scroll;
|
||||
}
|
||||
|
||||
static int ipod_3g_button_read(void)
|
||||
{
|
||||
unsigned char source, state;
|
||||
static int was_hold = 0;
|
||||
int btn = BUTTON_NONE;
|
||||
/*
|
||||
* we need some delay for g3, cause hold generates several interrupts,
|
||||
* some of them delayed
|
||||
*/
|
||||
udelay(250);
|
||||
|
||||
/* get source of interupts */
|
||||
source = GPIOA_INT_STAT;
|
||||
|
||||
|
||||
/* get current keypad status */
|
||||
state = GPIOA_INPUT_VAL;
|
||||
GPIOA_INT_LEV = ~state;
|
||||
|
||||
if (was_hold && source == 0x40 && state == 0xbf) {
|
||||
/* ack any active interrupts */
|
||||
GPIOA_INT_CLR = source;
|
||||
return BUTTON_NONE;
|
||||
}
|
||||
was_hold = 0;
|
||||
|
||||
|
||||
if ((state & 0x20) == 0) {
|
||||
/* 3g hold switch is active low */
|
||||
was_hold = 1;
|
||||
/* hold switch on 3g causes all outputs to go low */
|
||||
/* we shouldn't interpret these as key presses */
|
||||
GPIOA_INT_CLR = source;
|
||||
return BUTTON_NONE;
|
||||
}
|
||||
if ((state & 0x1) == 0) {
|
||||
btn |= BUTTON_RIGHT;
|
||||
}
|
||||
if ((state & 0x2) == 0) {
|
||||
btn |= BUTTON_SELECT;
|
||||
}
|
||||
if ((state & 0x4) == 0) {
|
||||
btn |= BUTTON_PLAY;
|
||||
}
|
||||
if ((state & 0x8) == 0) {
|
||||
btn |= BUTTON_LEFT;
|
||||
}
|
||||
if ((state & 0x10) == 0) {
|
||||
btn |= BUTTON_MENU;
|
||||
}
|
||||
|
||||
if (source & 0xc0) {
|
||||
handle_scroll_wheel((state & 0xc0) >> 6, was_hold, 0);
|
||||
}
|
||||
|
||||
/* ack any active interrupts */
|
||||
GPIOA_INT_CLR = source;
|
||||
|
||||
return btn;
|
||||
}
|
||||
|
||||
void button_init_device(void)
|
||||
{
|
||||
GPIOA_INT_LEV = ~GPIOA_INPUT_VAL;
|
||||
GPIOA_INT_CLR = GPIOA_INT_STAT;
|
||||
GPIOA_INT_EN = 0xff;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get button pressed from hardware
|
||||
*/
|
||||
int button_read_device(void)
|
||||
{
|
||||
static bool hold_button = false;
|
||||
bool hold_button_old;
|
||||
|
||||
/* normal buttons */
|
||||
hold_button_old = hold_button;
|
||||
hold_button = button_hold();
|
||||
|
||||
if (hold_button != hold_button_old)
|
||||
backlight_hold_changed(hold_button);
|
||||
|
||||
return ipod_3g_button_read();
|
||||
}
|
||||
|
||||
bool button_hold(void)
|
||||
{
|
||||
return (GPIOA_INPUT_VAL & 0x20)?false:true;
|
||||
}
|
80
firmware/target/arm/ipod/adc-ipod.c
Normal file
80
firmware/target/arm/ipod/adc-ipod.c
Normal file
|
@ -0,0 +1,80 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2002 by Linus Nielsen Feltzing
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
#include "config.h"
|
||||
#include "cpu.h"
|
||||
#include "system.h"
|
||||
#include "kernel.h"
|
||||
#include "thread.h"
|
||||
#include "string.h"
|
||||
#include "adc.h"
|
||||
#include "pcf50605.h"
|
||||
|
||||
struct adc_struct {
|
||||
long timeout;
|
||||
void (*conversion)(unsigned short *data);
|
||||
short channelnum;
|
||||
unsigned short data;
|
||||
};
|
||||
|
||||
static struct adc_struct adcdata[NUM_ADC_CHANNELS] IDATA_ATTR;
|
||||
|
||||
static unsigned short _adc_read(struct adc_struct *adc)
|
||||
{
|
||||
if (adc->timeout < current_tick) {
|
||||
unsigned char data[2];
|
||||
unsigned short value;
|
||||
/* 5x per 2 seconds */
|
||||
adc->timeout = current_tick + (HZ * 2 / 5);
|
||||
|
||||
/* ADCC1, 10 bit, start */
|
||||
pcf50605_write(0x2f, (adc->channelnum << 1) | 0x1);
|
||||
pcf50605_read_multiple(0x30, data, 2); /* ADCS1, ADCS2 */
|
||||
value = data[0];
|
||||
value <<= 2;
|
||||
value |= data[1] & 0x3;
|
||||
|
||||
if (adc->conversion) {
|
||||
adc->conversion(&value);
|
||||
}
|
||||
adc->data = value;
|
||||
return value;
|
||||
} else {
|
||||
return adc->data;
|
||||
}
|
||||
}
|
||||
|
||||
/* Force an ADC scan _now_ */
|
||||
unsigned short adc_scan(int channel) {
|
||||
struct adc_struct *adc = &adcdata[channel];
|
||||
adc->timeout = 0;
|
||||
return _adc_read(adc);
|
||||
}
|
||||
|
||||
/* Retrieve the ADC value, only does a scan periodically */
|
||||
unsigned short adc_read(int channel) {
|
||||
return _adc_read(&adcdata[channel]);
|
||||
}
|
||||
|
||||
void adc_init(void)
|
||||
{
|
||||
struct adc_struct *adc_battery = &adcdata[ADC_BATTERY];
|
||||
adc_battery->channelnum = 0x2; /* ADCVIN1, resistive divider */
|
||||
adc_battery->timeout = 0;
|
||||
_adc_read(adc_battery);
|
||||
}
|
29
firmware/target/arm/ipod/adc-target.h
Normal file
29
firmware/target/arm/ipod/adc-target.h
Normal file
|
@ -0,0 +1,29 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2002 by Linus Nielsen Feltzing
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
#ifndef _ADC_TARGET_H_
|
||||
#define _ADC_TARGET_H_
|
||||
|
||||
#define NUM_ADC_CHANNELS 1
|
||||
|
||||
#define ADC_BATTERY 0
|
||||
#define ADC_UNREG_POWER ADC_BATTERY
|
||||
|
||||
/* Force a scan now */
|
||||
unsigned short adc_scan(int channel);
|
||||
#endif
|
48
firmware/target/arm/ipod/backlight-4g_color.c
Normal file
48
firmware/target/arm/ipod/backlight-4g_color.c
Normal file
|
@ -0,0 +1,48 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2002 by Linus Nielsen Feltzing
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
#include "config.h"
|
||||
#include <stdlib.h>
|
||||
#include "cpu.h"
|
||||
#include "kernel.h"
|
||||
#include "thread.h"
|
||||
#include "i2c.h"
|
||||
#include "debug.h"
|
||||
#include "rtc.h"
|
||||
#include "usb.h"
|
||||
#include "power.h"
|
||||
#include "system.h"
|
||||
#include "button.h"
|
||||
#include "timer.h"
|
||||
#include "backlight.h"
|
||||
|
||||
inline void __backlight_on(void)
|
||||
{
|
||||
/* brightness full */
|
||||
outl(0x80000000 | (0xff << 16), 0x7000a010);
|
||||
|
||||
/* set port b bit 3 on */
|
||||
outl(((0x100 | 1) << 3), 0x6000d824);
|
||||
}
|
||||
|
||||
inline void __backlight_off(void)
|
||||
{
|
||||
/* fades backlight off on 4g */
|
||||
outl(inl(0x70000084) & ~0x2000000, 0x70000084);
|
||||
outl(0x80000000, 0x7000a010);
|
||||
}
|
44
firmware/target/arm/ipod/backlight-mini1g_mini2g.c
Normal file
44
firmware/target/arm/ipod/backlight-mini1g_mini2g.c
Normal file
|
@ -0,0 +1,44 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2002 by Linus Nielsen Feltzing
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
#include "config.h"
|
||||
#include <stdlib.h>
|
||||
#include "cpu.h"
|
||||
#include "kernel.h"
|
||||
#include "thread.h"
|
||||
#include "i2c.h"
|
||||
#include "debug.h"
|
||||
#include "rtc.h"
|
||||
#include "usb.h"
|
||||
#include "power.h"
|
||||
#include "system.h"
|
||||
#include "button.h"
|
||||
#include "timer.h"
|
||||
#include "backlight.h"
|
||||
|
||||
inline void __backlight_on(void)
|
||||
{
|
||||
/* set port B03 on */
|
||||
outl(((0x100 | 1) << 3), 0x6000d824);
|
||||
}
|
||||
|
||||
inline void __backlight_off(void)
|
||||
{
|
||||
/* set port B03 off */
|
||||
outl(((0x100 | 0) << 3), 0x6000d824);
|
||||
}
|
50
firmware/target/arm/ipod/backlight-nano_video.c
Normal file
50
firmware/target/arm/ipod/backlight-nano_video.c
Normal file
|
@ -0,0 +1,50 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2002 by Linus Nielsen Feltzing
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
#include "config.h"
|
||||
#include <stdlib.h>
|
||||
#include "cpu.h"
|
||||
#include "kernel.h"
|
||||
#include "thread.h"
|
||||
#include "i2c.h"
|
||||
#include "debug.h"
|
||||
#include "rtc.h"
|
||||
#include "usb.h"
|
||||
#include "power.h"
|
||||
#include "system.h"
|
||||
#include "button.h"
|
||||
#include "timer.h"
|
||||
#include "backlight.h"
|
||||
|
||||
inline void __backlight_on(void)
|
||||
{
|
||||
/* set port B03 on */
|
||||
outl(((0x100 | 1) << 3), 0x6000d824);
|
||||
|
||||
/* set port L07 on */
|
||||
outl(((0x100 | 1) << 7), 0x6000d12c);
|
||||
}
|
||||
|
||||
inline void __backlight_off(void)
|
||||
{
|
||||
/* set port B03 off */
|
||||
outl(((0x100 | 0) << 3), 0x6000d824);
|
||||
|
||||
/* set port L07 off */
|
||||
outl(((0x100 | 0) << 7), 0x6000d12c);
|
||||
}
|
25
firmware/target/arm/ipod/backlight-target.h
Normal file
25
firmware/target/arm/ipod/backlight-target.h
Normal file
|
@ -0,0 +1,25 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2006 by Barry Wardell
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
#ifndef BACKLIGHT_TARGET_H
|
||||
#define BACKLIGHT_TARGET_H
|
||||
|
||||
void __backlight_on(void);
|
||||
void __backlight_off(void);
|
||||
|
||||
#endif
|
237
firmware/target/arm/ipod/button-clickwheel.c
Normal file
237
firmware/target/arm/ipod/button-clickwheel.c
Normal file
|
@ -0,0 +1,237 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2002 by Daniel Stenberg
|
||||
*
|
||||
* iPod driver based on code from the ipodlinux project - http://ipodlinux.org
|
||||
* Adapted for Rockbox in December 2005
|
||||
* Original file: linux/arch/armnommu/mach-ipod/keyboard.c
|
||||
* Copyright (c) 2003-2005 Bernard Leach (leachbj@bouncycastle.org)
|
||||
*
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/*
|
||||
* Rockbox button functions
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "config.h"
|
||||
#include "cpu.h"
|
||||
#include "system.h"
|
||||
#include "button.h"
|
||||
#include "kernel.h"
|
||||
#include "backlight.h"
|
||||
#include "adc.h"
|
||||
#include "serial.h"
|
||||
#include "power.h"
|
||||
#include "system.h"
|
||||
#include "powermgmt.h"
|
||||
|
||||
/* Variable to use for setting button status in interrupt handler */
|
||||
int int_btn = BUTTON_NONE;
|
||||
#ifdef HAVE_WHEEL_POSITION
|
||||
static int wheel_position = -1;
|
||||
static bool send_events = true;
|
||||
#endif
|
||||
|
||||
static void opto_i2c_init(void)
|
||||
{
|
||||
int i, curr_value;
|
||||
|
||||
/* wait for value to settle */
|
||||
i = 1000;
|
||||
curr_value = (inl(0x7000c104) << 16) >> 24;
|
||||
while (i > 0)
|
||||
{
|
||||
int new_value = (inl(0x7000c104) << 16) >> 24;
|
||||
|
||||
if (new_value != curr_value) {
|
||||
i = 10000;
|
||||
curr_value = new_value;
|
||||
}
|
||||
else {
|
||||
i--;
|
||||
}
|
||||
}
|
||||
|
||||
GPIOB_OUTPUT_VAL |= 0x10;
|
||||
DEV_EN |= 0x10000;
|
||||
DEV_RS |= 0x10000;
|
||||
udelay(5);
|
||||
DEV_RS &= ~0x10000; /* finish reset */
|
||||
|
||||
outl(0xffffffff, 0x7000c120);
|
||||
outl(0xffffffff, 0x7000c124);
|
||||
outl(0xc00a1f00, 0x7000c100);
|
||||
outl(0x1000000, 0x7000c104);
|
||||
}
|
||||
|
||||
static inline int ipod_4g_button_read(void)
|
||||
{
|
||||
int whl = -1;
|
||||
|
||||
/* The ipodlinux source had a udelay(250) here, but testing has shown that
|
||||
it is not needed - tested on Nano, Color/Photo and Video. */
|
||||
/* udelay(250);*/
|
||||
|
||||
int btn = BUTTON_NONE;
|
||||
unsigned reg = 0x7000c104;
|
||||
if ((inl(0x7000c104) & 0x4000000) != 0) {
|
||||
unsigned status = inl(0x7000c140);
|
||||
|
||||
reg = reg + 0x3C; /* 0x7000c140 */
|
||||
outl(0x0, 0x7000c140); /* clear interrupt status? */
|
||||
|
||||
if ((status & 0x800000ff) == 0x8000001a) {
|
||||
static int old_wheel_value IDATA_ATTR = -1;
|
||||
static int wheel_repeat = 0;
|
||||
|
||||
if (status & 0x100)
|
||||
btn |= BUTTON_SELECT;
|
||||
if (status & 0x200)
|
||||
btn |= BUTTON_RIGHT;
|
||||
if (status & 0x400)
|
||||
btn |= BUTTON_LEFT;
|
||||
if (status & 0x800)
|
||||
btn |= BUTTON_PLAY;
|
||||
if (status & 0x1000)
|
||||
btn |= BUTTON_MENU;
|
||||
if (status & 0x40000000) {
|
||||
/* NB: highest wheel = 0x5F, clockwise increases */
|
||||
int new_wheel_value = (status << 9) >> 25;
|
||||
whl = new_wheel_value;
|
||||
backlight_on();
|
||||
/* The queue should have no other events when scrolling */
|
||||
if (queue_empty(&button_queue) && old_wheel_value >= 0) {
|
||||
|
||||
/* This is for later = BUTTON_SCROLL_TOUCH;*/
|
||||
int wheel_delta = new_wheel_value - old_wheel_value;
|
||||
unsigned long data;
|
||||
int wheel_keycode;
|
||||
|
||||
if (wheel_delta < -48)
|
||||
wheel_delta += 96; /* Forward wrapping case */
|
||||
else if (wheel_delta > 48)
|
||||
wheel_delta -= 96; /* Backward wrapping case */
|
||||
|
||||
if (wheel_delta > 4) {
|
||||
wheel_keycode = BUTTON_SCROLL_FWD;
|
||||
} else if (wheel_delta < -4) {
|
||||
wheel_keycode = BUTTON_SCROLL_BACK;
|
||||
} else goto wheel_end;
|
||||
|
||||
#ifdef HAVE_WHEEL_POSITION
|
||||
if (send_events)
|
||||
#endif
|
||||
{
|
||||
data = (wheel_delta << 16) | new_wheel_value;
|
||||
queue_post(&button_queue, wheel_keycode | wheel_repeat,
|
||||
(void *)data);
|
||||
}
|
||||
|
||||
if (!wheel_repeat) wheel_repeat = BUTTON_REPEAT;
|
||||
}
|
||||
|
||||
old_wheel_value = new_wheel_value;
|
||||
} else if (old_wheel_value >= 0) {
|
||||
/* scroll wheel up */
|
||||
old_wheel_value = -1;
|
||||
wheel_repeat = 0;
|
||||
}
|
||||
|
||||
} else if (status == 0xffffffff) {
|
||||
opto_i2c_init();
|
||||
}
|
||||
}
|
||||
|
||||
wheel_end:
|
||||
|
||||
if ((inl(reg) & 0x8000000) != 0) {
|
||||
outl(0xffffffff, 0x7000c120);
|
||||
outl(0xffffffff, 0x7000c124);
|
||||
}
|
||||
/* Save the new absolute wheel position */
|
||||
wheel_position = whl;
|
||||
return btn;
|
||||
}
|
||||
|
||||
#ifdef HAVE_WHEEL_POSITION
|
||||
int wheel_status(void)
|
||||
{
|
||||
return wheel_position;
|
||||
}
|
||||
|
||||
void wheel_send_events(bool send)
|
||||
{
|
||||
send_events = send;
|
||||
}
|
||||
#endif
|
||||
|
||||
void ipod_4g_button_int(void)
|
||||
{
|
||||
CPU_HI_INT_CLR = I2C_MASK;
|
||||
/* The following delay was 250 in the ipodlinux source, but 50 seems to
|
||||
work fine - tested on Nano, Color/Photo and Video. */
|
||||
udelay(50);
|
||||
outl(0x0, 0x7000c140);
|
||||
int_btn = ipod_4g_button_read();
|
||||
outl(inl(0x7000c104) | 0xC000000, 0x7000c104);
|
||||
outl(0x400a1f00, 0x7000c100);
|
||||
|
||||
GPIOB_OUTPUT_VAL |= 0x10;
|
||||
CPU_INT_EN = 0x40000000;
|
||||
CPU_HI_INT_EN = I2C_MASK;
|
||||
}
|
||||
|
||||
void button_init_device(void)
|
||||
{
|
||||
opto_i2c_init();
|
||||
/* hold button - enable as input */
|
||||
GPIOA_ENABLE |= 0x20;
|
||||
GPIOA_OUTPUT_EN &= ~0x20;
|
||||
/* hold button - set interrupt levels */
|
||||
GPIOA_INT_LEV = ~(GPIOA_INPUT_VAL & 0x20);
|
||||
GPIOA_INT_CLR = GPIOA_INT_STAT & 0x20;
|
||||
/* enable interrupts */
|
||||
GPIOA_INT_EN = 0x20;
|
||||
/* unmask interrupt */
|
||||
CPU_INT_EN = 0x40000000;
|
||||
CPU_HI_INT_EN = I2C_MASK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get button pressed from hardware
|
||||
*/
|
||||
int button_read_device(void)
|
||||
{
|
||||
static bool hold_button = false;
|
||||
bool hold_button_old;
|
||||
|
||||
/* normal buttons */
|
||||
hold_button_old = hold_button;
|
||||
hold_button = button_hold();
|
||||
|
||||
if (hold_button != hold_button_old)
|
||||
backlight_hold_changed(hold_button);
|
||||
|
||||
/* The int_btn variable is set in the button interrupt handler */
|
||||
return int_btn;
|
||||
}
|
||||
|
||||
bool button_hold(void)
|
||||
{
|
||||
return (GPIOA_INPUT_VAL & 0x20)?false:true;
|
||||
}
|
217
firmware/target/arm/ipod/button-mini1g.c
Normal file
217
firmware/target/arm/ipod/button-mini1g.c
Normal file
|
@ -0,0 +1,217 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2002 by Daniel Stenberg
|
||||
*
|
||||
* iPod driver based on code from the ipodlinux project - http://ipodlinux.org
|
||||
* Adapted for Rockbox in December 2005
|
||||
* Original file: linux/arch/armnommu/mach-ipod/keyboard.c
|
||||
* Copyright (c) 2003-2005 Bernard Leach (leachbj@bouncycastle.org)
|
||||
*
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/*
|
||||
* Rockbox button functions
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "config.h"
|
||||
#include "cpu.h"
|
||||
#include "system.h"
|
||||
#include "button.h"
|
||||
#include "kernel.h"
|
||||
#include "backlight.h"
|
||||
#include "adc.h"
|
||||
#include "serial.h"
|
||||
#include "power.h"
|
||||
#include "system.h"
|
||||
#include "powermgmt.h"
|
||||
|
||||
/* Variable to use for setting button status in interrupt handler */
|
||||
int int_btn = BUTTON_NONE;
|
||||
#ifdef HAVE_WHEEL_POSITION
|
||||
static int wheel_position = -1;
|
||||
static bool send_events = true;
|
||||
#endif
|
||||
|
||||
/* iPod 3G and mini 1G, mini 2G uses iPod 4G code */
|
||||
void handle_scroll_wheel(int new_scroll, int was_hold, int reverse)
|
||||
{
|
||||
int wheel_keycode = BUTTON_NONE;
|
||||
static int prev_scroll = -1;
|
||||
static int direction = 0;
|
||||
static int count = 0;
|
||||
static int scroll_state[4][4] = {
|
||||
{0, 1, -1, 0},
|
||||
{-1, 0, 0, 1},
|
||||
{1, 0, 0, -1},
|
||||
{0, -1, 1, 0}
|
||||
};
|
||||
|
||||
if ( prev_scroll == -1 ) {
|
||||
prev_scroll = new_scroll;
|
||||
}
|
||||
else if (direction != scroll_state[prev_scroll][new_scroll]) {
|
||||
direction = scroll_state[prev_scroll][new_scroll];
|
||||
count = 0;
|
||||
}
|
||||
else if (!was_hold) {
|
||||
backlight_on();
|
||||
if (++count == 6) { /* reduce sensitivity */
|
||||
count = 0;
|
||||
switch (direction) {
|
||||
case 1:
|
||||
if (reverse) {
|
||||
/* 'r' keypress */
|
||||
wheel_keycode = BUTTON_SCROLL_FWD;
|
||||
}
|
||||
else {
|
||||
/* 'l' keypress */
|
||||
wheel_keycode = BUTTON_SCROLL_BACK;
|
||||
}
|
||||
break;
|
||||
case -1:
|
||||
if (reverse) {
|
||||
/* 'l' keypress */
|
||||
wheel_keycode = BUTTON_SCROLL_BACK;
|
||||
}
|
||||
else {
|
||||
/* 'r' keypress */
|
||||
wheel_keycode = BUTTON_SCROLL_FWD;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
/* only happens if we get out of sync */
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (wheel_keycode != BUTTON_NONE && queue_empty(&button_queue))
|
||||
queue_post(&button_queue, wheel_keycode, NULL);
|
||||
prev_scroll = new_scroll;
|
||||
}
|
||||
|
||||
/* mini 1 only, mini 2G uses iPod 4G code */
|
||||
static int ipod_mini_button_read(void)
|
||||
{
|
||||
unsigned char source, wheel_source, state, wheel_state;
|
||||
static bool was_hold = false;
|
||||
int btn = BUTTON_NONE;
|
||||
|
||||
/* The ipodlinux source had a udelay(250) here, but testing has shown that
|
||||
it is not needed - tested on mini 1g. */
|
||||
/* udelay(250);*/
|
||||
|
||||
/* get source(s) of interupt */
|
||||
source = GPIOA_INT_STAT & 0x3f;
|
||||
wheel_source = GPIOB_INT_STAT & 0x30;
|
||||
|
||||
if (source == 0 && wheel_source == 0) {
|
||||
return BUTTON_NONE; /* not for us */
|
||||
}
|
||||
|
||||
/* get current keypad & wheel status */
|
||||
state = GPIOA_INPUT_VAL & 0x3f;
|
||||
wheel_state = GPIOB_INPUT_VAL & 0x30;
|
||||
|
||||
/* toggle interrupt level */
|
||||
GPIOA_INT_LEV = ~state;
|
||||
GPIOB_INT_LEV = ~wheel_state;
|
||||
|
||||
/* hold switch causes all outputs to go low */
|
||||
/* we shouldn't interpret these as key presses */
|
||||
if ((state & 0x20)) {
|
||||
if (!(state & 0x1))
|
||||
btn |= BUTTON_SELECT;
|
||||
if (!(state & 0x2))
|
||||
btn |= BUTTON_MENU;
|
||||
if (!(state & 0x4))
|
||||
btn |= BUTTON_PLAY;
|
||||
if (!(state & 0x8))
|
||||
btn |= BUTTON_RIGHT;
|
||||
if (!(state & 0x10))
|
||||
btn |= BUTTON_LEFT;
|
||||
|
||||
if (wheel_source & 0x30) {
|
||||
handle_scroll_wheel((wheel_state & 0x30) >> 4, was_hold, 1);
|
||||
}
|
||||
}
|
||||
|
||||
was_hold = button_hold();
|
||||
|
||||
/* ack any active interrupts */
|
||||
if (source)
|
||||
GPIOA_INT_CLR = source;
|
||||
if (wheel_source)
|
||||
GPIOB_INT_CLR = wheel_source;
|
||||
|
||||
return btn;
|
||||
}
|
||||
|
||||
void ipod_mini_button_int(void)
|
||||
{
|
||||
CPU_HI_INT_CLR = GPIO_MASK;
|
||||
int_btn = ipod_mini_button_read();
|
||||
//CPU_INT_EN = 0x40000000;
|
||||
CPU_HI_INT_EN = GPIO_MASK;
|
||||
}
|
||||
|
||||
void button_init_device(void)
|
||||
{
|
||||
/* iPod Mini G1 */
|
||||
/* buttons - enable as input */
|
||||
GPIOA_ENABLE |= 0x3f;
|
||||
GPIOA_OUTPUT_EN &= ~0x3f;
|
||||
/* scroll wheel- enable as input */
|
||||
GPIOB_ENABLE |= 0x30; /* port b 4,5 */
|
||||
GPIOB_OUTPUT_EN &= ~0x30; /* port b 4,5 */
|
||||
/* buttons - set interrupt levels */
|
||||
GPIOA_INT_LEV = ~(GPIOA_INPUT_VAL & 0x3f);
|
||||
GPIOA_INT_CLR = GPIOA_INT_STAT & 0x3f;
|
||||
/* scroll wheel - set interrupt levels */
|
||||
GPIOB_INT_LEV = ~(GPIOB_INPUT_VAL & 0x30);
|
||||
GPIOB_INT_CLR = GPIOB_INT_STAT & 0x30;
|
||||
/* enable interrupts */
|
||||
GPIOA_INT_EN = 0x3f;
|
||||
GPIOB_INT_EN = 0x30;
|
||||
/* unmask interrupt */
|
||||
CPU_INT_EN = 0x40000000;
|
||||
CPU_HI_INT_EN = GPIO_MASK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get button pressed from hardware
|
||||
*/
|
||||
int button_read_device(void)
|
||||
{
|
||||
static bool hold_button = false;
|
||||
bool hold_button_old;
|
||||
|
||||
/* normal buttons */
|
||||
hold_button_old = hold_button;
|
||||
hold_button = button_hold();
|
||||
|
||||
if (hold_button != hold_button_old)
|
||||
backlight_hold_changed(hold_button);
|
||||
|
||||
/* The int_btn variable is set in the button interrupt handler */
|
||||
return int_btn;
|
||||
}
|
||||
|
||||
bool button_hold(void)
|
||||
{
|
||||
return (GPIOA_INPUT_VAL & 0x20)?false:true;
|
||||
}
|
61
firmware/target/arm/ipod/button-target.h
Normal file
61
firmware/target/arm/ipod/button-target.h
Normal file
|
@ -0,0 +1,61 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2006 by Barry Wardell
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
#ifndef _BUTTON_TARGET_H_
|
||||
#define _BUTTON_TARGET_H_
|
||||
|
||||
#include <stdbool.h>
|
||||
#include "config.h"
|
||||
|
||||
#define HAS_BUTTON_HOLD
|
||||
|
||||
bool button_hold(void);
|
||||
void button_init_device(void);
|
||||
int button_read_device(void);
|
||||
|
||||
void handle_scroll_wheel(int new_scroll, int was_hold, int reverse);
|
||||
void ipod_mini_button_int(void);
|
||||
void ipod_4g_button_int(void);
|
||||
|
||||
/* iPod specific button codes */
|
||||
|
||||
#define BUTTON_SELECT 0x00000001
|
||||
#define BUTTON_MENU 0x00000002
|
||||
|
||||
#define BUTTON_LEFT 0x00000004
|
||||
#define BUTTON_RIGHT 0x00000008
|
||||
#define BUTTON_SCROLL_FWD 0x00000010
|
||||
#define BUTTON_SCROLL_BACK 0x00000020
|
||||
|
||||
#define BUTTON_PLAY 0x00000040
|
||||
|
||||
#define BUTTON_MAIN (BUTTON_SELECT|BUTTON_MENU\
|
||||
|BUTTON_LEFT|BUTTON_RIGHT|BUTTON_SCROLL_FWD\
|
||||
|BUTTON_SCROLL_BACK|BUTTON_PLAY)
|
||||
|
||||
#define BUTTON_REMOTE 0
|
||||
|
||||
/* This is for later
|
||||
#define BUTTON_SCROLL_TOUCH 0x00000200
|
||||
*/
|
||||
|
||||
|
||||
#define POWEROFF_BUTTON BUTTON_PLAY
|
||||
#define POWEROFF_COUNT 40
|
||||
|
||||
#endif /* _BUTTON_TARGET_H_ */
|
81
firmware/target/arm/ipod/power-ipod.c
Normal file
81
firmware/target/arm/ipod/power-ipod.c
Normal file
|
@ -0,0 +1,81 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2002 by Linus Nielsen Feltzing
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
#include "config.h"
|
||||
#include "cpu.h"
|
||||
#include <stdbool.h>
|
||||
#include "adc.h"
|
||||
#include "kernel.h"
|
||||
#include "system.h"
|
||||
#include "power.h"
|
||||
#include "hwcompat.h"
|
||||
#include "logf.h"
|
||||
#include "pcf50605.h"
|
||||
#include "usb.h"
|
||||
#include "lcd.h"
|
||||
|
||||
void power_init(void)
|
||||
{
|
||||
pcf50605_init();
|
||||
}
|
||||
|
||||
bool charger_inserted(void)
|
||||
{
|
||||
#ifdef IPOD_VIDEO
|
||||
return (GPIOL_INPUT_VAL & 0x08)?false:true;
|
||||
#else
|
||||
/* This needs filling in for other ipods. */
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Returns true if the unit is charging the batteries. */
|
||||
bool charging_state(void) {
|
||||
return (GPIOB_INPUT_VAL & 0x01)?false:true;
|
||||
}
|
||||
|
||||
|
||||
void ide_power_enable(bool on)
|
||||
{
|
||||
/* We do nothing on the iPod */
|
||||
(void)on;
|
||||
}
|
||||
|
||||
bool ide_powered(void)
|
||||
{
|
||||
/* pretend we are always powered - we don't turn it off on the ipod */
|
||||
return true;
|
||||
}
|
||||
|
||||
void power_off(void)
|
||||
{
|
||||
#if defined(HAVE_LCD_COLOR)
|
||||
/* Clear the screen and backdrop to
|
||||
remove ghosting effect on shutdown */
|
||||
lcd_set_backdrop(NULL);
|
||||
lcd_set_background(LCD_WHITE);
|
||||
lcd_clear_display();
|
||||
lcd_update();
|
||||
sleep(HZ/16);
|
||||
#endif
|
||||
|
||||
#ifndef BOOTLOADER
|
||||
/* We don't turn off the ipod, we put it in a deep sleep */
|
||||
pcf50605_standby_mode();
|
||||
#endif
|
||||
}
|
114
firmware/target/arm/ipod/usb-ipod.c
Normal file
114
firmware/target/arm/ipod/usb-ipod.c
Normal file
|
@ -0,0 +1,114 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2002 by Linus Nielsen Feltzing
|
||||
*
|
||||
* iPod driver based on code from the ipodlinux project - http://ipodlinux.org
|
||||
* Adapted for Rockbox in January 2006
|
||||
* Original file: podzilla/usb.c
|
||||
* Copyright (C) 2005 Adam Johnston
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
#include "config.h"
|
||||
#include "cpu.h"
|
||||
#include "kernel.h"
|
||||
#include "thread.h"
|
||||
#include "system.h"
|
||||
#include "debug.h"
|
||||
#include "ata.h"
|
||||
#include "fat.h"
|
||||
#include "disk.h"
|
||||
#include "panic.h"
|
||||
#include "lcd.h"
|
||||
#include "adc.h"
|
||||
#include "usb.h"
|
||||
#include "button.h"
|
||||
#include "sprintf.h"
|
||||
#include "string.h"
|
||||
#include "hwcompat.h"
|
||||
|
||||
void usb_init_device(void)
|
||||
{
|
||||
int r0;
|
||||
outl(inl(0x70000084) | 0x200, 0x70000084);
|
||||
|
||||
outl(inl(0x7000002C) | 0x3000000, 0x7000002C);
|
||||
outl(inl(0x6000600C) | 0x400000, 0x6000600C);
|
||||
|
||||
outl(inl(0x60006004) | 0x400000, 0x60006004); /* reset usb start */
|
||||
outl(inl(0x60006004) & ~0x400000, 0x60006004); /* reset usb end */
|
||||
|
||||
outl(inl(0x70000020) | 0x80000000, 0x70000020);
|
||||
while ((inl(0x70000028) & 0x80) == 0);
|
||||
|
||||
outl(inl(0xc5000184) | 0x100, 0xc5000184);
|
||||
while ((inl(0xc5000184) & 0x100) != 0);
|
||||
|
||||
outl(inl(0xc50001A4) | 0x5F000000, 0xc50001A4);
|
||||
if ((inl(0xc50001A4) & 0x100) == 0) {
|
||||
outl(inl(0xc50001A8) & ~0x3, 0xc50001A8);
|
||||
outl(inl(0xc50001A8) | 0x2, 0xc50001A8);
|
||||
outl(inl(0x70000028) | 0x4000, 0x70000028);
|
||||
outl(inl(0x70000028) | 0x2, 0x70000028);
|
||||
} else {
|
||||
outl(inl(0xc50001A8) | 0x3, 0xc50001A8);
|
||||
outl(inl(0x70000028) &~0x4000, 0x70000028);
|
||||
outl(inl(0x70000028) | 0x2, 0x70000028);
|
||||
}
|
||||
outl(inl(0xc5000140) | 0x2, 0xc5000140);
|
||||
while((inl(0xc5000140) & 0x2) != 0);
|
||||
r0 = inl(0xc5000184);
|
||||
|
||||
/* Note from IPL source (referring to next 5 lines of code:
|
||||
THIS NEEDS TO BE CHANGED ONCE THERE IS KERNEL USB */
|
||||
outl(inl(0x70000020) | 0x80000000, 0x70000020);
|
||||
outl(inl(0x6000600C) | 0x400000, 0x6000600C);
|
||||
while ((inl(0x70000028) & 0x80) == 0);
|
||||
outl(inl(0x70000028) | 0x2, 0x70000028);
|
||||
|
||||
udelay(0x186A0);
|
||||
}
|
||||
|
||||
void usb_enable(bool on)
|
||||
{
|
||||
/* For the ipod, we can only do one thing with USB mode - reboot
|
||||
into Apple's flash-based disk-mode. This does not return. */
|
||||
if (on)
|
||||
{
|
||||
/* The following code is copied from ipodlinux */
|
||||
#if defined(IPOD_COLOR) || defined(IPOD_3G) || \
|
||||
defined(IPOD_4G) || defined(IPOD_MINI)
|
||||
unsigned char* storage_ptr = (unsigned char *)0x40017F00;
|
||||
#elif defined(IPOD_NANO) || defined(IPOD_VIDEO) || defined(IPOD_MINI2G)
|
||||
unsigned char* storage_ptr = (unsigned char *)0x4001FF00;
|
||||
#endif
|
||||
memcpy(storage_ptr, "diskmode\0\0hotstuff\0\0\1", 21);
|
||||
DEV_RS |= 4; /* Reboot */
|
||||
}
|
||||
}
|
||||
|
||||
bool usb_detect(void)
|
||||
{
|
||||
bool current_status;
|
||||
|
||||
/* The following check is in the ipodlinux source, with the
|
||||
comment "USB2D_IDENT is bad" if USB2D_IDENT != 0x22FA05 */
|
||||
if (USB2D_IDENT != 0x22FA05) {
|
||||
return false;
|
||||
}
|
||||
current_status = (USB_STATUS & 0x800)?true:false;
|
||||
|
||||
return current_status;
|
||||
}
|
24
firmware/target/arm/ipod/usb-target.h
Normal file
24
firmware/target/arm/ipod/usb-target.h
Normal file
|
@ -0,0 +1,24 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2006 by Barry Wardelll
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
#ifndef USB_TARGET_H
|
||||
#define USB_TARGET_H
|
||||
|
||||
bool usb_init_device(void);
|
||||
|
||||
#endif
|
|
@ -175,23 +175,6 @@ void usb_enable(bool on)
|
|||
or_l(0x00000008,&GPIO1_OUT);
|
||||
#endif
|
||||
}
|
||||
|
||||
#elif defined(USB_IPODSTYLE)
|
||||
/* For the ipod, we can only do one thing with USB mode - reboot
|
||||
into Apple's flash-based disk-mode. This does not return. */
|
||||
if (on)
|
||||
{
|
||||
/* The following code is copied from ipodlinux */
|
||||
#if defined(IPOD_COLOR) || defined(IPOD_3G) || \
|
||||
defined(IPOD_4G) || defined(IPOD_MINI)
|
||||
unsigned char* storage_ptr = (unsigned char *)0x40017F00;
|
||||
#elif defined(IPOD_NANO) || defined(IPOD_VIDEO) || defined(IPOD_MINI2G)
|
||||
unsigned char* storage_ptr = (unsigned char *)0x4001FF00;
|
||||
#endif
|
||||
memcpy(storage_ptr, "diskmode\0\0hotstuff\0\0\1", 21);
|
||||
DEV_RS |= 4; /* Reboot */
|
||||
}
|
||||
|
||||
#elif defined(USB_ISP1582)
|
||||
/* TODO: Implement USB_ISP1582 */
|
||||
(void) on;
|
||||
|
@ -496,7 +479,9 @@ void usb_init(void)
|
|||
usb_monitor_enabled = false;
|
||||
countdown = -1;
|
||||
|
||||
#ifdef USB_IRIVERSTYLE
|
||||
#ifdef TARGET_TREE
|
||||
usb_init_device();
|
||||
#elif defined USB_IRIVERSTYLE
|
||||
or_l(0x00000080, &GPIO1_FUNCTION); /* GPIO39 is the USB detect input */
|
||||
|
||||
#ifdef IRIVER_H300_SERIES
|
||||
|
@ -514,45 +499,6 @@ void usb_init(void)
|
|||
or_l(0x01000040, &GPIO_FUNCTION);
|
||||
#endif
|
||||
|
||||
#elif defined(USB_IPODSTYLE)
|
||||
int r0;
|
||||
outl(inl(0x70000084) | 0x200, 0x70000084);
|
||||
|
||||
outl(inl(0x7000002C) | 0x3000000, 0x7000002C);
|
||||
outl(inl(0x6000600C) | 0x400000, 0x6000600C);
|
||||
|
||||
outl(inl(0x60006004) | 0x400000, 0x60006004); /* reset usb start */
|
||||
outl(inl(0x60006004) & ~0x400000, 0x60006004); /* reset usb end */
|
||||
|
||||
outl(inl(0x70000020) | 0x80000000, 0x70000020);
|
||||
while ((inl(0x70000028) & 0x80) == 0);
|
||||
|
||||
outl(inl(0xc5000184) | 0x100, 0xc5000184);
|
||||
while ((inl(0xc5000184) & 0x100) != 0);
|
||||
|
||||
outl(inl(0xc50001A4) | 0x5F000000, 0xc50001A4);
|
||||
if ((inl(0xc50001A4) & 0x100) == 0) {
|
||||
outl(inl(0xc50001A8) & ~0x3, 0xc50001A8);
|
||||
outl(inl(0xc50001A8) | 0x2, 0xc50001A8);
|
||||
outl(inl(0x70000028) | 0x4000, 0x70000028);
|
||||
outl(inl(0x70000028) | 0x2, 0x70000028);
|
||||
} else {
|
||||
outl(inl(0xc50001A8) | 0x3, 0xc50001A8);
|
||||
outl(inl(0x70000028) &~0x4000, 0x70000028);
|
||||
outl(inl(0x70000028) | 0x2, 0x70000028);
|
||||
}
|
||||
outl(inl(0xc5000140) | 0x2, 0xc5000140);
|
||||
while((inl(0xc5000140) & 0x2) != 0);
|
||||
r0 = inl(0xc5000184);
|
||||
|
||||
/* Note from IPL source (referring to next 5 lines of code:
|
||||
THIS NEEDS TO BE CHANGED ONCE THERE IS KERNEL USB */
|
||||
outl(inl(0x70000020) | 0x80000000, 0x70000020);
|
||||
outl(inl(0x6000600C) | 0x400000, 0x6000600C);
|
||||
while ((inl(0x70000028) & 0x80) == 0);
|
||||
outl(inl(0x70000028) | 0x2, 0x70000028);
|
||||
|
||||
udelay(0x186A0);
|
||||
#endif
|
||||
|
||||
usb_enable(false);
|
||||
|
|
28
tools/configure
vendored
28
tools/configure
vendored
|
@ -777,6 +777,10 @@ EOF
|
|||
# toolset is the tools within the tools directory that we build for
|
||||
# this particular target.
|
||||
toolset=$ipodbitmaptools
|
||||
# architecture, manufacturer and model for the target-tree build
|
||||
t_cpu="arm"
|
||||
t_manufacturer="ipod"
|
||||
t_model="color"
|
||||
;;
|
||||
|
||||
21|ipodnano)
|
||||
|
@ -799,6 +803,10 @@ EOF
|
|||
# toolset is the tools within the tools directory that we build for
|
||||
# this particular target.
|
||||
toolset=$ipodbitmaptools
|
||||
# architecture, manufacturer and model for the target-tree build
|
||||
t_cpu="arm"
|
||||
t_manufacturer="ipod"
|
||||
t_model="nano"
|
||||
;;
|
||||
|
||||
22|ipodvideo)
|
||||
|
@ -821,6 +829,10 @@ EOF
|
|||
# toolset is the tools within the tools directory that we build for
|
||||
# this particular target.
|
||||
toolset=$ipodbitmaptools
|
||||
# architecture, manufacturer and model for the target-tree build
|
||||
t_cpu="arm"
|
||||
t_manufacturer="ipod"
|
||||
t_model="video"
|
||||
;;
|
||||
|
||||
23|ipod3g)
|
||||
|
@ -843,6 +855,10 @@ EOF
|
|||
# toolset is the tools within the tools directory that we build for
|
||||
# this particular target.
|
||||
toolset=$ipodbitmaptools
|
||||
# architecture, manufacturer and model for the target-tree build
|
||||
t_cpu="arm"
|
||||
t_manufacturer="ipod"
|
||||
t_model="3g"
|
||||
;;
|
||||
|
||||
24|ipod4g)
|
||||
|
@ -865,6 +881,10 @@ EOF
|
|||
# toolset is the tools within the tools directory that we build for
|
||||
# this particular target.
|
||||
toolset=$ipodbitmaptools
|
||||
# architecture, manufacturer and model for the target-tree build
|
||||
t_cpu="arm"
|
||||
t_manufacturer="ipod"
|
||||
t_model="4g"
|
||||
;;
|
||||
|
||||
25|ipodmini)
|
||||
|
@ -887,6 +907,10 @@ EOF
|
|||
# toolset is the tools within the tools directory that we build for
|
||||
# this particular target.
|
||||
toolset=$ipodbitmaptools
|
||||
# architecture, manufacturer and model for the target-tree build
|
||||
t_cpu="arm"
|
||||
t_manufacturer="ipod"
|
||||
t_model="mini"
|
||||
;;
|
||||
|
||||
13|ifp7xx)
|
||||
|
@ -953,6 +977,10 @@ EOF
|
|||
# toolset is the tools within the tools directory that we build for
|
||||
# this particular target.
|
||||
toolset=$ipodbitmaptools
|
||||
# architecture, manufacturer and model for the target-tree build
|
||||
t_cpu="arm"
|
||||
t_manufacturer="ipod"
|
||||
t_model="mini2g"
|
||||
;;
|
||||
|
||||
14|h10)
|
||||
|
|
Loading…
Reference in a new issue