forked from len0rd/rockbox
First part of MMC hotswap handling; removed unnecessary MMC thread
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@5241 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
0660105af2
commit
f5bdf6952c
3 changed files with 50 additions and 30 deletions
|
@ -1371,7 +1371,7 @@ bool dbg_mmc_info(void)
|
||||||
|
|
||||||
lcd_update();
|
lcd_update();
|
||||||
|
|
||||||
switch (button_get(true))
|
switch (button_get_w_tmo(HZ/2))
|
||||||
{
|
{
|
||||||
case SETTINGS_OK:
|
case SETTINGS_OK:
|
||||||
case SETTINGS_CANCEL:
|
case SETTINGS_CANCEL:
|
||||||
|
|
|
@ -31,7 +31,6 @@
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
#include "hwcompat.h"
|
#include "hwcompat.h"
|
||||||
#include "adc.h"
|
#include "adc.h"
|
||||||
|
|
||||||
#include "bitswap.h"
|
#include "bitswap.h"
|
||||||
|
|
||||||
#define SECTOR_SIZE 512
|
#define SECTOR_SIZE 512
|
||||||
|
@ -90,9 +89,6 @@ long last_disk_activity = -1;
|
||||||
|
|
||||||
static struct mutex mmc_mutex;
|
static struct mutex mmc_mutex;
|
||||||
|
|
||||||
static char mmc_stack[DEFAULT_STACK_SIZE];
|
|
||||||
static const char mmc_thread_name[] = "mmc";
|
|
||||||
static struct event_queue mmc_queue;
|
|
||||||
static bool initialized = false;
|
static bool initialized = false;
|
||||||
static bool delayed_write = false;
|
static bool delayed_write = false;
|
||||||
static unsigned char delayed_sector[SECTOR_SIZE];
|
static unsigned char delayed_sector[SECTOR_SIZE];
|
||||||
|
@ -115,6 +111,8 @@ static int current_buffer = 0;
|
||||||
|
|
||||||
static tCardInfo card_info[2];
|
static tCardInfo card_info[2];
|
||||||
static int current_card = 0;
|
static int current_card = 0;
|
||||||
|
static bool last_mmc_status = false;
|
||||||
|
static int countdown; /* for mmc switch debouncing */
|
||||||
|
|
||||||
/* private function declarations */
|
/* private function declarations */
|
||||||
|
|
||||||
|
@ -137,6 +135,9 @@ static void swapcopy_sector(const unsigned char *buf);
|
||||||
static int send_sector(const unsigned char *nextbuf, int timeout);
|
static int send_sector(const unsigned char *nextbuf, int timeout);
|
||||||
static int send_single_sector(const unsigned char *buf, int timeout);
|
static int send_single_sector(const unsigned char *buf, int timeout);
|
||||||
|
|
||||||
|
static bool mmc_detect(void);
|
||||||
|
static void mmc_tick(void);
|
||||||
|
|
||||||
/* implementation */
|
/* implementation */
|
||||||
|
|
||||||
static int select_card(int card_no)
|
static int select_card(int card_no)
|
||||||
|
@ -475,10 +476,12 @@ tCardInfo *mmc_card_info(int card_no)
|
||||||
{
|
{
|
||||||
tCardInfo *card = &card_info[card_no];
|
tCardInfo *card = &card_info[card_no];
|
||||||
|
|
||||||
if (!card->initialized)
|
if (!card->initialized && ((card_no == 0) || mmc_detect()))
|
||||||
{
|
{
|
||||||
|
mutex_lock(&mmc_mutex);
|
||||||
select_card(card_no);
|
select_card(card_no);
|
||||||
deselect_card();
|
deselect_card();
|
||||||
|
mutex_unlock(&mmc_mutex);
|
||||||
}
|
}
|
||||||
return card;
|
return card;
|
||||||
}
|
}
|
||||||
|
@ -757,27 +760,42 @@ void ata_spin(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mmc_thread(void)
|
static bool mmc_detect(void)
|
||||||
{
|
{
|
||||||
struct event ev;
|
return adc_read(ADC_MMC_SWITCH) < 0x200 ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
while (1) {
|
static void mmc_tick(void)
|
||||||
while ( queue_empty( &mmc_queue ) ) {
|
{
|
||||||
|
bool current_status;
|
||||||
|
|
||||||
sleep(HZ/4);
|
current_status = mmc_detect();
|
||||||
}
|
|
||||||
queue_wait(&mmc_queue, &ev);
|
/* Only report when the status has changed */
|
||||||
switch ( ev.id ) {
|
if (current_status != last_mmc_status)
|
||||||
#ifndef USB_NONE
|
{
|
||||||
case SYS_USB_CONNECTED:
|
last_mmc_status = current_status;
|
||||||
/* Tell the USB thread that we are safe */
|
countdown = 30;
|
||||||
DEBUGF("mmc_thread got SYS_USB_CONNECTED\n");
|
}
|
||||||
usb_acknowledge(SYS_USB_CONNECTED_ACK);
|
else
|
||||||
|
{
|
||||||
|
/* Count down until it gets negative */
|
||||||
|
if (countdown >= 0)
|
||||||
|
countdown--;
|
||||||
|
|
||||||
/* Wait until the USB cable is extracted again */
|
/* Report to the thread if we have had 3 identical status
|
||||||
usb_wait_for_disconnect(&mmc_queue);
|
readings in a row */
|
||||||
break;
|
if (countdown == 0)
|
||||||
#endif
|
{
|
||||||
|
if (current_status)
|
||||||
|
{
|
||||||
|
queue_broadcast(SYS_MMC_INSERTED, NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
queue_broadcast(SYS_MMC_EXTRACTED, NULL);
|
||||||
|
card_info[1].initialized = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -822,7 +840,8 @@ int ata_init(void)
|
||||||
PBIOR |= 0x2000; /* SCK1 output */
|
PBIOR |= 0x2000; /* SCK1 output */
|
||||||
PBIOR &= ~0x0C00; /* TxD1, RxD1 input */
|
PBIOR &= ~0x0C00; /* TxD1, RxD1 input */
|
||||||
|
|
||||||
if(adc_read(ADC_MMC_SWITCH) < 0x200)
|
last_mmc_status = mmc_detect();
|
||||||
|
if (last_mmc_status)
|
||||||
{ /* MMC inserted */
|
{ /* MMC inserted */
|
||||||
current_card = 1;
|
current_card = 1;
|
||||||
}
|
}
|
||||||
|
@ -833,12 +852,9 @@ int ata_init(void)
|
||||||
|
|
||||||
ata_enable(true);
|
ata_enable(true);
|
||||||
|
|
||||||
if ( !initialized ) {
|
if ( !initialized )
|
||||||
|
{
|
||||||
queue_init(&mmc_queue);
|
tick_add_task(mmc_tick);
|
||||||
|
|
||||||
create_thread(mmc_thread, mmc_stack,
|
|
||||||
sizeof(mmc_stack), mmc_thread_name);
|
|
||||||
initialized = true;
|
initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,10 @@
|
||||||
#define SYS_USB_DISCONNECTED_ACK -4
|
#define SYS_USB_DISCONNECTED_ACK -4
|
||||||
#define SYS_TIMEOUT -5
|
#define SYS_TIMEOUT -5
|
||||||
|
|
||||||
|
/* MMC based systems only */
|
||||||
|
#define SYS_MMC_INSERTED -6
|
||||||
|
#define SYS_MMC_EXTRACTED -7
|
||||||
|
|
||||||
struct event
|
struct event
|
||||||
{
|
{
|
||||||
int id;
|
int id;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue