// mmcbios.c /* Copyright Bitcraft Co.Ltd 2008.2.17 All rights reserved. */ // ルネサスシリアルペリフェラルインタフェース、チャネル0、RSPI0 を使った、SDカード制御BIOS // SH7262ピンと、SH7262基板、SDカードの接続 // SH2A SH2Apin CN3 SDcard 信号名 端子処理 // - - - 8 DAT1 4.7k pull up // PF12 127 36 7 DIN(DAT0) 4.7k pull up // - - - 6 GND // PF9 133 40 5 CLK // - - - 4 VCC // - - - 3 GND // PF11 129 37 2 CMD 4.7k pull up // PG20 98 33 1 DAT3(CS) 4.7k pull up // - - 9 DAT2 4.7k pull up // PJ1 61 31 Card Detect // PJ3 58 32 Write protect #include "sh7262.h" #include "monitor.h" int initmmc(int flg) { int i,ret; // SPI ポート0 の設定 *PFCR3 = 0x0003; *PFCR2 = 0x3330; // ポートG、G20 を出力に設定( MMC_CS ) SD CARD 1 PIN *PGIOR1 = 0x0010; // FFFE38D0 *PGDR1 = 0x0010; // FFFE38D4 output High. CS=High *SPPCR0 = 0; // FFFF8002 *SPSCR0 = 0; // FFFF8008 *SPDCR0 = 0x20; // FFFF800B byte *SPBFCR0 = 0xF0; // バッファークリア *SPBFCR0 = 0x30; *SPCMD0 = 0x0700; *SPCR0 = 0x08; // Master, 機能無効 ((volatile unsigned char *)(0xFFFF8000)) *SPBR0 = 0x3B; // 400kHz (48000000/400000)/2 - 1 ((volatile unsigned char *)(0xFFFF800A)) *SPCR0 = 0x48; // Master, 機能有効 // CSがHighでダミークロックを74個以上出す。 for(i=0;i<10;i++) { ret = mmcout(0xFF); if( ret == -1) return -1; } return ret; } // SDカード制御BIOSではないが、タイマーで時間待ち int waittim0(long count) // 21.3333333 μsec x n { long timeout; unsigned int ts,tc; ts = *CMCNT0; timeout = ((unsigned short)count * 2133);// 1回ループ0.01μ秒以上か? while(timeout--) { tc = *CMCNT0; if( ((tc - ts) & 0xFFFF) >= (unsigned int)count) break; } if(timeout == 0) return -1;// カウンタ CMCNT0は停止している return 1; } // SPI クロックを変更する void mmcclk(int c) { *SPCR0 = 0x08; // Master, 機能無効 ((volatile unsigned char *)(0xFFFF8000)) *SPBR0 = c; // 0x3b:400kHz 0:24MHz ((volatile unsigned char *)(0xFFFF800A)) *SPCR0 = 0x48; // Master, 機能有効 } // CSのLow、Highを設定 int mmccs(int c) { short s; if(c) { *PGDR1 = 0x0010; // FFFE38D4 output High. CS=High } else { *PGDR1 = 0x0000;// CS LOW } return c; } // SPI データ送信。0xFF送信で、受信になる。 int mmcout(int data) { int timeout,ret; *SPDR0 = (char)data; for(timeout=3000;timeout>0;timeout--) { if(*SPSR0 & 0x80) // SPRF 受信あり break; } ret = *SPDR0; if(timeout == 0) return -1; return ret; } // SPI モードでもCRCが必要なコマンド。CMD0, CMD8 unsigned char crc7c(unsigned char *cp,int n) { // X7 + X3 + 1 unsigned char crc; unsigned short data; int i,j; crc = 0; for(i=0;i