blob: 5e9f2cf0304f51e3ba5b93173cea38795f52a4b6 [file] [log] [blame]
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2011 by Amaury Pouly
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include "config.h"
#include "system.h"
#include "sd.h"
#include "sdmmc.h"
#include "ssp-imx233.h"
#include "pinctrl-imx233.h"
#include "button-target.h"
/**
* This code assumes a single SD card slot
*/
#ifdef SANSA_FUZEPLUS
#define SD_SSP 1
#else
#error You need to configure the ssp to use
#endif
static tCardInfo card_info;
static struct mutex sd_mutex;
static void sd_detect_callback(int ssp)
{
(void)ssp;
/* This is called only if the state was stable for 300ms - check state
* and post appropriate event. */
if(imx233_ssp_sdmmc_detect(SD_SSP))
queue_broadcast(SYS_HOTSWAP_INSERTED, 0);
else
queue_broadcast(SYS_HOTSWAP_EXTRACTED, 0);
printf("sd_detect_callback(%d)", imx233_ssp_sdmmc_detect(SD_SSP));
imx233_ssp_sdmmc_setup_detect(SD_SSP, true, sd_detect_callback);
}
int sd_init(void)
{
mutex_init(&sd_mutex);
imx233_ssp_start(SD_SSP);
imx233_ssp_softreset(SD_SSP);
imx233_ssp_set_mode(SD_SSP, HW_SSP_CTRL1__SSP_MODE__SD_MMC);
#ifdef SANSA_FUZEPLUS
imx233_ssp_setup_ssp1_sd_mmc_pins(true, 4, PINCTRL_DRIVE_8mA, false);
#endif
imx233_ssp_sdmmc_setup_detect(SD_SSP, true, sd_detect_callback);
/* SSPCLK @ 96MHz
* gives bitrate of 96000 / 240 / 1 = 400kHz */
imx233_ssp_set_timings(SD_SSP, 240, 0, 0xffff);
imx233_ssp_set_bus_width(SD_SSP, 1);
imx233_ssp_set_block_size(SD_SSP, 9);
return 0;
}
int sd_read_sectors(IF_MD2(int drive,) unsigned long start, int count,
void* buf)
{
IF_MD((void) drive);
(void) start;
(void) count;
(void) buf;
return -1;
}
int sd_write_sectors(IF_MD2(int drive,) unsigned long start, int count,
const void* buf)
{
IF_MD((void) drive);
(void) start;
(void) count;
(void) buf;
return -1;
}
tCardInfo *card_get_info_target(int card_no)
{
(void)card_no;
return NULL;
}
int sd_num_drives(int first_drive)
{
(void) first_drive;
return 1;
}
bool sd_present(IF_MD(int drive))
{
IF_MD((void) drive);
return imx233_ssp_sdmmc_detect(SD_SSP);
}