Skip to content

Instantly share code, notes, and snippets.

@pamaury
Created March 4, 2015 10:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pamaury/59ea967005e46c5f982b to your computer and use it in GitHub Desktop.
Save pamaury/59ea967005e46c5f982b to your computer and use it in GitHub Desktop.
diff --git a/firmware/drivers/fat.c b/firmware/drivers/fat.c
index 44e5ab2..2659c79 100644
--- a/firmware/drivers/fat.c
+++ b/firmware/drivers/fat.c
@@ -364,8 +364,9 @@ void dc_writeback_callback(IF_MV(int volume,) unsigned long sector, void *buf)
int rc = storage_write_sectors(IF_MD(fat_bpb->drive,) sector, 1, buf);
if (rc < 0)
{
+ extern const char *sd_msg;
panicf("%s() - Could not write sector %ld"
- " (error %d)\n", __func__, sector, rc);
+ " (error %d %s)\n", __func__, sector, rc, sd_msg);
}
if (--copies == 0)
diff --git a/firmware/target/arm/tcc780x/sd-tcc780x.c b/firmware/target/arm/tcc780x/sd-tcc780x.c
index b7abea8..9b42501 100644
--- a/firmware/target/arm/tcc780x/sd-tcc780x.c
+++ b/firmware/target/arm/tcc780x/sd-tcc780x.c
@@ -511,6 +511,8 @@ sd_read_error:
}
}
+const char *sd_msg;
+
int sd_write_sectors(IF_MD(int card_no,) unsigned long start, int count,
const void* outbuf)
{
@@ -524,8 +526,11 @@ int sd_write_sectors(IF_MD(int card_no,) unsigned long start, int count,
const unsigned char *buf_end;
bool aligned;
+ sd_msg = "sd_write_sectors";
+
if ((card_no == CARD_NUM_SLOT) && (GPIOA & 0x10))
{
+ sd_msg = "EC_WRITE_PROTECT";
/* write protect tab set */
return -EC_WRITE_PROTECT;
}
@@ -537,6 +542,7 @@ int sd_write_sectors(IF_MD(int card_no,) unsigned long start, int count,
sd_write_retry:
if ((card_no == CARD_NUM_SLOT) && !card_detect_target())
{
+ sd_msg = "EC_NOCARD";
/* no external sd-card inserted */
ret = -EC_NOCARD;
goto sd_write_error;
@@ -546,6 +552,7 @@ sd_write_retry:
if (currcard->initialized < 0)
{
+ sd_msg = "init_err";
ret = currcard->initialized;
goto sd_write_error;
}
@@ -553,7 +560,10 @@ sd_write_retry:
ret = sd_wait_for_state(SD_TRAN, EC_TRAN_WRITE_ENTRY);
if (ret < 0)
+ {
+ sd_msg = "wait_error";
goto sd_write_error;
+ }
/* Use full SD clock for data transfer (PCK_SDMMC) */
SDICLK = (1<<13) | (1<<12); /* bypass divider | enable */
@@ -570,7 +580,10 @@ sd_write_retry:
ret = sd_command(SD_WRITE_MULTIPLE_BLOCK, start * 512, NULL, SDICMD_RES_TYPE1);
if (ret < 0)
+ {
+ sd_msg = "cmd_error";
goto sd_write_error;
+ }
aligned = (((int)outbuf & 3) == 0);
@@ -602,6 +615,7 @@ sd_write_retry:
/* Wait for the FIFO to empty */
if (!sd_poll_status(SDISTATUS_FIFO_LOAD_REQ, 0x80000))
{
+ sd_msg = "EC_FIFO_WR_EMPTY";
ret = -EC_FIFO_WR_EMPTY;
goto sd_write_error;
}
@@ -611,17 +625,24 @@ sd_write_retry:
if (!sd_poll_status(SDISTATUS_MULTIBLOCK_END, 0x80000))
{
+ sd_msg = "EC_FIFO_WR_DONE";
ret = -EC_FIFO_WR_DONE;
goto sd_write_error;
}
ret = sd_command(SD_STOP_TRANSMISSION, 0, NULL, SDICMD_RES_TYPE1);
if (ret < 0)
+ {
+ sd_msg = "stop_error";
goto sd_write_error;
+ }
ret = sd_wait_for_state(SD_TRAN, EC_TRAN_WRITE_EXIT);
if (ret < 0)
+ {
+ sd_msg = "wait_error_2";
goto sd_write_error;
+ }
while (1)
{
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment