| /*************************************************************************** |
| * __________ __ ___. |
| * 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); |
| } |
| |