📄 mmc_sd.i
字号:
extern __declspec(__nothrow) __pure ldiv_t ldiv(long int , long int );
extern __declspec(__nothrow) __pure __int64 llabs(__int64 );
extern __declspec(__nothrow) __pure lldiv_t lldiv(__int64 , __int64 );
#line 570 "C:\\Keil\\ARM\\RV31\\INC\\stdlib.h"
typedef struct __sdiv32by16 { int quot, rem; } __sdiv32by16;
typedef struct __udiv32by16 { unsigned int quot, rem; } __udiv32by16;
typedef struct __sdiv64by32 { int rem, quot; } __sdiv64by32;
__value_in_regs extern __declspec(__nothrow) __pure __sdiv32by16 __rt_sdiv32by16(
int ,
short int );
__value_in_regs extern __declspec(__nothrow) __pure __udiv32by16 __rt_udiv32by16(
unsigned int ,
unsigned short );
__value_in_regs extern __declspec(__nothrow) __pure __sdiv64by32 __rt_sdiv64by32(
int , unsigned int ,
int );
extern __declspec(__nothrow) unsigned int __fp_status(unsigned int , unsigned int );
extern __declspec(__nothrow) int mblen(const char * , size_t );
extern __declspec(__nothrow) int mbtowc(wchar_t * __restrict ,
const char * __restrict , size_t );
extern __declspec(__nothrow) int wctomb(char * , wchar_t );
extern __declspec(__nothrow) size_t mbstowcs(wchar_t * __restrict ,
const char * __restrict , size_t );
extern __declspec(__nothrow) size_t wcstombs(char * __restrict ,
const wchar_t * __restrict , size_t );
extern __declspec(__nothrow) void __use_realtime_heap(void);
extern __declspec(__nothrow) void __use_realtime_division(void);
extern __declspec(__nothrow) void __use_two_region_memory(void);
extern __declspec(__nothrow) void __use_no_heap(void);
extern __declspec(__nothrow) void __use_no_heap_region(void);
extern __declspec(__nothrow) char const *__C_library_version_string(void);
extern __declspec(__nothrow) int __C_library_version_number(void);
#line 807 "C:\\Keil\\ARM\\RV31\\INC\\stdlib.h"
#line 10 "global.h"
#line 1 "C:\\Keil\\ARM\\RV31\\INC\\setjmp.h"
#line 38 "C:\\Keil\\ARM\\RV31\\INC\\setjmp.h"
typedef __int64 jmp_buf[48];
extern const int __aeabi_JMP_BUF_SIZE;
extern __declspec(__nothrow) int setjmp(jmp_buf );
extern __declspec(__nothrow) __declspec(__noreturn) void longjmp(jmp_buf , int );
#line 101 "C:\\Keil\\ARM\\RV31\\INC\\setjmp.h"
#line 11 "global.h"
#line 1 "C:\\Keil\\ARM\\RV31\\INC\\rt_misc.h"
extern void _getenv_init(void);
extern void _clock_init(void);
extern void *__user_libspace(void);
struct __argc_argv {
int argc;
char **argv;
int r2, r3;
};
extern __value_in_regs struct __argc_argv
__rt_lib_init(unsigned , unsigned );
__value_in_regs struct __argc_argv __ARM_get_argv(void * );
extern void __rt_lib_shutdown(void);
extern void __rt_exit(int );
struct __initial_stackheap {
unsigned heap_base;
unsigned stack_base;
unsigned heap_limit;
unsigned stack_limit;
};
extern __value_in_regs struct __initial_stackheap
__user_initial_stackheap(unsigned , unsigned ,
unsigned , unsigned );
struct __heap_extent {
unsigned base, range;
};
extern __value_in_regs struct __heap_extent
__user_heap_extent(unsigned , unsigned );
struct __stack_slop {
unsigned always, cleanup;
};
extern __value_in_regs struct __stack_slop
__user_stack_slop(unsigned , unsigned );
extern unsigned __user_heap_extend(int ,
void ** ,
unsigned );
int __raise(int , int );
int __default_signal_handler(int , int );
void __rt_raise(int , int );
#line 12 "global.h"
#line 37 "global.h"
extern unsigned short get16(unsigned char * addr);
extern unsigned short get16_big(unsigned char * addr);
extern unsigned short get16_little(unsigned char * addr);
extern unsigned int get32(unsigned char * addr);
extern unsigned int get32_big(unsigned char * addr);
extern unsigned int get32_little(unsigned char * addr);
extern void put16(unsigned char * addr, unsigned short val);
extern void put16_big(unsigned char * addr, unsigned short val);
extern void put16_little(unsigned char * addr, unsigned short val);
extern void put32(unsigned char * addr, unsigned int val);
extern void put32_big(unsigned char * addr, unsigned int val);
extern void put32_little(unsigned char * addr, unsigned int val);
extern unsigned short swap16(unsigned short val);
extern unsigned int swap32(unsigned int val);
void dump_memory(unsigned char * addr, unsigned int length);
void soft_delay_ms(unsigned int t);
#line 31 "MMC_SD.h"
#line 41 "MMC_SD.h"
#line 65 "MMC_SD.h"
unsigned char MMC_SD_Init(void);
unsigned char MMC_SD_ReadSingleBlock(unsigned int sector, unsigned char* buffer);
unsigned char MMC_SD_WriteSingleBlock(unsigned int sector, unsigned char* buffer);
unsigned int MMC_SD_ReadCapacity(void);
#line 27 "MMC_SD.c"
static unsigned char address_mode=0;
void SPI_Low(void)
{
(*((volatile unsigned long *) 0xE0068010)) = 128;
#line 51 "MMC_SD.c"
}
void SPI_High(void)
{
(*((volatile unsigned long *) 0xE0068010)) = 4;
#line 67 "MMC_SD.c"
}
unsigned char SPI_WriteByte(unsigned char val)
{
(*((volatile unsigned long *) 0xE0068008)) = val;
while( ((*((volatile unsigned long *) 0xE006800C)) & 0x01) == 0 );
return((*((volatile unsigned long *) 0xE0068008)));
#line 88 "MMC_SD.c"
}
unsigned char MMC_SD_SendCommand(unsigned char cmd, unsigned int arg)
{
unsigned char r1;
unsigned short retry=0;
SPI_WriteByte(0xff);
SPI_WriteByte(0xff);
(*((volatile unsigned long *) 0xE002800C)) |= (0x01 << 21);
SPI_WriteByte(cmd | 0x40);
SPI_WriteByte(arg>>24);
SPI_WriteByte(arg>>16);
SPI_WriteByte(arg>>8);
SPI_WriteByte(arg);
SPI_WriteByte(0x95);
while((r1 = SPI_WriteByte(0xff)) == 0xff)
if(retry++ > 8000) break;
(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);
SPI_WriteByte(0xff);
return r1;
}
unsigned char MMC_SD_SendCommandCRC(unsigned char cmd, unsigned int arg, unsigned char crc)
{
unsigned char r1;
unsigned short retry=0;
SPI_WriteByte(0xff);
SPI_WriteByte(0xff);
(*((volatile unsigned long *) 0xE002800C)) |= (0x01 << 21);
SPI_WriteByte(cmd | 0x40);
SPI_WriteByte(arg>>24);
SPI_WriteByte(arg>>16);
SPI_WriteByte(arg>>8);
SPI_WriteByte(arg);
SPI_WriteByte(crc);
while((r1 = SPI_WriteByte(0xff)) == 0xff)
if(retry++ > 8000) break;
(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);
SPI_WriteByte(0xff);
return r1;
}
unsigned char MMC_SD_SendCommandCRC_NoDeassert(unsigned char cmd, unsigned int arg, unsigned char crc)
{
unsigned char r1;
unsigned short retry=0;
SPI_WriteByte(0xff);
SPI_WriteByte(0xff);
(*((volatile unsigned long *) 0xE002800C)) |= (0x01 << 21);
SPI_WriteByte(cmd | 0x40);
SPI_WriteByte(arg>>24);
SPI_WriteByte(arg>>16);
SPI_WriteByte(arg>>8);
SPI_WriteByte(arg);
SPI_WriteByte(crc);
while((r1 = SPI_WriteByte(0xff)) == 0xff)
if(retry++ > 8000) break;
return r1;
}
unsigned char MMC_SD_Init(void)
{
unsigned char i;
unsigned short retry = 0;
unsigned char r1 = 0;
unsigned char buffer[4];
(*((volatile unsigned long *) 0xE002C004)) &= ~(0x03 << 10);
(*((volatile unsigned long *) 0xE0028008)) |= (0x01 << 21);
(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);
(*((volatile unsigned long *) 0xE002C004)) &= ~((0x01 << 2) + (0x03 << 4) + (0x03 << 6));
(*((volatile unsigned long *) 0xE002C004)) |= (0x02 << 2) + (0x02 << 4) + (0x02 << 6);
(*((volatile unsigned long *) 0xE0068000)) = (0x00 << 8) |
(0x00 << 7) |
(0x00 << 6) |
(0x00 << 4) |
(0x07 << 0);
(*((volatile unsigned long *) 0xE0068004)) = (0x00 << 3) |
(0x00 << 2) |
(0x01 << 1) |
(0x00 << 0);
(*((volatile unsigned long *) 0xE0068014)) = 0x00;
(*((volatile unsigned long *) 0xE0068020)) = 0x00;
SPI_Low();
soft_delay_ms(100);
do
{
for(i=0;i<40;i++) SPI_WriteByte(0xff);
r1 = MMC_SD_SendCommandCRC(0, 0, 0x95);
retry++;
if(retry>8000) return 1;
} while(r1 != 0x01);
r1 = MMC_SD_SendCommandCRC_NoDeassert(8, 0x1aa, 0x87);
if(r1 == 0x05)
{
(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);
SPI_WriteByte(0xff);
SPI_WriteByte(0xff);
printf(("\r\nVersion 1"));
retry = 0;
do
{
r1 = MMC_SD_SendCommandCRC(55, 0, 0);
if(r1!=0x01)
{
printf(("\r\n CMD55 r1=%x "),r1);
return r1;
}
retry ++;
r1 = MMC_SD_SendCommandCRC(41, 0, 0);
}while((r1!=0)&&(retry<8000));
if (retry==8000)
{
printf(("\r\nTake it as MMC card "));
retry = 0;
do
{
r1 = MMC_SD_SendCommand(1, 0);
retry++;
if(retry>8000)
{
printf(("\r\n Time out "));
return 1;
}
} while(r1);
}
SPI_High();
soft_delay_ms(1000);
r1 = MMC_SD_SendCommand(59, 0);
if(r1 != 0)
{
printf(("\r\nDisabel CRC error"));
return r1;
}
r1 = MMC_SD_SendCommand(16, 512);
if(r1 != 0)
{
printf(("\r\nSet sector size error"));
return r1;
}
address_mode = 0;
}
else if(r1 == 0x01)
{
for(i=0;i<3;i++){buffer[i]=SPI_WriteByte(0xff);printf("%x ",buffer[i]);}
(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);
SPI_WriteByte(0xff);
printf(("\r\nVersion 2"));
retry = 0;
do
{
r1 = MMC_SD_SendCommandCRC(55, 0, 0);
if(r1!=0x01)
{
return r1;
}
r1 = MMC_SD_SendCommandCRC(41, 0x40000000, 0);
}while(r1!=0);
if(MMC_SD_SendCommandCRC_NoDeassert(58, 0, 0)!=0x00)goto exit1;
for(i=0;i<4;i++)buffer[i]=SPI_WriteByte(0xff);
if(buffer[0]&(1<<6))
address_mode = 1;
else
address_mode = 0;
(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);
SPI_WriteByte(0xff);
SPI_High();
}
else
{
printf(("\r\nnot supported card"));
}
printf(("\r\naddress mode = %d"),address_mode);
return 0;
exit1:
printf(("\r\nexit 1 r1=%x "),r1);
(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);
SPI_WriteByte(0xff);
return 1;
}
unsigned char MMC_SD_ReadSingleBlock(unsigned int sector, unsigned char* buffer)
{
unsigned char r1;
unsigned short i;
unsigned int retry=0;
r1 = MMC_SD_SendCommandCRC_NoDeassert(17, address_mode?sector:sector<<9,0);
if(r1 != 0x00)
return r1;
(*((volatile unsigned long *) 0xE002800C)) |= (0x01 << 21);
while(SPI_WriteByte(0xff) != 0xfe)if(retry++ > 0x6ffff){(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);return 1;}
for(i=0; i<512; i++)
{
*buffer++ = SPI_WriteByte(0xff);
}
SPI_WriteByte(0xff);
SPI_WriteByte(0xff);
(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);
SPI_WriteByte(0xff);
return 0;
}
unsigned char MMC_SD_WriteSingleBlock(unsigned int sector, unsigned char* buffer)
{
unsigned char r1;
unsigned short i;
unsigned int retry=0;
r1 = MMC_SD_SendCommandCRC_NoDeassert(24, address_mode?sector:sector<<9,0);
if(r1 != 0x00)
return r1;
(*((volatile unsigned long *) 0xE002800C)) |= (0x01 << 21);
SPI_WriteByte(0xff);
SPI_WriteByte(0xff);
SPI_WriteByte(0xff);
SPI_WriteByte(0xfe);
for(i=0; i<512; i++)
{
SPI_WriteByte(*buffer++);
}
SPI_WriteByte(0xff);
SPI_WriteByte(0xff);
r1 = SPI_WriteByte(0xff);
if( (r1&0x1f) != 0x05)
{
(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);
return r1;
}
while(!SPI_WriteByte(0xff))if(retry++ > 0x6ffff){(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);return 1;}
(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);
SPI_WriteByte(0xff);
return 0;
}
unsigned int MMC_SD_ReadCapacity()
{
unsigned char r1;
unsigned short i;
unsigned short temp;
unsigned char buffer[16];
unsigned int Capacity;
unsigned int retry =0;
r1 = MMC_SD_SendCommandCRC_NoDeassert(9, 0,0);
if(r1 != 0x00)
return r1;
(*((volatile unsigned long *) 0xE002800C)) |= (0x01 << 21);
while(SPI_WriteByte(0xff) != 0xfe)if(retry++ > 0x6ffff){(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);return 1;}
for(i=0;i<16;i++)
{
buffer[i]=SPI_WriteByte(0xff);
}
SPI_WriteByte(0xff);
SPI_WriteByte(0xff);
SPI_WriteByte(0xff);
(*((volatile unsigned long *) 0xE0028004)) |= (0x01 << 21);
SPI_WriteByte(0xff);
if((buffer[0]&0xc0)==0x40)
{
Capacity = (((unsigned int)buffer[8])<<8 + (unsigned int)buffer[9] +1)*(unsigned int)1024;
return Capacity;
}
i = buffer[6]&0x03;
i<<=8;
i += buffer[7];
i<<=2;
i += ((buffer[8]&0xc0)>>6);
r1 = buffer[9]&0x03;
r1<<=1;
r1 += ((buffer[10]&0x80)>>7);
r1+=2;
temp = 1;
while(r1)
{
temp*=2;
r1--;
}
Capacity = ((unsigned int)(i+1))*((unsigned int)temp);
i = buffer[5]&0x0f;
temp = 1;
while(i)
{
temp*=2;
i--;
}
Capacity *= (unsigned int)temp;
return Capacity/512;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -