X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fdrv%2Fsd.h;h=19628691e82ab9e57c7aa7efa72571153c448836;hb=7f6d545066c243a9f38c77dff806d7f91d1893af;hp=d706038beed1ac31830f3c3128608917ec1bd0ab;hpb=00c781cc0031e8a1498deba8a6a8e356c923fbe8;p=bertos.git diff --git a/bertos/drv/sd.h b/bertos/drv/sd.h index d706038b..19628691 100644 --- a/bertos/drv/sd.h +++ b/bertos/drv/sd.h @@ -70,6 +70,7 @@ typedef struct SDcsd uint8_t ccc; ///< Card command classes uint32_t erase_size; ///< The size of an erasable sector, in write block len uint32_t capacity; ///< Card size in byte + uint32_t max_data_rate; ///< Step rate, usec uint32_t blk_len; ///< Block data size len in byte uint32_t blk_num; ///< Number of block in card uint32_t write_blk_bits; ///< Max write block length in bits @@ -80,6 +81,15 @@ typedef struct SDcsd write_misalign:1; } SDcsd; +typedef struct SDssr +{ + uint8_t bus_width; + uint8_t card_type; + uint8_t speed_class; + uint8_t au_size; + uint8_t erase_size; +} SDssr; + #define SD_READY_FOR_DATA BV(8) #define SD_CARD_IS_LOCKED BV(25) @@ -106,6 +116,7 @@ typedef struct Sd #if CPU_CM3_SAM3X8 SDcid cid; SDcsd csd; + SDssr ssr; uint32_t addr; uint32_t status; #endif @@ -120,11 +131,12 @@ bool sd_initBuf(Sd *sd, KFile *ch); void sd_dumpCsd(Sd *sd); void sd_dumpCid(Sd *sd); +void sd_dumpSsr(Sd *sd); void sd_sendInit(void); void sd_goIdle(void); -int sd_sendIfCond(void); -int sd_sendAppOpCond(void); +int sd_sendIfCond(Sd *sd); +int sd_sendAppOpCond(Sd *sd); int sd_getCid(Sd *sd, uint32_t addr, uint8_t flag); int sd_getCsd(Sd *sd); @@ -133,22 +145,25 @@ int sd_getSrc(Sd *sd); int sd_appStatus(Sd *sd); int sd_getRelativeAddr(Sd *sd); +int sd_getStatus(Sd *sd, uint32_t *buf, size_t words); + int sd_selectCard(Sd *sd); int sd_deSelectCard(Sd *sd); int sd_setBusWidth(Sd *sd, size_t len); int sd_set_BlockLen(Sd *sd, size_t len); - -int sd_readSingleBlock(Sd *sd, size_t index, void *_buf, size_t len); +void sd_setHightSpeed(Sd *sd); +int sd_readSingleBlock(Sd *sd, size_t index, uint32_t *buf, size_t words); +int sd_writeSingleBlock(Sd *sd, size_t index, uint32_t *buf, size_t words); INLINE int sd_setBus4bit(Sd *sd) { - return sd_setBusWidth(sd, 1); + return sd_setBusWidth(sd, 4); } INLINE int sd_setBus1bit(Sd *sd) { - return sd_setBusWidth(sd, 0); + return sd_setBusWidth(sd, 1); } #endif