Some SD-card work for the ARM board (high level)

This commit is contained in:
bsongis
2012-05-22 18:24:48 +00:00
parent b4e881f1c0
commit b4a3f2038d
8 changed files with 268 additions and 116 deletions
+127 -1
View File
@@ -496,7 +496,7 @@ void eeLoadModel(uint8_t id)
resetProto();
resetAll();
#ifdef SDCARD
#if defined(SDCARD) && defined(PCBV4)
initLogs();
#endif
}
@@ -904,3 +904,129 @@ uint32_t unprotect_eeprom()
return spi_operation( p, Spi_rx_buf, 4 ) ;
}
#if defined(SDCARD)
FATFS g_FATFS_Obj; // TODO not here
const pm_char * eeBackupModel(uint8_t i_fileSrc)
{
char *buf = reusableBuffer.models.mainname;
FIL archiveFile;
DIR archiveFolder;
UINT written;
FRESULT result = f_mount(0, &g_FATFS_Obj);
if (result != FR_OK) {
return SDCARD_ERROR(result);
}
// check and create folder here
strcpy(buf, STR_MODELS_PATH);
result = f_opendir(&archiveFolder, buf);
if (result != FR_OK) {
result = f_mkdir(buf);
if (result != FR_OK)
return SDCARD_ERROR(result);
}
buf[sizeof(MODELS_PATH)-1] = '/';
memcpy(&buf[sizeof(MODELS_PATH)], ModelNames[i_fileSrc], sizeof(g_model.name));
buf[sizeof(MODELS_PATH)+sizeof(g_model.name)] = '\0';
uint8_t i = sizeof(MODELS_PATH)+sizeof(g_model.name)-1;
uint8_t len = 0;
while (i>sizeof(MODELS_PATH)-1) {
if (!len && buf[i])
len = i+1;
if (len)
buf[i] = idx2char(buf[i]);
i--;
}
if (len == 0) {
uint8_t num = i_fileSrc + 1;
strcpy(&buf[sizeof(MODELS_PATH)], STR_MODEL);
buf[sizeof(MODELS_PATH) + PSIZE(TR_MODEL)] = (char)((num / 10) + '0');
buf[sizeof(MODELS_PATH) + PSIZE(TR_MODEL) + 1] = (char)((num % 10) + '0');
len = sizeof(MODELS_PATH) + PSIZE(TR_MODEL) + 2;
}
strcpy(&buf[len], STR_MODELS_EXT);
result = f_open(&archiveFile, buf, FA_OPEN_ALWAYS | FA_WRITE);
if (result != FR_OK) {
return SDCARD_ERROR(result);
}
result = f_write(&archiveFile, &g_eeGeneral.myVers, 1, &written);
if (result != FR_OK) {
return SDCARD_ERROR(result);
}
uint16_t size = File_system[i_fileSrc].size ;
read32_eeprom_data( (File_system[i_fileSrc+1].block_no << 12) + sizeof( struct t_eeprom_header), ( uint8_t *)&Eeprom_buffer.data.model_data, size) ;
result = f_write(&archiveFile, (uint8_t *)&Eeprom_buffer.data.model_data, size, &written);
if (result != FR_OK) {
return SDCARD_ERROR(result);
}
f_close(&archiveFile);
return NULL;
}
const pm_char * eeRestoreModel(uint8_t i_fileDst, char *model_name)
{
char *buf = reusableBuffer.models.mainname;
FIL restoreFile;
UINT read;
FRESULT result = f_mount(0, &g_FATFS_Obj);
if (result != FR_OK) {
return SDCARD_ERROR(result);
}
strcpy(buf, STR_MODELS_PATH);
buf[sizeof(MODELS_PATH)-1] = '/';
strcpy(&buf[sizeof(MODELS_PATH)], model_name);
strcpy(&buf[strlen(buf)], STR_MODELS_EXT);
result = f_open(&restoreFile, buf, FA_OPEN_EXISTING | FA_READ);
if (result != FR_OK) {
return SDCARD_ERROR(result);
}
result = f_read(&restoreFile, (uint8_t *)buf, 1, &read);
if (result != FR_OK || read != 1) {
return SDCARD_ERROR(result);
}
if (buf[0] != g_eeGeneral.myVers) {
// TODO
}
if (eeModelExists(i_fileDst)) {
eeDeleteModel(i_fileDst);
}
result = f_read(&restoreFile, ( uint8_t *)&Eeprom_buffer.data.model_data, sizeof(g_model), &read);
f_close(&restoreFile);
if (result != FR_OK) {
return SDCARD_ERROR(result);
}
// TODO flash saving ...
if (read > sizeof(g_model.name))
memcpy(ModelNames[i_fileDst], Eeprom_buffer.data.model_data.name, sizeof(g_model.name));
else
memset(ModelNames[i_fileDst], 0, sizeof(g_model.name));
Eeprom32_source_address = (uint8_t *)&Eeprom_buffer.data.model_data; // Get data from here
Eeprom32_data_size = sizeof(g_model) ; // This much
Eeprom32_file_index = i_fileDst + 1 ; // This file system entry
Eeprom32_process_state = E32_BLANKCHECK ;
eeWaitFinished();
return NULL;
}
#endif
+5
View File
@@ -73,5 +73,10 @@ extern ModelData g_model;
extern uint8_t Spi_tx_buf[] ;
extern uint8_t Spi_rx_buf[] ;
#if defined(SDCARD)
const pm_char * eeBackupModel(uint8_t i_fileSrc);
const pm_char * eeRestoreModel(uint8_t i_fileDst, char *model_name);
#endif
#endif
+1 -1
View File
@@ -630,7 +630,7 @@ const pm_char * eeRestoreModel(uint8_t i_fileDst, char *model_name)
// TODO
}
if (EFile::exists(FILE_MODEL(i_fileDst))) {
if (eeModelExists(i_fileDst)) {
eeDeleteModel(i_fileDst);
}
+1 -1
View File
@@ -214,7 +214,7 @@ uint16_t evalChkSum();
#define eeCopyModel(dst, src) theFile.copy(FILE_MODEL(dst), FILE_MODEL(src))
#define eeSwapModels(id1, id2) EFile::swap(FILE_MODEL(id1), FILE_MODEL(id2))
#ifdef SDCARD
#if defined(SDCARD)
const pm_char * eeBackupModel(uint8_t i_fileSrc);
const pm_char * eeRestoreModel(uint8_t i_fileDst, char *model_name);
#endif
+123 -102
View File
@@ -248,7 +248,7 @@ void sd_cmd55()
uint32_t sd_acmd41()
{
uint32_t i ;
Hsmci *phsmci = HSMCI ;
Hsmci *phsmci = HSMCI ;
if ( CardIsConnected() )
{
@@ -275,7 +275,7 @@ uint32_t sd_acmd41()
uint32_t sd_cmd2()
{
uint32_t i ;
Hsmci *phsmci = HSMCI ;
Hsmci *phsmci = HSMCI ;
if ( CardIsConnected() )
{
@@ -305,7 +305,7 @@ uint32_t sd_cmd2()
uint32_t sd_cmd3()
{
uint32_t i ;
Hsmci *phsmci = HSMCI ;
Hsmci *phsmci = HSMCI ;
if ( CardIsConnected() )
{
@@ -331,7 +331,7 @@ uint32_t sd_cmd3()
uint32_t sd_cmd9()
{
uint32_t i ;
Hsmci *phsmci = HSMCI ;
Hsmci *phsmci = HSMCI ;
if ( CardIsConnected() )
{
@@ -361,7 +361,7 @@ uint32_t sd_cmd9()
uint32_t sd_cmd7()
{
uint32_t i ;
Hsmci *phsmci = HSMCI ;
Hsmci *phsmci = HSMCI ;
if ( CardIsConnected() )
{
@@ -383,11 +383,11 @@ uint32_t sd_cmd7()
}
}
#define HSMCI_CMDR_SPCMD_STD ( 0 << 8 )
#define HSMCI_CMDR_RSPTYP_48_BIT ( 1 << 6 )
#define HSMCI_CMDR_SPCMD_STD ( 0 << 8 )
#define HSMCI_CMDR_RSPTYP_48_BIT ( 1 << 6 )
#define HSMCI_CMDR_TRCMD_START_DATA ( 1 << 16 )
#define HSMCI_CMDR_TRDIR_READ ( 1 << 18 )
#define HSMCI_CMDR_TRTYP_SINGLE ( 0 << 19 )
#define HSMCI_CMDR_TRDIR_READ ( 1 << 18 )
#define HSMCI_CMDR_TRTYP_SINGLE ( 0 << 19 )
#define SD_SEND_SCR (51 | HSMCI_CMDR_SPCMD_STD | HSMCI_CMDR_RSPTYP_48_BIT \
| HSMCI_CMDR_TRCMD_START_DATA | HSMCI_CMDR_TRDIR_READ \
@@ -395,14 +395,18 @@ uint32_t sd_cmd7()
#define SD_READ_SINGLE_BLOCK (17 | HSMCI_CMDR_SPCMD_STD | HSMCI_CMDR_RSPTYP_48_BIT \
| HSMCI_CMDR_TRCMD_START_DATA | HSMCI_CMDR_TRDIR_READ \
| HSMCI_CMDR_TRTYP_SINGLE | HSMCI_CMDR_MAXLAT)
| HSMCI_CMDR_TRTYP_SINGLE | HSMCI_CMDR_MAXLAT)
#define SD_WRITE_SINGLE_BLOCK (17 | HSMCI_CMDR_SPCMD_STD | HSMCI_CMDR_RSPTYP_48_BIT \
| HSMCI_CMDR_TRCMD_START_DATA | HSMCI_CMDR_TRDIR_READ \
| HSMCI_CMDR_TRTYP_SINGLE | HSMCI_CMDR_MAXLAT)
// Get SCR
uint32_t sd_acmd51( uint32_t *presult )
{
uint32_t i ;
uint32_t j = 0 ;
Hsmci *phsmci = HSMCI ;
Hsmci *phsmci = HSMCI ;
if ( CardIsConnected() )
{
@@ -473,45 +477,6 @@ uint32_t sd_acmd6()
}
}
// Read SD card from (byte) address, for 512 bytes
uint32_t sd_cmd17( uint32_t address, uint32_t *presult )
{
uint32_t i ;
uint32_t j = 0 ;
Hsmci *phsmci = HSMCI ;
if ( CardIsConnected() )
{
// Block size = 512, nblocks = 1
phsmci->HSMCI_BLKR = ( ( 512 ) << 16 ) | 1 ;
phsmci->HSMCI_ARGR = address ;
phsmci->HSMCI_CMDR = SD_READ_SINGLE_BLOCK ;
for ( i = 0 ; i < 50000 ; i += 1 )
{
if ( phsmci->HSMCI_SR & HSMCI_SR_RXRDY )
{
*presult++ = phsmci->HSMCI_RDR ;
j += 1 ;
}
if ( ( phsmci->HSMCI_SR & ( HSMCI_SR_CMDRDY | HSMCI_SR_XFRDONE ) ) == ( HSMCI_SR_CMDRDY | HSMCI_SR_XFRDONE ) )
{
break ;
}
if ( j >= 128 )
{
break ;
}
}
return i | (j << 16) ; //phsmci->HSMCI_RSPR[0] ;
}
else
{
return 0 ;
}
}
// This routine is called every 10 mS, and checks for card
// insertion and removal.
// When a card is inserted, it initialises it ready for read/write access.
@@ -606,7 +571,39 @@ uint32_t sd_read_block( uint32_t block_no, uint32_t *data )
{
if ( Card_state == SD_ST_DATA )
{
return sd_cmd17( block_no << 9, data ) ;
uint32_t i ;
uint32_t j = 0 ;
Hsmci *phsmci = HSMCI ;
if ( CardIsConnected() )
{
// Block size = 512, nblocks = 1
phsmci->HSMCI_BLKR = ( ( 512 ) << 16 ) | 1 ;
phsmci->HSMCI_ARGR = block_no << 9 ;
phsmci->HSMCI_CMDR = SD_READ_SINGLE_BLOCK ;
for ( i = 0 ; i < 50000 ; i += 1 )
{
if ( phsmci->HSMCI_SR & HSMCI_SR_RXRDY )
{
*data++ = phsmci->HSMCI_RDR ;
j += 1 ;
}
if ( ( phsmci->HSMCI_SR & ( HSMCI_SR_CMDRDY | HSMCI_SR_XFRDONE ) ) == ( HSMCI_SR_CMDRDY | HSMCI_SR_XFRDONE ) )
{
break ;
}
if ( j >= 128 )
{
break ;
}
}
return i | (j << 16) ; //phsmci->HSMCI_RSPR[0] ;
}
else
{
return 0 ;
}
}
else
{
@@ -614,6 +611,50 @@ uint32_t sd_read_block( uint32_t block_no, uint32_t *data )
}
}
uint32_t sd_write_block( uint32_t block_no, uint32_t *data )
{
if ( Card_state == SD_ST_DATA )
{
uint32_t i ;
uint32_t j = 0 ;
Hsmci *phsmci = HSMCI ;
if ( CardIsConnected() )
{
// Block size = 512, nblocks = 1
phsmci->HSMCI_BLKR = ( ( 512 ) << 16 ) | 1 ;
phsmci->HSMCI_ARGR = block_no << 9 ;
phsmci->HSMCI_CMDR = SD_WRITE_SINGLE_BLOCK ;
#if 0
for ( i = 0 ; i < 50000 ; i += 1 )
{
if ( phsmci->HSMCI_SR & HSMCI_SR_RXRDY )
{
*data++ = phsmci->HSMCI_RDR ;
j += 1 ;
}
if ( ( phsmci->HSMCI_SR & ( HSMCI_SR_CMDRDY | HSMCI_SR_XFRDONE ) ) == ( HSMCI_SR_CMDRDY | HSMCI_SR_XFRDONE ) )
{
break ;
}
if ( j >= 128 )
{
break ;
}
}
#endif
return i | (j << 16) ; //phsmci->HSMCI_RSPR[0] ;
}
else
{
return 0 ;
}
}
else
{
return 0 ;
}
}
/*
Notes on SD card:
@@ -799,38 +840,23 @@ DRESULT disk_read (
if ( sd_card_ready() == 0 ) return RES_NOTRDY;
if (count == 1)
{ /* Single block read */
result = sd_read_block( sector, ( uint32_t *)buff ) ;
if ( result )
{
count = 0 ;
}
// if ((send_cmd(CMD17, sector) == 0) /* READ_SINGLE_BLOCK */
// && rcvr_datablock(buff, 512))
// count = 0;
}
else
{ /* Multiple block read */
do
{
result = sd_read_block( sector, ( uint32_t *)buff ) ;
if ( result )
{
sector += 1 ;
buff += 512 ;
count -= 1 ;
}
else
{
count = 1 ; // Flag error
break ;
}
} while ( count ) ;
}
do {
result = sd_read_block( sector, ( uint32_t *)buff ) ;
if (result) {
sector += 1 ;
buff += 512 ;
count -= 1 ;
}
else {
count = 1 ; // Flag error
break ;
}
} while ( count ) ;
return count ? RES_ERROR : RES_OK;
}
/*-----------------------------------------------------------------------*/
/* Write Sector(s) */
/*-----------------------------------------------------------------------*/
@@ -842,32 +868,27 @@ DRESULT disk_write (
BYTE count /* Sector count (1..255) */
)
{
uint32_t result ;
if (drv || !count) return RES_PARERR;
#if 0
if (Stat & STA_NOINIT) return RES_NOTRDY;
if (Stat & STA_PROTECT) return RES_WRPRT;
if ( sd_card_ready() == 0 ) return RES_NOTRDY;
if (!(CardType & CT_BLOCK)) sector *= 512; /* Convert to byte address if needed */
// TODO if (Stat & STA_PROTECT) return RES_WRPRT;
do {
result = sd_write_block( sector, ( uint32_t *)buff ) ;
if (result) {
sector += 1 ;
buff += 512 ;
count -= 1 ;
}
else {
count = 1 ; // Flag error
break ;
}
} while ( count ) ;
if (count == 1) { /* Single block write */
if ((send_cmd(CMD24, sector) == 0) /* WRITE_BLOCK */
&& xmit_datablock(buff, 0xFE))
count = 0;
}
else { /* Multiple block write */
if (CardType & CT_SDC) send_cmd(ACMD23, count);
if (send_cmd(CMD25, sector) == 0) { /* WRITE_MULTIPLE_BLOCK */
do {
if (!xmit_datablock(buff, 0xFC)) break;
buff += 512;
} while (--count);
if (!xmit_datablock(0, 0xFD)) /* STOP_TRAN token */
count = 1;
}
}
deselect();
#endif
return count ? RES_ERROR : RES_OK;
}
-1
View File
@@ -134,7 +134,6 @@ extern uint32_t sd_cmd2( void ) ;
extern uint32_t sd_cmd3( void ) ;
extern uint32_t sd_cmd7( void ) ;
extern uint32_t sd_cmd9( void ) ;
extern uint32_t sd_cmd17( uint32_t address, uint32_t *presult ) ;
extern uint32_t sd_acmd6( void ) ;
extern uint32_t sd_acmd51( uint32_t *presult ) ;
extern void sd_poll_10mS( void ) ;
+1 -9
View File
@@ -35,7 +35,7 @@
#include "ff.h"
char g_logFilename[21]; // "/O9XLOGS/M00_000.CSV\0" max required length = 21
FATFS g_FATFS_Obj;
FATFS g_FATFS_Obj; // TODO not here
FIL g_oLogFile;
int8_t g_logState = 0; // 0=closed, >0=opened, <0=error
const pm_char * g_logError = NULL;
@@ -128,14 +128,6 @@ void initLogs()
// g_logFilename should now be set appropriately.
}
const pm_char *SDCARD_ERROR(FRESULT result)
{
if (result == FR_NOT_READY)
return STR_NO_SDCARD;
else
return STR_SDCARD_ERROR;
}
void writeLogs()
{
FRESULT result;
+10 -1
View File
@@ -35,7 +35,10 @@
#define sdcard_h
#include "ff.h"
#if defined(PCBV4)
// TODO because this file is used for ersky9x
#include "rtc.h"
#endif
#include "gtime.h"
#define LOGS_PATH "/9XLOGS" // no trailing slash = important
@@ -50,7 +53,13 @@ extern FIL g_oLogFile;
extern void initLogs();
extern void writeLogs();
const pm_char *SDCARD_ERROR(FRESULT result);
const pm_char *SDCARD_ERROR(FRESULT result)
{
if (result == FR_NOT_READY)
return STR_NO_SDCARD;
else
return STR_SDCARD_ERROR;
}
// MM/SD card Disk IO Support
extern void disk_timerproc(void);