Commit 8244d5d1 authored by Xavier Piroux's avatar Xavier Piroux Committed by Matthieu Cattin

working on implementation of SD driver throug SPI

parent 15293378
......@@ -10,17 +10,25 @@
#error Incompatible MDRIVER_SD version number!
#endif
#define PIN_UC_PC3 12
#define PIN_UC_PC3 PRS_GPIO_PIN12
#define PIN_UC_PD0 28
#define PIN_UC_PD1 29
#define PIN_UC_PD2 30
#define PIN_UC_PD3 31
//SPI protocole
#define PIN_UC_SD_MOSI PIN_UC_PD0
#define PIN_UC_SD_MISO PIN_UC_PD1
#define PIN_UC_SD_CLK PIN_UC_PD2
#define PIN_UC_SD_CS_N PIN_UC_PD3
//checking if SD card is present
#define PIN_UC_SD_EN PIN_UC_PC3
/* usage : add those pins values to GPIO_BASE */
#define MDRIVER_SD_SECTOR_SIZE 512 /* Sector size */
#define MDRIVER_SD_VOLUME0_SIZE (32 * 1024) /* definition for size of sddrive0 */
#endif /* _CONFIG_MDRIVER_SD_H_ */
......@@ -3,9 +3,11 @@
*/
#include "../../api/api_mdriver_ram.h"
#include "../../api/api_mdriver_sd.h"
#include "config_mdriver_sd.h"
#include "../../psp/include/psp_string.h"
#include "em_gpio.h"
#include "em_cmu.h"
#if VER_MDRIVER_SD_MAJOR != 1 || VER_MDRIVER_SD_MINOR != 0
#error Incompatible MDRIVER_SD version number!
......@@ -37,6 +39,24 @@
#error Incompatible MDRIVER_RAM version number!
#endif
static int sd_card_present(F_DRIVER * driver);
typedef struct {
//TODO: we can improve and add the USART number here
unsigned long maxsector;
int use;
F_DRIVER * driver;
} t_SdDrv;
static F_DRIVER t_drivers[1];
static t_SdDrv SdDrv[1] =
{
{ ( MDRIVER_SD_VOLUME0_SIZE / MDRIVER_SD_SECTOR_SIZE ), 0, &t_drivers[0] }
};
static int sd_readsector ( F_DRIVER * driver, void * data, unsigned long sector ) {
//TODO:implement sd_readsector
return -1;
......@@ -46,17 +66,59 @@ static int sd_writesector ( F_DRIVER * driver, void * data, unsigned long sector
return -1;
}
static int sd_getphy ( F_DRIVER * driver, F_PHY * phy ) {
//TODO:implement sd_getphy
return -1;
t_SdDrv * p = (t_SdDrv *)( driver->user_ptr );
if (sd_card_present(driver) != 0) {
return MDRIVER_SD_ERR_NOTAVAILABLE;
}
phy->number_of_sectors = p->maxsector;
phy->bytes_per_sector = MDRIVER_SD_SECTOR_SIZE;
return MDRIVER_SD_NO_ERROR;
}
static void sd_release ( F_DRIVER * driver ) {
//TODO:implement sd_release
return;
t_SdDrv * p = (t_SdDrv *)( driver->user_ptr );
if ( p == SdDrv ) {
//TODO: check if SD protocol and disconnect properly the SD through SPI + SD protocol
p->use = 0;
}
}
F_DRIVER * sd_initfunc ( unsigned long driver_param ) {
//TODO:implement sd_initfunc
/* Enabling clock to USART 0*/
//CMU_ClockEnable(cmuClock_USART0, true);
//SPI_setup(USART0_NUM, GPIO_POS1, false);
return NULL;
static int sd_card_present(F_DRIVER * driver) {
return (GPIO_PortInGet(gpioPortC) & 0x8);//pin = PC3
}
F_DRIVER * sd_initfunc ( unsigned long driver_param ) {
t_SdDrv * p;
p = SdDrv + driver_param;
if ( p != SdDrv ) {
return 0;
}
if ( p->use ) {
return 0;
}
{
GPIO_Mode_TypeDef gpioModeSD_EN = gpioModeInput;
GPIO_PinModeSet(gpioPortC, 3, gpioModeSD_EN, 0); /* init pin SD_EN to check if SD is plugged */
/* Enabling clock to USART 1*/
CMU_ClockEnable(cmuClock_USART1, true);
SPI_setup(1, 1, 1);//init SD SPI
//TODO: check specif of SD protocol and init SD through SPI + SD protocol
(void)psp_memset( p->driver, 0, sizeof( F_DRIVER ) );
p->driver->readsector = sd_readsector;
p->driver->writesector = sd_writesector;
p->driver->getphy = sd_getphy;
p->driver->release = sd_release;
p->driver->user_ptr = p;
p->use = 1;
return p->driver;
}
} /* ram_initfunc */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment