Sansa Connect: Working USB Mass Storage
Acknowledge SYS_USB_CONNECTED in all queues so USB task can gain exclusive access to the storage. Reduce CPPI requeue timeout to speed up disk access. Change-Id: I322aae4cac679696bb8186ccacf838a18f0715e9
This commit is contained in:
parent
a11c88e0df
commit
163e3507f8
5 changed files with 59 additions and 31 deletions
|
@ -172,6 +172,49 @@ static void clear_recoverzap(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void handle_usb(int connect_timeout)
|
||||||
|
{
|
||||||
|
long end_tick = 0;
|
||||||
|
|
||||||
|
if (usb_detect() != USB_INSERTED)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
usb_init();
|
||||||
|
usb_start_monitoring();
|
||||||
|
|
||||||
|
printf("USB: Connecting");
|
||||||
|
|
||||||
|
if (connect_timeout != TIMEOUT_BLOCK)
|
||||||
|
{
|
||||||
|
end_tick = current_tick + connect_timeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (usb_detect() == USB_INSERTED)
|
||||||
|
{
|
||||||
|
if (button_get_w_tmo(HZ/2) == SYS_USB_CONNECTED)
|
||||||
|
{
|
||||||
|
printf("Bootloader USB mode");
|
||||||
|
usb_acknowledge(SYS_USB_CONNECTED_ACK);
|
||||||
|
while (button_get_w_tmo(HZ/2) != SYS_USB_DISCONNECTED)
|
||||||
|
{
|
||||||
|
storage_spin();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (connect_timeout != TIMEOUT_BLOCK &&
|
||||||
|
TIME_AFTER(current_tick, end_tick))
|
||||||
|
{
|
||||||
|
printf("USB: Timed out");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
usb_close();
|
||||||
|
}
|
||||||
|
|
||||||
extern void show_logo(void);
|
extern void show_logo(void);
|
||||||
|
|
||||||
void main(void)
|
void main(void)
|
||||||
|
@ -203,12 +246,8 @@ void main(void)
|
||||||
reset_screen();
|
reset_screen();
|
||||||
show_logo();
|
show_logo();
|
||||||
|
|
||||||
btn = button_read_device();
|
|
||||||
|
|
||||||
printf("Rockbox boot loader");
|
printf("Rockbox boot loader");
|
||||||
printf("Version %s", rbversion);
|
printf("Version %s", rbversion);
|
||||||
usb_init();
|
|
||||||
usb_start_monitoring();
|
|
||||||
|
|
||||||
clear_recoverzap();
|
clear_recoverzap();
|
||||||
|
|
||||||
|
@ -218,21 +257,14 @@ void main(void)
|
||||||
|
|
||||||
filesystem_init();
|
filesystem_init();
|
||||||
|
|
||||||
if (usb_detect() == USB_INSERTED)
|
handle_usb(2*HZ);
|
||||||
{
|
|
||||||
usb_enable(true);
|
|
||||||
while (usb_detect() == USB_INSERTED)
|
|
||||||
{
|
|
||||||
sleep(HZ);
|
|
||||||
storage_spin();
|
|
||||||
}
|
|
||||||
usb_enable(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = disk_mount_all();
|
ret = disk_mount_all();
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
error(EDISK, ret, true);
|
error(EDISK, ret, true);
|
||||||
|
|
||||||
|
btn = button_read_device();
|
||||||
|
|
||||||
if (btn & BUTTON_PREV)
|
if (btn & BUTTON_PREV)
|
||||||
{
|
{
|
||||||
printf("Loading OF firmware...");
|
printf("Loading OF firmware...");
|
||||||
|
|
|
@ -902,6 +902,10 @@ Lyre prototype 1 */
|
||||||
#define INCLUDE_TIMEOUT_API
|
#define INCLUDE_TIMEOUT_API
|
||||||
#define USB_DRIVER_CLOSE
|
#define USB_DRIVER_CLOSE
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(HAVE_USBSTACK) && CONFIG_USBOTG == USBOTG_TNETV105
|
||||||
|
#define INCLUDE_TIMEOUT_API
|
||||||
|
#define USB_DRIVER_CLOSE
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#else /* !BOOTLOADER */
|
#else /* !BOOTLOADER */
|
||||||
|
|
|
@ -375,6 +375,12 @@ void btn_thread(void)
|
||||||
{
|
{
|
||||||
queue_wait(&btn_queue, &ev);
|
queue_wait(&btn_queue, &ev);
|
||||||
|
|
||||||
|
if (ev.id == SYS_USB_CONNECTED)
|
||||||
|
{
|
||||||
|
/* Allow USB to gain exclusive storage access */
|
||||||
|
usb_acknowledge(SYS_USB_CONNECTED_ACK);
|
||||||
|
}
|
||||||
|
|
||||||
/* Ignore all messages except BTN_INTERRUPT */
|
/* Ignore all messages except BTN_INTERRUPT */
|
||||||
if (ev.id != BTN_INTERRUPT)
|
if (ev.id != BTN_INTERRUPT)
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -1034,7 +1034,7 @@ static int cppi_timeout_cb(struct timeout *tmo)
|
||||||
int flags = disable_irq_save();
|
int flags = disable_irq_save();
|
||||||
bool requeue = tnetv_handle_cppi();
|
bool requeue = tnetv_handle_cppi();
|
||||||
restore_irq(flags);
|
restore_irq(flags);
|
||||||
return requeue ? HZ/10 : 0;
|
return requeue ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VLYNQ(void) __attribute__ ((section(".icode")));
|
void VLYNQ(void) __attribute__ ((section(".icode")));
|
||||||
|
@ -1205,7 +1205,7 @@ void VLYNQ(void)
|
||||||
|
|
||||||
if (tnetv_handle_cppi())
|
if (tnetv_handle_cppi())
|
||||||
{
|
{
|
||||||
timeout_register(&cppi_timeout, cppi_timeout_cb, HZ/10, 0);
|
timeout_register(&cppi_timeout, cppi_timeout_cb, 1, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -781,20 +781,10 @@ int sd_read_sectors(IF_MD(int card_no,) unsigned long start, int incount,
|
||||||
int sd_write_sectors(IF_MD(int card_no,) unsigned long start, int count,
|
int sd_write_sectors(IF_MD(int card_no,) unsigned long start, int count,
|
||||||
const void* outbuf)
|
const void* outbuf)
|
||||||
{
|
{
|
||||||
#ifndef BOOTLOADER
|
|
||||||
#ifndef HAVE_MULTIDRIVE
|
#ifndef HAVE_MULTIDRIVE
|
||||||
const int card_no = 0;
|
const int card_no = 0;
|
||||||
#endif
|
#endif
|
||||||
return sd_transfer_sectors(card_no, start, count, (void*)outbuf, true);
|
return sd_transfer_sectors(card_no, start, count, (void*)outbuf, true);
|
||||||
#else /* we don't need write support in bootloader */
|
|
||||||
#ifdef HAVE_MULTIDRIVE
|
|
||||||
(void)card_no;
|
|
||||||
#endif
|
|
||||||
(void)start;
|
|
||||||
(void)count;
|
|
||||||
(void)outbuf;
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int sd_init(void)
|
int sd_init(void)
|
||||||
|
@ -809,9 +799,7 @@ int sd_init(void)
|
||||||
|
|
||||||
mutex_lock(&sd_mtx);
|
mutex_lock(&sd_mtx);
|
||||||
|
|
||||||
#ifndef BOOTLOADER
|
|
||||||
enable_controller(false);
|
enable_controller(false);
|
||||||
#endif
|
|
||||||
|
|
||||||
/* based on linux/drivers/mmc/dm320mmc.c
|
/* based on linux/drivers/mmc/dm320mmc.c
|
||||||
Copyright (C) 2006 ZSI, All Rights Reserved.
|
Copyright (C) 2006 ZSI, All Rights Reserved.
|
||||||
|
@ -859,8 +847,6 @@ int sd_init(void)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
sd_select_device(1);
|
|
||||||
|
|
||||||
/* Disable Memory Card CLK - it is enabled on demand by TMS320DM320 */
|
/* Disable Memory Card CLK - it is enabled on demand by TMS320DM320 */
|
||||||
bitclr16(&IO_MMC_MEM_CLK_CONTROL, (1 << 8));
|
bitclr16(&IO_MMC_MEM_CLK_CONTROL, (1 << 8));
|
||||||
mutex_unlock(&sd_mtx);
|
mutex_unlock(&sd_mtx);
|
||||||
|
|
Loading…
Reference in a new issue