changeset 38:9e888708f33d

sd test code
author Matt Johnston <matt@ucc.asn.au>
date Thu, 27 Jun 2013 11:24:56 +0000
parents c6f77df67dde
children 5a7a0ef8a958
files main.c sd_raw.c sd_raw.h sd_raw_config.h
diffstat 4 files changed, 92 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/main.c	Thu Jun 27 14:05:10 2013 +0800
+++ b/main.c	Thu Jun 27 11:24:56 2013 +0000
@@ -296,22 +296,65 @@
     return fat_open_file(fs, &file_entry);
 }
 
+static uint32_t sd_serial = 0;
+static char conf_start[30];
+
 static void
 hmac_file(const char* fn)
 {
-    sd_raw_init();
+    uint8_t res;
     struct partition_struct* partition = partition_open(sd_raw_read, sd_raw_read_interval, 0, 0, 0);
+
+    if (!partition)
+    {
+        sprintf(conf_start, "part");
+        return;
+    }
+
     struct fat_fs_struct* fs = fat_open(partition);
+    if (!fs)
+    {
+        sprintf(conf_start, "bad fs");
+        return;
+    }
     struct fat_dir_entry_struct directory;
-    fat_get_dir_entry_of_path(fs, "/", &directory);
+    res = fat_get_dir_entry_of_path(fs, "/", &directory);
+    if (!res)
+    {
+        sprintf(conf_start, "bad direc");
+        return;
+    }
 
     struct sd_raw_info disk_info;
     sd_raw_get_info(&disk_info);
-    printf("diskinfo size %d", disk_info.capacity);
+    sd_serial = disk_info.serial;
 
     struct fat_dir_struct* dd = fat_open_dir(fs, &directory);
-    struct fat_file_struct* fd = open_file_in_dir(fs, dd, "fn");
+    if (!dd)
+    {
+        sprintf(conf_start, "bad dd");
+        return;
+    }
+    struct fat_file_struct* fd = open_file_in_dir(fs, dd, fn);
+    if (!fd)
+    {
+        sprintf(conf_start, "bad fd");
+        return;
+    }
 
+    fat_read_file(fd, conf_start, sizeof(conf_start)-1);
+    conf_start[sizeof(conf_start)-1] = '\0';
+
+    fat_close_file(fd);
+    fd = NULL;
+    fat_close_dir(dd);
+    dd = NULL;
+    fat_close(fs);
+    fs = NULL;
+    partition_close(partition);
+    partition = NULL;
+
+#if 0
     char c = 0;
     char buf[512];
     for (int i = 0; i < 10; i++)
@@ -320,6 +363,24 @@
         c ^= buf[0];
     }
     printf("total %d\n", c);
+#endif
+}
+
+
+static void
+cmd_testsd(const char *param)
+{
+    PORT_PI_RESET &= ~_BV(PIN_PI_RESET);
+    DDR_PI_RESET |= _BV(PIN_PI_RESET);
+    _delay_ms(200);
+
+    sd_raw_init();
+    hmac_file(param);
+    sd_raw_deinit();
+
+    _delay_ms(200);
+
+    DDR_PI_RESET &= ~_BV(PIN_PI_RESET);	
 }
 
 static void cmd_reset() __attribute__ ((noreturn));
@@ -379,13 +440,17 @@
         "oneshot (%lu)\n"
         "uptime %lu rem %u\n"
         "boot normal %hhu\n"
+        "disk serial %lx\n"
+        "disk start '%s'\n"
         ),
         watchdog_long_limit, cur_watchdog_long, long_reboot_mode,
         watchdog_short_limit, cur_watchdog_short,
         newboot_limit, cur_newboot,
         cur_oneshot,
         t.ticks, t.rem,
-        boot_normal_status);
+        boot_normal_status,
+        sd_serial,
+        conf_start);
 }
 
 static void
@@ -945,6 +1010,7 @@
     LOCAL_PSTR(status);
     LOCAL_PSTR(random);
     LOCAL_PSTR(prog);
+    LOCAL_PSTR(testsd);
     LOCAL_HELP(set_params, "<long_limit> <short_limit> <newboot_limit>");
     LOCAL_HELP(set_key, "20_byte_hex>");
     LOCAL_HELP(oneshot, "<timeout>");
@@ -952,6 +1018,7 @@
     LOCAL_HELP(random, "<admux> <nbytes>");
     LOCAL_HELP(hmac, "<key_index> <20_byte_hex_data>");
     LOCAL_HELP(decrypt, "<key_index> <20_byte_hmac|16_byte_aes_block>");
+    LOCAL_HELP(testsd, "<filename>");
 
     static const struct handler {
         PGM_P name;
@@ -973,6 +1040,7 @@
         {random_str, cmd_random, random_help},
         {vcc_str, cmd_vcc, NULL},
         {reset_str, cmd_reset, NULL},
+        {testsd_str, cmd_testsd, testsd_help},
         {prog_str, cmd_prog, prog_help},
     };
 
--- a/sd_raw.c	Thu Jun 27 14:05:10 2013 +0800
+++ b/sd_raw.c	Thu Jun 27 11:24:56 2013 +0000
@@ -330,6 +330,14 @@
     return 1;
 }
 
+void 
+sd_raw_deinit(void)
+{
+    configure_pin_mosi();
+    configure_pin_sck();
+    configure_pin_ss();
+}
+
 /**
  * \ingroup sd_raw
  * Checks wether a memory card is located in the slot.
--- a/sd_raw.h	Thu Jun 27 14:05:10 2013 +0800
+++ b/sd_raw.h	Thu Jun 27 11:24:56 2013 +0000
@@ -125,6 +125,7 @@
 typedef uintptr_t (*sd_raw_write_interval_handler_t)(uint8_t* buffer, offset_t offset, void* p);
 
 uint8_t sd_raw_init();
+void sd_raw_deinit(void);
 uint8_t sd_raw_available();
 uint8_t sd_raw_locked();
 
--- a/sd_raw_config.h	Thu Jun 27 14:05:10 2013 +0800
+++ b/sd_raw_config.h	Thu Jun 27 11:24:56 2013 +0000
@@ -85,6 +85,10 @@
     #define configure_pin_ss() DDRB |= (1 << DDB2)
     #define configure_pin_miso() DDRB &= ~(1 << DDB4)
 
+    #define deonfigure_pin_mosi() DDRB &= ~(1 << DDB3)
+    #define deonfigure_pin_sck() DDRB &= ~(1 << DDB5)
+    #define deonfigure_pin_ss() DDRB &= ~(1 << DDB2)
+
     #define select_card() PORTB &= ~(1 << PORTB2)
     #define unselect_card() PORTB |= (1 << PORTB2)
 #elif defined(__AVR_ATmega16__) || \
@@ -110,11 +114,13 @@
     #error "no sd/mmc pin mapping available!"
 #endif
 
-#define configure_pin_available() DDRC &= ~(1 << DDC4)
-#define configure_pin_locked() DDRC &= ~(1 << DDC5)
+#define configure_pin_available() DDRC &= ~(1 << DDC3)
+//#define configure_pin_locked() DDRC &= ~(1 << DDC5)
+#define configure_pin_locked() do {} while (0)
 
-#define get_pin_available() (PINC & (1 << PINC4))
-#define get_pin_locked() (PINC & (1 << PINC5))
+#define get_pin_available() (PINC & (1 << PINC3))
+//#define get_pin_locked() (PINC & (1 << PINC5))
+#define get_pin_locked() 0
 
 #if SD_RAW_SDHC
     typedef uint64_t offset_t;