123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- #ifndef SDCARD_H
- #define SDCARD_H
- #include "common.h"
- #include "io.h"
- #include "irq.h"
- #include "ff.h"
- #include "diskio.h"
- #define SECTOR_SHIFT 9
- #define SECTOR_SIZE (1UL << SECTOR_SHIFT)
- struct sdcard_csd {
- uint32_t raw[4];
- };
- struct sdcard_cid {
- uint32_t raw[4];
- };
- struct sdcard_info {
- DSTATUS status; /* Physical status */
- DSTATUS fsstatus; /* Filesystem visible status */
- int8_t card_type;
- unsigned long lbasize;
- uint32_t if_cond;
- uint32_t ocr;
- struct sdcard_csd csd;
- struct sdcard_cid cid;
- };
- extern struct sdcard_info sdc;
- typedef unsigned int sector_t;
- extern int sdcard_read_sectors(void *, sector_t, int);
- extern int sdcard_write_sectors(const void *, sector_t, int);
- extern void sdcard_reset(void);
- extern DSTATUS sdcard_init(void);
- extern DSTATUS sdcard_present_poll(void);
- static inline void sd_set_mode(uint8_t divisor, bool cs)
- {
- waitfor(SDCARD_IRQ);
- SDCARD_CTL_SPEED = (divisor - 1) | (cs << 7);
- }
- /* Read/write SD card and start transaction */
- enum sd_data_flags {
- SD_B0 = 0x00, /* Byte offset 0 */
- SD_B1 = 0x01, /* Byte offset 1 */
- SD_B2 = 0x02, /* Byte offset 2 */
- SD_B3 = 0x03, /* Byte offset 3 */
- SD_GO8 = 0x04, /* Start 8-bit transaction */
- SD_GO16 = 0x08, /* Start 16-bit transaction */
- SD_GO32 = 0x0c, /* Start 32-bit transaction */
- SD_BE = 0x10, /* Bigendian data */
- SD_DATA = 0x20, /* Data register access (assumed) */
- SD_CLEARCRC = 0x40 /* Clear CRC registers */
- };
- static inline void sd_writeb(uint8_t d, enum sd_data_flags flags)
- {
- waitfor(SDCARD_IRQ);
- flags ^= (flags & SD_BE) ? 3 : 0;
- *(volatile uint8_t *)IODEVA(SDCARD,0,flags | SD_DATA) = d;
- }
- static inline void sd_writeh(uint16_t d, enum sd_data_flags flags)
- {
- waitfor(SDCARD_IRQ);
- flags ^= (flags & SD_BE) ? 2 : 0;
- *(volatile uint16_t *)IODEVA(SDCARD,0,flags | SD_DATA) = d;
- }
- static inline void sd_writel(uint32_t d, enum sd_data_flags flags)
- {
- waitfor(SDCARD_IRQ);
- *(volatile uint32_t *)IODEVA(SDCARD,0,flags | SD_DATA) = d;
- }
- static inline uint8_t sd_readb(enum sd_data_flags flags)
- {
- waitfor(SDCARD_IRQ);
- flags ^= (flags & SD_BE) ? 0 : 3;
- return *(volatile uint8_t *)IODEVA(SDCARD,0,flags | SD_DATA);
- }
- static inline uint16_t sd_readh(enum sd_data_flags flags)
- {
- waitfor(SDCARD_IRQ);
- flags ^= (flags & SD_BE) ? 0 : 2;
- return *(volatile uint16_t *)IODEVA(SDCARD,0,flags | SD_DATA);
- }
- static inline uint32_t sd_readl(enum sd_data_flags flags)
- {
- waitfor(SDCARD_IRQ);
- return *(volatile uint32_t *)IODEVA(SDCARD,0,flags | SD_DATA);
- }
- static inline uint8_t sd_crc7_rd(void)
- {
- waitfor(SDCARD_IRQ);
- return SDCARD_CRC7_RD;
- }
- static inline uint8_t sd_crc7_wr(void)
- {
- waitfor(SDCARD_IRQ);
- return SDCARD_CRC7_WR;
- }
- static inline uint16_t sd_crc16_rd(void)
- {
- waitfor(SDCARD_IRQ);
- return SDCARD_CRC16_RD;
- }
- static inline uint16_t sd_crc16_wr(void)
- {
- waitfor(SDCARD_IRQ);
- return SDCARD_CRC16_WR;
- }
- #endif /* SDCARD_H */
|