X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fdrv%2Fsd.h;h=813e65a7124c15416be948b25f15d1533cf285b3;hb=5579f0a02cd782e3df7849e2f84640bd1160e232;hp=3a8484fbb473cbae343fcf4c46f6affd47742ed7;hpb=f57ced5005f3378b0ba52cce00b14a7976363ae3;p=bertos.git diff --git a/bertos/drv/sd.h b/bertos/drv/sd.h index 3a8484fb..813e65a7 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,17 +81,22 @@ typedef struct SDcsd write_misalign:1; } SDcsd; -int sd_decode_csd(SDcsd *csd, uint32_t *resp, size_t len); -void sd_dump_csd(SDcsd *csd); -void sd_decode_cid(SDcid *cid, uint32_t *resp, size_t len); -void sd_dump_cid(SDcid *cid); -void sd_send_init(void); -void sd_go_idle(void); -int sd_send_if_cond(void); -int sd_send_app_op_cond(void); -int sd_get_cid(uint32_t *resp, size_t len); -int sd_get_csd(uint32_t *resp, size_t len); -int sd_app_status(void); +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) + +#define SD_SEND_CID_RCA 0 +#define SD_SEND_ALL_CID BV(0) + #endif @@ -101,15 +107,67 @@ int sd_app_status(void); */ typedef struct Sd { + KBlock b; ///< KBlock base class KFile *ch; ///< SPI communication channel uint16_t r1; ///< Last status data received from SD uint16_t tranfer_len; ///< Lenght for the read/write commands, cached in order to increase speed. + + #if CPU_CM3_SAM3X8 + SDcid cid; + SDcsd csd; + SDssr ssr; + uint32_t addr; + uint32_t status; + #endif + } Sd; bool sd_initUnbuf(Sd *sd, KFile *ch); bool sd_initBuf(Sd *sd, KFile *ch); + +#if CPU_CM3_SAM3X8 + +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_getCid(Sd *sd, uint32_t addr, uint8_t flag); +int sd_getCsd(Sd *sd); +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); +void sd_setHightSpeed(Sd *sd); +int sd_readSingleBlock(Sd *sd, size_t index, uint32_t *buf, size_t words); + + +INLINE int sd_setBus4bit(Sd *sd) +{ + return sd_setBusWidth(sd, 4); +} + +INLINE int sd_setBus1bit(Sd *sd) +{ + return sd_setBusWidth(sd, 1); +} + +#endif + + #if CONFIG_SD_OLD_INIT #if !(ARCH & ARCH_NIGHTTEST) #warning "Deprecated: this API will be removed in the next major release," @@ -161,3 +219,4 @@ INLINE Sd *SD_CAST(KBlock *b) } #endif /* DRV_SD_H */ +