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:
Tomasz Moń 2021-06-09 20:50:30 +02:00
parent a11c88e0df
commit 163e3507f8
No known key found for this signature in database
GPG key ID: 92BA8820D4D517C8
5 changed files with 59 additions and 31 deletions

View file

@ -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...");

View file

@ -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 */

View file

@ -374,7 +374,13 @@ void btn_thread(void)
while (1) while (1)
{ {
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;

View file

@ -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);
} }
} }
} }

View file

@ -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);