git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1299 35acf78f-673a-0410-8e92-d51de3d6d3f4

This commit is contained in:
gdisirio 2009-11-15 08:52:17 +00:00
parent 55252f65b2
commit 84cf9ce9ff
6 changed files with 125 additions and 51 deletions

View File

@ -77,6 +77,7 @@ CSRC = ${PORTSRC} \
${CHIBIOS}/os/io/platforms/STM32/spi_lld.c \ ${CHIBIOS}/os/io/platforms/STM32/spi_lld.c \
${CHIBIOS}/os/io/platforms/STM32/stm32_dma.c \ ${CHIBIOS}/os/io/platforms/STM32/stm32_dma.c \
${CHIBIOS}/os/various/evtimer.c \ ${CHIBIOS}/os/various/evtimer.c \
${CHIBIOS}/os/various/syscalls.c \
board.c main.c board.c main.c
# C++ sources that can be compiled in ARM or THUMB mode depending on the global # C++ sources that can be compiled in ARM or THUMB mode depending on the global
@ -158,7 +159,7 @@ CPPWARN = -Wall -Wextra
# #
# List all default C defines here, like -D_DEBUG=1 # List all default C defines here, like -D_DEBUG=1
DDEFS = DDEFS = -DSTDOUT_SD=SD2 -DSTDIN_SD=SD2
# List all default ASM defines here, like -D_DEBUG=1 # List all default ASM defines here, like -D_DEBUG=1
DADEFS = DADEFS =

View File

@ -27,53 +27,42 @@
#include <ff.h> #include <ff.h>
#include <stdio.h>
#include <string.h>
#include "board.h" #include "board.h"
/*
* Maximum speed SPI configuration (18MHz, CPHA=0, CPOL=0, MSb first).
*/
static SPIConfig hs_spicfg = {
IOPORT2, GPIOB_SPI2NSS, 0
};
/*
* Low speed SPI configuration (281.250KHz, CPHA=0, CPOL=0, MSb first).
*/
static SPIConfig ls_spicfg = {
IOPORT2, GPIOB_SPI2NSS, SPI_CR1_BR_2 | SPI_CR1_BR_1
};
/*
* MMC driver instance.
*/
MMCDriver MMCD1;
/*
* MMC configuration (empty).
*/
static const MMCConfig mmc_cfg = {};
/*
* Card insertion verification.
*/
static bool_t mmc_is_inserted(void) {
return palReadPad(IOPORT3, GPIOC_MMCCP);
}
/*
* Card protection verification.
*/
static bool_t mmc_is_protected(void) {
return !palReadPad(IOPORT3, GPIOC_MMCWP);
}
/** /**
* @brief FS object. * @brief FS object.
*/ */
FATFS MMC_FS; FATFS MMC_FS;
/**
* MMC driver instance.
*/
MMCDriver MMCD1;
/* FS mounted and ready.*/
static bool_t fs_ready = FALSE;
/* Maximum speed SPI configuration (18MHz, CPHA=0, CPOL=0, MSb first).*/
static SPIConfig hs_spicfg = {IOPORT2, GPIOB_SPI2NSS, 0};
/* Low speed SPI configuration (281.250KHz, CPHA=0, CPOL=0, MSb first).*/
static SPIConfig ls_spicfg = {IOPORT2, GPIOB_SPI2NSS, SPI_CR1_BR_2 | SPI_CR1_BR_1};
/* MMC configuration (empty).*/
static const MMCConfig mmc_cfg = {};
/* Card insertion verification.*/
static bool_t mmc_is_inserted(void) {return palReadPad(IOPORT3, GPIOC_MMCCP);}
/* Card protection verification.*/
static bool_t mmc_is_protected(void) {return !palReadPad(IOPORT3, GPIOC_MMCWP);}
/* Generic large buffer.*/
uint8_t fbuff[1024];
/* /*
* Red LEDs blinker thread, times are in milliseconds. * Red LEDs blinker thread, times are in milliseconds.
*/ */
@ -90,14 +79,65 @@ static msg_t Thread1(void *arg) {
return 0; return 0;
} }
static FRESULT scan_files(char *path)
{
FRESULT res;
FILINFO fno;
DIR dir;
int i;
char *fn;
res = f_opendir(&dir, path);
if (res == FR_OK) {
i = strlen(path);
for (;;) {
res = f_readdir(&dir, &fno);
if (res != FR_OK || fno.fname[0] == 0)
break;
if (fno.fname[0] == '.')
continue;
fn = fno.fname;
if (fno.fattrib & AM_DIR) {
siprintf(&path[i], "/%s", fn);
res = scan_files(path);
if (res != FR_OK)
break;
path[i] = 0;
}
else {
iprintf("%s/%s\r\n", path, fn);
}
}
}
return res;
}
/* /*
* Executed as event handler at 500mS intervals. * Executed as event handler at 500mS intervals.
*/ */
static void TimerHandler(eventid_t id) { static void TimerHandler(eventid_t id) {
(void)id; (void)id;
if (palReadPad(IOPORT1, GPIOA_BUTTON)) if (palReadPad(IOPORT1, GPIOA_BUTTON)) {
TestThread(&SD2); if (fs_ready) {
FRESULT err;
uint32_t clusters;
FATFS *fsp;
err = f_getfree("/", &clusters, &fsp);
if (err != FR_OK) {
iprintf("FS: f_getfree() failed\r\n");
return;
}
iprintf("FS: %lu free clusters, %u sectors per cluster, %lu bytes free\r\n",
clusters, MMC_FS.csize,
clusters * (uint32_t)MMC_FS.csize * (uint32_t)MMC_SECTOR_SIZE);
fbuff[0] = 0;
scan_files((char *)fbuff);
}
else
TestThread(&SD2);
}
} }
/* /*
@ -105,25 +145,27 @@ static void TimerHandler(eventid_t id) {
*/ */
static void InsertHandler(eventid_t id) { static void InsertHandler(eventid_t id) {
FRESULT err; FRESULT err;
uint32_t clusters;
FATFS *fsp;
(void)id; (void)id;
iprintf("MMC: inserted\r\n");
/* /*
* On insertion MMC initialization and FS mount. * On insertion MMC initialization and FS mount.
*/ */
if (mmcConnect(&MMCD1)) iprintf("MMC: initialization ");
if (mmcConnect(&MMCD1)) {
iprintf("failed\r\n");
return; return;
}
iprintf("ok\r\n");
iprintf("FS: mount ");
err = f_mount(0, &MMC_FS); err = f_mount(0, &MMC_FS);
if (err != FR_OK) { if (err != FR_OK) {
iprintf("failed\r\n");
mmcDisconnect(&MMCD1); mmcDisconnect(&MMCD1);
return; return;
} }
err = f_getfree("/", &clusters, &fsp); fs_ready = TRUE;
if (err != FR_OK) { iprintf("ok\r\n");
mmcDisconnect(&MMCD1);
return;
}
} }
/* /*
@ -132,6 +174,8 @@ static void InsertHandler(eventid_t id) {
static void RemoveHandler(eventid_t id) { static void RemoveHandler(eventid_t id) {
(void)id; (void)id;
iprintf("MMC: removed\r\n");
fs_ready = FALSE;
} }
/* /*

View File

@ -8,9 +8,12 @@ The demo will on an Olimex STM32-P103 board.
** The Demo ** ** The Demo **
The demo flashes the board LED using a thread, by pressing the button located This demo shows how to integrate the FatFs file system and use the SPI and MMC
on the board the test procedure is activated with output on the serial port drivers.
COM2 (USART2). The demo flashes the board LED using a thread and monitors the MMC slot for
a card insertion. By pressing the button located on the board while a card is
inserted a directory dump on the serial port is performed, if a card is not
inserted then the test procedure is activated.
** Build Procedure ** ** Build Procedure **

Binary file not shown.

View File

@ -63,18 +63,31 @@
#include <sys/types.h> #include <sys/types.h>
#include <ch.h> #include <ch.h>
#if defined(STDOUT_SD) || defined(STDIN_SD)
#include <serial.h>
#endif
/***************************************************************************/ /***************************************************************************/
int _read_r(struct _reent *r, int file, char * ptr, int len) int _read_r(struct _reent *r, int file, char * ptr, int len)
{ {
(void)r; (void)r;
#if defined(STDIN_SD)
if (!len || (file != 0)) {
errno = EINVAL;
return -1;
}
*ptr++ = chIOGet(&STDOUT_SD);
if (--len > 0)
len = chIORead(&STDOUT_SD, (uint8_t *)ptr, (size_t)len);
return len;
#else
(void)file; (void)file;
(void)ptr; (void)ptr;
(void)len; (void)len;
errno = EINVAL; errno = EINVAL;
return -1; return -1;
#endif
} }
/***************************************************************************/ /***************************************************************************/
@ -93,10 +106,20 @@ int _lseek_r(struct _reent *r, int file, int ptr, int dir)
int _write_r(struct _reent *r, int file, char * ptr, int len) int _write_r(struct _reent *r, int file, char * ptr, int len)
{ {
int n;
(void)r; (void)r;
(void)file; (void)file;
(void)ptr; (void)ptr;
#if defined(STDOUT_SD)
if (file != 1) {
errno = EINVAL;
return -1;
}
n = len;
while (n--)
chIOPut(&STDOUT_SD, *ptr++);
#endif
return len; return len;
} }

View File

@ -15,6 +15,9 @@
- NEW: Generic MMC (over SPI) driver. - NEW: Generic MMC (over SPI) driver.
- NEW: Added a STM32 demo that integrates the MMC driver and the FatFs - NEW: Added a STM32 demo that integrates the MMC driver and the FatFs
file system. file system.
- NEW: Implemented I/O redirection on a serial driver into syscalls.c, now
it is possible (but not recommended) to use printf()/scanf() etc. An usage
example is in the new MMC/FatFs demo. Note the extra -D... into the Makefile.
- CHANGE: Moved the STM32 firmware library under ./ext, this way there is no - CHANGE: Moved the STM32 firmware library under ./ext, this way there is no
need to duplicate it in each demo program. need to duplicate it in each demo program.
- CHANGE: Moved the file stm32f10x.h from the demos to the platforms support - CHANGE: Moved the file stm32f10x.h from the demos to the platforms support