mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-12-09 13:15:18 -05:00
Use bus reset detection for all ARC OTG devices. Remove conflict from LV24020LP driver with some GPIO-by-number macros for PP502x. Start monitoring for USB stack once all core threads and queues are created otherwise queues will likely be registered after USB acks. Putting PP502x system_reboot in IRAM (unmapped, uncached) memory seems to help it work more consistently. Hopefully I got all the PP USB connect handlers in the right spot in irq_handler. If device seems unresponsive to cable, check there first.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19819 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
81df953da5
commit
da76a34694
16 changed files with 345 additions and 188 deletions
|
|
@ -1247,7 +1247,6 @@ void microsd_int(void)
|
|||
GPIO_SET_BITWISE(GPIOL_INT_EN, 0x08);
|
||||
#endif
|
||||
timeout_register(&sd1_oneshot, sd1_oneshot_callback, (3*HZ/10), 0);
|
||||
|
||||
}
|
||||
#endif /* HAVE_HOTSWAP */
|
||||
|
||||
|
|
|
|||
|
|
@ -53,14 +53,19 @@ static void enable_transceiver(bool enable)
|
|||
}
|
||||
}
|
||||
|
||||
/* Read the immediate state of the cable from the PMIC */
|
||||
bool usb_plugged(void)
|
||||
{
|
||||
return mc13783_read(MC13783_INTERRUPT_SENSE0) & MC13783_USB4V4S;
|
||||
}
|
||||
|
||||
void usb_connect_event(void)
|
||||
{
|
||||
uint32_t status = mc13783_read(MC13783_INTERRUPT_SENSE0);
|
||||
usb_status = (status & MC13783_USB4V4S) ?
|
||||
USB_INSERTED : USB_EXTRACTED;
|
||||
int status = usb_plugged() ? USB_INSERTED : USB_EXTRACTED;
|
||||
usb_status = status;
|
||||
/* Notify power that USB charging is potentially available */
|
||||
charger_usb_detect_event(usb_status);
|
||||
usb_status_event(usb_status);
|
||||
charger_usb_detect_event(status);
|
||||
usb_status_event((status == USB_INSERTED) ? USB_POWERED : USB_UNPOWERED);
|
||||
}
|
||||
|
||||
int usb_detect(void)
|
||||
|
|
@ -68,12 +73,6 @@ int usb_detect(void)
|
|||
return usb_status;
|
||||
}
|
||||
|
||||
/* Read the immediate state of the cable from the PMIC */
|
||||
bool usb_plugged(void)
|
||||
{
|
||||
return mc13783_read(MC13783_INTERRUPT_SENSE0) & MC13783_USB4V4S;
|
||||
}
|
||||
|
||||
void usb_init_device(void)
|
||||
{
|
||||
/* Do one-time inits */
|
||||
|
|
@ -107,7 +106,7 @@ void usb_enable(bool on)
|
|||
|
||||
void usb_attach(void)
|
||||
{
|
||||
usb_enable(true);
|
||||
usb_drv_attach();
|
||||
}
|
||||
|
||||
static void __attribute__((interrupt("IRQ"))) USB_OTG_HANDLER(void)
|
||||
|
|
@ -122,3 +121,9 @@ void usb_drv_int_enable(bool enable)
|
|||
else
|
||||
avic_disable_int(USB_OTG);
|
||||
}
|
||||
|
||||
/* Called during the bus reset interrupt when in detect mode */
|
||||
void usb_drv_usb_detect_event(void)
|
||||
{
|
||||
usb_status_event(USB_INSERTED);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,9 +25,6 @@
|
|||
#define USB_DRIVER_CLOSE
|
||||
#endif
|
||||
|
||||
/* Connect by events, not by tick polling */
|
||||
#define USB_STATUS_BY_EVENT
|
||||
|
||||
void usb_connect_event(void);
|
||||
void usb_init_device(void);
|
||||
int usb_detect(void);
|
||||
|
|
|
|||
|
|
@ -134,10 +134,6 @@ static inline void charger_plugged(void)
|
|||
{
|
||||
batt_threshold = BATT_FULL_VOLTAGE; /* Start with topped value. */
|
||||
battery_voltage_sync();
|
||||
#if defined(USB_STATUS_BY_EVENT) && defined(USB_DETECT_BY_DRV)
|
||||
/* Charger pin detect is USB pin detect */
|
||||
usb_connect_event(true);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void charger_control(void)
|
||||
|
|
@ -192,10 +188,6 @@ static inline void charger_unplugged(void)
|
|||
disable_charger();
|
||||
if (charge_state >= CHARGE_STATE_ERROR)
|
||||
charge_state = DISCHARGING; /* Reset error */
|
||||
#if defined(USB_STATUS_BY_EVENT) && defined(USB_DETECT_BY_DRV)
|
||||
/* Charger pin detect is USB pin detect */
|
||||
usb_connect_event(false);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Main charging algorithm - called from powermgmt.c */
|
||||
|
|
|
|||
|
|
@ -25,9 +25,8 @@
|
|||
#include "as3514.h"
|
||||
#include "ata-sd-target.h"
|
||||
#include "button-target.h"
|
||||
#ifdef HAVE_USBSTACK
|
||||
#include "usb-target.h"
|
||||
#include "usb_drv.h"
|
||||
#endif
|
||||
|
||||
#ifndef BOOTLOADER
|
||||
extern void TIMER1(void);
|
||||
|
|
@ -42,51 +41,108 @@ void __attribute__((interrupt("IRQ"))) irq_handler(void)
|
|||
{
|
||||
if (CPU_INT_STAT & TIMER1_MASK) {
|
||||
TIMER1();
|
||||
} else if (CPU_INT_STAT & TIMER2_MASK)
|
||||
}
|
||||
else if (CPU_INT_STAT & TIMER2_MASK) {
|
||||
TIMER2();
|
||||
#if defined(IPOD_MINI) /* Mini 1st gen only, mini 2nd gen uses iPod 4G code */
|
||||
else if (CPU_HI_INT_STAT & GPIO0_MASK)
|
||||
ipod_mini_button_int();
|
||||
#elif CONFIG_KEYPAD == IPOD_4G_PAD /* except Mini 1st gen, handled above */
|
||||
else if (CPU_HI_INT_STAT & I2C_MASK)
|
||||
ipod_4g_button_int();
|
||||
#elif defined(SANSA_E200)
|
||||
#ifdef HAVE_HOTSWAP
|
||||
else if (CPU_HI_INT_STAT & GPIO0_MASK) {
|
||||
if (GPIOA_INT_STAT & 0x80)
|
||||
microsd_int();
|
||||
}
|
||||
#ifdef HAVE_USBSTACK
|
||||
/* Rather high priority - place near front */
|
||||
else if (CPU_INT_STAT & USB_MASK) {
|
||||
usb_drv_int();
|
||||
}
|
||||
#endif
|
||||
#if defined(IPOD_MINI) /* Mini 1st gen only, mini 2nd gen uses iPod 4G code */
|
||||
else if (CPU_HI_INT_STAT & GPIO0_MASK) {
|
||||
if ((GPIOA_INT_STAT & 0x3f) || (GPIOB_INT_STAT & 0x30))
|
||||
ipod_mini_button_int();
|
||||
if (GPIOC_INT_STAT & 0x02)
|
||||
firewire_insert_int();
|
||||
if (GPIOD_INT_STAT & 0x08)
|
||||
usb_insert_int();
|
||||
}
|
||||
/* end IPOD_MINI */
|
||||
#elif CONFIG_KEYPAD == IPOD_4G_PAD /* except Mini 1st gen, handled above */
|
||||
else if (CPU_HI_INT_STAT & I2C_MASK) {
|
||||
ipod_4g_button_int();
|
||||
}
|
||||
#if defined(IPOD_COLOR) || defined(IPOD_MINI2G) || defined(IPOD_4G)
|
||||
else if (CPU_HI_INT_STAT & GPIO0_MASK) {
|
||||
if (GPIOC_INT_STAT & 0x02)
|
||||
firewire_insert_int();
|
||||
if (GPIOD_INT_STAT & 0x08)
|
||||
usb_insert_int();
|
||||
}
|
||||
#elif defined(IPOD_NANO) || defined(IPOD_VIDEO)
|
||||
else if (CPU_HI_INT_STAT & GPIO2_MASK) {
|
||||
if (GPIOL_INT_STAT & 0x10)
|
||||
usb_insert_int();
|
||||
}
|
||||
#endif
|
||||
/* end CONFIG_KEYPAD == IPOD_4G_PAD */
|
||||
#elif defined(IRIVER_H10) || defined(IRIVER_H10_5GB)
|
||||
else if (CPU_HI_INT_STAT & GPIO2_MASK) {
|
||||
if (GPIOL_INT_STAT & 0x04)
|
||||
usb_insert_int();
|
||||
}
|
||||
/* end IRIVER_H10 || IRIVER_H10_5GB */
|
||||
#elif defined(SANSA_E200)
|
||||
else if (CPU_HI_INT_STAT & GPIO0_MASK) {
|
||||
#ifdef HAVE_HOTSWAP
|
||||
if (GPIOA_INT_STAT & 0x80)
|
||||
microsd_int();
|
||||
#endif
|
||||
if (GPIOB_INT_STAT & 0x10)
|
||||
usb_insert_int();
|
||||
}
|
||||
else if (CPU_HI_INT_STAT & GPIO1_MASK) {
|
||||
if (GPIOF_INT_STAT & 0xff)
|
||||
button_int();
|
||||
if (GPIOH_INT_STAT & 0xc0)
|
||||
clickwheel_int();
|
||||
}
|
||||
#elif defined(SANSA_C200) && defined(HAVE_HOTSWAP)
|
||||
/* end SANSA_E200 */
|
||||
#elif defined(SANSA_C200)
|
||||
else if (CPU_HI_INT_STAT & GPIO1_MASK) {
|
||||
if (GPIOH_INT_STAT & 0x02)
|
||||
usb_insert_int();
|
||||
}
|
||||
#ifdef HAVE_HOTSWAP
|
||||
else if (CPU_HI_INT_STAT & GPIO2_MASK) {
|
||||
if (GPIOL_INT_STAT & 0x08)
|
||||
microsd_int();
|
||||
}
|
||||
#endif
|
||||
/* end SANSA_C200 */
|
||||
#elif defined(MROBE_100)
|
||||
else if (CPU_HI_INT_STAT & GPIO0_MASK) {
|
||||
if (GPIOD_INT_STAT & 0x2)
|
||||
if (GPIOD_INT_STAT & 0x02)
|
||||
button_int();
|
||||
}
|
||||
}
|
||||
else if (CPU_HI_INT_STAT & GPIO2_MASK) {
|
||||
if (GPIOL_INT_STAT & 0x04)
|
||||
usb_insert_int();
|
||||
}
|
||||
/* end MROBE_100 */
|
||||
#elif defined(PHILIPS_SA9200)
|
||||
else if (CPU_HI_INT_STAT & GPIO1_MASK) {
|
||||
if (GPIOF_INT_STAT & 0x80)
|
||||
usb_insert_int();
|
||||
}
|
||||
/* end PHILIPS_SA9200 */
|
||||
#elif defined(PHILIPS_HDD1630)
|
||||
else if (CPU_HI_INT_STAT & GPIO0_MASK) {
|
||||
if (GPIOA_INT_STAT & 0x20)
|
||||
button_int();
|
||||
}
|
||||
}
|
||||
else if (CPU_HI_INT_STAT & GPIO1_MASK) {
|
||||
if (GPIOE_INT_STAT & 0x04)
|
||||
usb_insert_int();
|
||||
}
|
||||
/* end PHILIPS_HDD1630 */
|
||||
#endif
|
||||
#ifdef IPOD_ACCESSORY_PROTOCOL
|
||||
else if (CPU_HI_INT_STAT & SER0_MASK) {
|
||||
SERIAL0();
|
||||
}
|
||||
#endif
|
||||
#ifdef HAVE_USBSTACK
|
||||
else if (CPU_INT_STAT & USB_MASK) {
|
||||
usb_drv_int();
|
||||
else if (CPU_HI_INT_STAT & SER0_MASK) {
|
||||
SERIAL0();
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
|
|
@ -437,8 +493,12 @@ void system_init(void)
|
|||
#endif /* BOOTLOADER */
|
||||
}
|
||||
|
||||
void system_reboot(void)
|
||||
void ICODE_ATTR system_reboot(void)
|
||||
{
|
||||
disable_interrupt(IRQ_FIQ_STATUS);
|
||||
CPU_INT_DIS = -1;
|
||||
COP_INT_DIS = -1;
|
||||
|
||||
/* Reboot */
|
||||
#if defined(SANSA_E200) || defined(SANSA_C200) || defined(PHILIPS_SA9200)
|
||||
CACHE_CTL &= ~CACHE_CTL_VECT_REMAP;
|
||||
|
|
|
|||
|
|
@ -419,13 +419,11 @@ static void _usb_drv_init(bool attach)
|
|||
REG_ENDPOINTLISTADDR = (unsigned int)qh_array;
|
||||
REG_DEVICEADDR = 0;
|
||||
|
||||
#ifdef USB_DETECT_BY_DRV
|
||||
if (!attach) {
|
||||
/* enable RESET interrupt */
|
||||
REG_USBINTR = USBINTR_RESET_EN;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
/* enable USB interrupts */
|
||||
REG_USBINTR =
|
||||
|
|
@ -449,23 +447,17 @@ static void _usb_drv_init(bool attach)
|
|||
(void)attach;
|
||||
}
|
||||
|
||||
/** With USB_DETECT_BY_DRV, attach is distinct from init, otherwise eqivalent. **/
|
||||
|
||||
/* USB_DETECT_BY_DRV - enable bus reset detection only
|
||||
* else fully enable driver */
|
||||
void usb_drv_init(void)
|
||||
{
|
||||
_usb_drv_init(false);
|
||||
}
|
||||
|
||||
#ifdef USB_DETECT_BY_DRV
|
||||
/* fully enable driver */
|
||||
void usb_drv_attach(void)
|
||||
{
|
||||
sleep(HZ/10);
|
||||
_usb_drv_init(true);
|
||||
}
|
||||
#endif /* USB_DETECT_BY_DRV */
|
||||
|
||||
void usb_drv_exit(void)
|
||||
{
|
||||
|
|
@ -513,7 +505,7 @@ void usb_drv_int(void)
|
|||
/* reset interrupt */
|
||||
if (status & USBSTS_RESET) {
|
||||
REG_USBSTS = USBSTS_RESET;
|
||||
#ifdef USB_DETECT_BY_DRV
|
||||
|
||||
if (UNLIKELY(usbintr == USBINTR_RESET_EN)) {
|
||||
/* USB detected - detach and inform */
|
||||
usb_drv_stop();
|
||||
|
|
@ -523,7 +515,6 @@ void usb_drv_int(void)
|
|||
usb_drv_usb_detect_event();
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
bus_reset();
|
||||
usb_core_bus_reset(); /* tell mom */
|
||||
|
|
|
|||
|
|
@ -33,6 +33,60 @@
|
|||
#include "usb_core.h"
|
||||
#include "usb_drv.h"
|
||||
|
||||
#if defined(IPOD_4G) || defined(IPOD_COLOR) \
|
||||
|| defined(IPOD_MINI) || defined(IPOD_MINI2G)
|
||||
/* GPIO D bit 3 is usb detect */
|
||||
#define USB_GPIO GPIOD
|
||||
#define USB_GPIO_MASK 0x08
|
||||
#define USB_GPIO_VAL 0x08
|
||||
|
||||
#elif defined(IPOD_NANO) || defined(IPOD_VIDEO)
|
||||
/* GPIO L bit 4 is usb detect */
|
||||
#define USB_GPIO GPIOL
|
||||
#define USB_GPIO_MASK 0x10
|
||||
#define USB_GPIO_VAL 0x10
|
||||
|
||||
#elif defined(SANSA_C200)
|
||||
/* GPIO H bit 1 is usb/charger detect */
|
||||
#define USB_GPIO GPIOH
|
||||
#define USB_GPIO_MASK 0x02
|
||||
#define USB_GPIO_VAL 0x02
|
||||
|
||||
#elif defined(SANSA_E200)
|
||||
/* GPIO B bit 4 is usb/charger detect */
|
||||
#define USB_GPIO GPIOB
|
||||
#define USB_GPIO_MASK 0x10
|
||||
#define USB_GPIO_VAL 0x10
|
||||
|
||||
#elif defined(IRIVER_H10) || defined(IRIVER_H10_5GB) || defined(MROBE_100)
|
||||
/* GPIO L bit 2 is usb detect */
|
||||
#define USB_GPIO GPIOL
|
||||
#define USB_GPIO_MASK 0x04
|
||||
#define USB_GPIO_VAL 0x04
|
||||
|
||||
#elif defined(PHILIPS_SA9200)
|
||||
/* GPIO F bit 7 (low) is usb detect */
|
||||
#define USB_GPIO GPIOF
|
||||
#define USB_GPIO_MASK 0x80
|
||||
#define USB_GPIO_VAL 0x00
|
||||
|
||||
#elif defined(PHILIPS_HDD1630)
|
||||
/* GPIO E bit 2 is usb detect */
|
||||
#define USB_GPIO GPIOE
|
||||
#define USB_GPIO_MASK 0x04
|
||||
#define USB_GPIO_VAL 0x04
|
||||
#else
|
||||
#error No USB GPIO config specified
|
||||
#endif
|
||||
|
||||
#define USB_GPIO_ENABLE GPIO_ENABLE(USB_GPIO)
|
||||
#define USB_GPIO_OUTPUT_EN GPIO_OUTPUT_EN(USB_GPIO)
|
||||
#define USB_GPIO_INPUT_VAL GPIO_INPUT_VAL(USB_GPIO)
|
||||
#define USB_GPIO_INT_EN GPIO_INT_EN(USB_GPIO)
|
||||
#define USB_GPIO_INT_LEV GPIO_INT_LEV(USB_GPIO)
|
||||
#define USB_GPIO_INT_CLR GPIO_INT_CLR(USB_GPIO)
|
||||
#define USB_GPIO_HI_INT_MASK GPIO_HI_INT_MASK(USB_GPIO)
|
||||
|
||||
void usb_init_device(void)
|
||||
{
|
||||
/* enable usb module */
|
||||
|
|
@ -52,7 +106,10 @@ void usb_init_device(void)
|
|||
while ((inl(0x70000028) & 0x80) == 0);
|
||||
outl(inl(0x70000028) | 0x2, 0x70000028);
|
||||
udelay(100000);
|
||||
|
||||
|
||||
/* Do one-time inits */
|
||||
usb_drv_startup();
|
||||
|
||||
/* disable USB-devices until USB is detected via GPIO */
|
||||
#ifndef BOOTLOADER
|
||||
/* Disabling USB0 in the bootloader makes the OF not load,
|
||||
|
|
@ -63,17 +120,38 @@ void usb_init_device(void)
|
|||
DEV_INIT2 &= ~INIT_USB;
|
||||
#endif
|
||||
|
||||
#if defined(IPOD_COLOR) || defined(IPOD_4G) \
|
||||
|| defined(IPOD_MINI) || defined(IPOD_MINI2G)
|
||||
/* GPIO C bit 1 is firewire detect */
|
||||
GPIOC_ENABLE |= 0x02;
|
||||
GPIOC_OUTPUT_EN &= ~0x02;
|
||||
#endif
|
||||
/* These set INV_LEV to the inserted level so it will fire if already
|
||||
* inserted at the time they are enabled. */
|
||||
#ifdef USB_STATUS_BY_EVENT
|
||||
GPIO_CLEAR_BITWISE(USB_GPIO_INT_EN, USB_GPIO_MASK);
|
||||
GPIO_CLEAR_BITWISE(USB_GPIO_OUTPUT_EN, USB_GPIO_MASK);
|
||||
GPIO_SET_BITWISE(USB_GPIO_ENABLE, USB_GPIO_MASK);
|
||||
GPIO_WRITE_BITWISE(USB_GPIO_INT_LEV, USB_GPIO_VAL, USB_GPIO_MASK);
|
||||
USB_GPIO_INT_CLR = USB_GPIO_MASK;
|
||||
GPIO_SET_BITWISE(USB_GPIO_INT_EN, USB_GPIO_MASK);
|
||||
CPU_HI_INT_EN = USB_GPIO_HI_INT_MASK;
|
||||
|
||||
#ifdef HAVE_USBSTACK
|
||||
/* Do one-time inits */
|
||||
usb_drv_startup();
|
||||
#ifdef USB_FIREWIRE_HANDLING
|
||||
/* GPIO C bit 1 is firewire detect */
|
||||
GPIO_CLEAR_BITWISE(GPIOC_INT_EN, 0x02);
|
||||
GPIO_CLEAR_BITWISE(GPIOC_OUTPUT_EN, 0x02);
|
||||
GPIO_SET_BITWISE(GPIOC_ENABLE, 0x02);
|
||||
GPIO_WRITE_BITWISE(GPIOC_INT_LEV, 0x00, 0x02);
|
||||
GPIOC_INT_CLR = 0x02;
|
||||
GPIO_SET_BITWISE(GPIOC_INT_EN, 0x02);
|
||||
CPU_HI_INT_EN = GPIO0_MASK;
|
||||
#endif
|
||||
CPU_INT_EN = HI_MASK;
|
||||
#else
|
||||
/* No interrupt - setup pin read only (BOOTLOADER) */
|
||||
GPIO_CLEAR_BITWISE(USB_GPIO_OUTPUT_EN, USB_GPIO_MASK);
|
||||
GPIO_SET_BITWISE(USB_GPIO_ENABLE, USB_GPIO_MASK);
|
||||
#ifdef USB_FIREWIRE_HANDLING
|
||||
/* GPIO C bit 1 is firewire detect */
|
||||
GPIO_CLEAR_BITWISE(GPIOC_OUTPUT_EN, 0x02);
|
||||
GPIO_SET_BITWISE(GPIOC_ENABLE, 0x02);
|
||||
#endif
|
||||
#endif /* USB_STATUS_BY_EVENT */
|
||||
}
|
||||
|
||||
void usb_enable(bool on)
|
||||
|
|
@ -96,21 +174,27 @@ void usb_enable(bool on)
|
|||
|
||||
void usb_attach(void)
|
||||
{
|
||||
#ifdef USB_DETECT_BY_DRV
|
||||
usb_drv_attach();
|
||||
#else
|
||||
usb_enable(true);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef USB_DETECT_BY_DRV
|
||||
/* Cannot tell charger pin from USB pin */
|
||||
#ifdef USB_STATUS_BY_EVENT
|
||||
/* Cannot always tell power pin from USB pin */
|
||||
static int usb_status = USB_EXTRACTED;
|
||||
|
||||
void usb_connect_event(bool inserted)
|
||||
static int usb_timeout_event(struct timeout *tmo)
|
||||
{
|
||||
usb_status = inserted ? USB_INSERTED : USB_EXTRACTED;
|
||||
usb_status_event(inserted ? USB_POWERED : USB_UNPOWERED);
|
||||
usb_status_event(tmo->data == USB_GPIO_VAL ? USB_POWERED : USB_UNPOWERED);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void usb_insert_int(void)
|
||||
{
|
||||
static struct timeout usb_oneshot;
|
||||
unsigned long val = USB_GPIO_INPUT_VAL & USB_GPIO_MASK;
|
||||
usb_status = (val == USB_GPIO_VAL) ? USB_INSERTED : USB_EXTRACTED;
|
||||
GPIO_WRITE_BITWISE(USB_GPIO_INT_LEV, val ^ USB_GPIO_MASK, USB_GPIO_MASK);
|
||||
USB_GPIO_INT_CLR = USB_GPIO_MASK;
|
||||
timeout_register(&usb_oneshot, usb_timeout_event, HZ/5, val);
|
||||
}
|
||||
|
||||
/* Called during the bus reset interrupt when in detect mode */
|
||||
|
|
@ -118,51 +202,7 @@ void usb_drv_usb_detect_event(void)
|
|||
{
|
||||
usb_status_event(USB_INSERTED);
|
||||
}
|
||||
#else /* !USB_DETECT_BY_DRV */
|
||||
static bool usb_pin_detect(void)
|
||||
{
|
||||
bool retval = false;
|
||||
|
||||
#if defined(IPOD_4G) || defined(IPOD_COLOR) \
|
||||
|| defined(IPOD_MINI) || defined(IPOD_MINI2G)
|
||||
/* GPIO D bit 3 is usb detect */
|
||||
if (GPIOD_INPUT_VAL & 0x08)
|
||||
retval = true;
|
||||
|
||||
#elif defined(IPOD_NANO) || defined(IPOD_VIDEO)
|
||||
/* GPIO L bit 4 is usb detect */
|
||||
if (GPIOL_INPUT_VAL & 0x10)
|
||||
retval = true;
|
||||
|
||||
#elif defined(SANSA_C200)
|
||||
/* GPIO H bit 1 is usb/charger detect */
|
||||
if (GPIOH_INPUT_VAL & 0x02)
|
||||
retval = true;
|
||||
|
||||
#elif defined(SANSA_E200)
|
||||
/* GPIO B bit 4 is usb/charger detect */
|
||||
if (GPIOB_INPUT_VAL & 0x10)
|
||||
retval = true;
|
||||
|
||||
#elif defined(IRIVER_H10) || defined(IRIVER_H10_5GB) || defined(MROBE_100)
|
||||
/* GPIO L bit 2 is usb detect */
|
||||
if (GPIOL_INPUT_VAL & 0x4)
|
||||
retval = true;
|
||||
|
||||
#elif defined(PHILIPS_SA9200)
|
||||
/* GPIO F bit 7 is usb detect */
|
||||
if (!(GPIOF_INPUT_VAL & 0x80))
|
||||
retval = true;
|
||||
|
||||
#elif defined(PHILIPS_HDD1630)
|
||||
/* GPIO E bit 2 is usb detect */
|
||||
if (GPIOE_INPUT_VAL & 0x4)
|
||||
retval = true;
|
||||
#endif
|
||||
|
||||
return retval;
|
||||
}
|
||||
#endif /* USB_DETECT_BY_DRV */
|
||||
#endif /* USB_STATUS_BY_EVENT */
|
||||
|
||||
void usb_drv_int_enable(bool enable)
|
||||
{
|
||||
|
|
@ -178,27 +218,46 @@ void usb_drv_int_enable(bool enable)
|
|||
/* detect host or charger (INSERTED or EXTRACTED) */
|
||||
int usb_detect(void)
|
||||
{
|
||||
#ifdef USB_DETECT_BY_DRV
|
||||
#ifdef USB_STATUS_BY_EVENT
|
||||
return usb_status;
|
||||
#else
|
||||
if(usb_pin_detect()) {
|
||||
return USB_INSERTED;
|
||||
}
|
||||
else {
|
||||
return USB_EXTRACTED;
|
||||
}
|
||||
return ((USB_GPIO_INPUT_VAL & USB_GPIO_MASK) == USB_GPIO_VAL) ?
|
||||
USB_INSERTED : USB_EXTRACTED;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(IPOD_COLOR) || defined(IPOD_4G) \
|
||||
|| defined(IPOD_MINI) || defined(IPOD_MINI2G)
|
||||
#ifdef USB_FIREWIRE_HANDLING
|
||||
#ifdef USB_STATUS_BY_EVENT
|
||||
static bool firewire_status = false;
|
||||
#endif
|
||||
|
||||
bool firewire_detect(void)
|
||||
{
|
||||
#ifdef USB_STATUS_BY_EVENT
|
||||
return firewire_status;
|
||||
#else
|
||||
/* GPIO C bit 1 is firewire detect */
|
||||
if (!(GPIOC_INPUT_VAL & 0x02))
|
||||
/* no charger detection needed for firewire */
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
/* no charger detection needed for firewire */
|
||||
return (GPIOC_INPUT_VAL & 0x02) == 0x00;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef USB_STATUS_BY_EVENT
|
||||
static int firewire_timeout_event(struct timeout *tmo)
|
||||
{
|
||||
if (tmo->data == 0x00)
|
||||
usb_firewire_connect_event();
|
||||
return 0;
|
||||
}
|
||||
|
||||
void firewire_insert_int(void)
|
||||
{
|
||||
static struct timeout firewire_oneshot;
|
||||
unsigned long val = GPIOC_INPUT_VAL & 0x02;
|
||||
firewire_status = val == 0x00;
|
||||
GPIO_WRITE_BITWISE(GPIOC_INT_LEV, val ^ 0x02, 0x02);
|
||||
GPIOC_INT_CLR = 0x02;
|
||||
timeout_register(&firewire_oneshot, firewire_timeout_event, HZ/5, val);
|
||||
}
|
||||
#endif /* USB_STATUS_BY_EVENT */
|
||||
#endif /* USB_FIREWIRE_HANDLING */
|
||||
|
|
|
|||
|
|
@ -22,12 +22,7 @@
|
|||
#define USB_TARGET_H
|
||||
|
||||
void usb_init_device(void);
|
||||
|
||||
#ifndef BOOTLOADER
|
||||
#if defined(SANSA_C200) || defined(SANSA_E200)
|
||||
#define USB_STATUS_BY_EVENT /* No USB tick */
|
||||
void usb_connect_event(bool inserted);
|
||||
#endif
|
||||
#endif /* BOOTLOADER */
|
||||
void usb_insert_int(void);
|
||||
void firewire_insert_int(void);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue