/* This file is part of JOP, the Java Optimized Processor see <http://www.jopdesign.com/> Copyright (C) 2009, Jens Kager, Fritz Praus Copyright (C) 2008-2009, Rainhard Raschbauer This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package fat; import com.jopdesign.sys.*; public class FatMmc implements FatLowLevel { public int Init() { int x = 0; Native.wrMem(0x01, Const.WB_SPI + 1); // spi core reset Native.wrMem(0x04, Const.WB_SPI + 0x0b); // SPI_CLK_DEL_REG Native.wrMem(0x01, Const.WB_SPI + 2); // TRANS_TYPE = INIT_SD Native.wrMem(0x01, Const.WB_SPI + 3); // TRANS_CTRL_REG = // SPI_TRANS_START do { x = Native.rdMem(Const.WB_SPI + 4); } while ((x & 0x01) == 1); // TRANS_STS_REG==TRANS_BUSY // TRANS_ERROR_REG[5:4] == 00 x = Native.rdMem(Const.WB_SPI + 5); if ((x & 0xFF) == 0) { return 0x00; } // System.out.print("ERROR mmc_init() = "); // System.out.println(x); return x; } public void Flush() { // No buffered blocks for MMC, so do nothing } public int ReadSector(int addr, int[] buffer) { int i; Native.wrMem(0, Const.WB_SPI + 0x07); // SD_ADDR_7_0 Native.wrMem((addr << 1) & 0xfe, Const.WB_SPI + 0x08); // SD_ADDR_15_8 Native.wrMem((addr >> 7) & 0xff, Const.WB_SPI + 0x09); // SD_ADDR_23_16 Native.wrMem((addr >> 15) & 0xff, Const.WB_SPI + 0x0a); // SD_ADDR_31_24 Native.wrMem(0x02, Const.WB_SPI + 2); // TRANS_TYPE = RW_READ_SD_BLOCK Native.wrMem(0x01, Const.WB_SPI + 3); // TRANS_CTRL_REG = // SPI_TRANS_START while ((Native.rdMem(Const.WB_SPI + 4) & 0x01) == 1) ; // TRANS_STS_REG==TRANS_BUSY // TRANS_ERROR_REG[5:4] == 00 if ((Native.rdMem(Const.WB_SPI + 5) & 0x3F) == 0) { for (i = 0; i < 512; i++) { buffer[i] = Native.rdMem(Const.WB_SPI + 0x10) & 0xFF; //RX_FIFO_DATA_REG } } else { // System.out.println("ERROR mmc_read_sector"); return 1; } Native.wrMem(0xFF, Const.WB_SPI + 0x14); // Clear rx fifo return 0; } public int WriteSector(int addr, int[] buffer) { int i; Native.wrMem(0x01, Const.WB_SPI + 0x24); // RX_FIFO_DATA_REG for (i = 0; i < 512; i++) { Native.wrMem(buffer[i], Const.WB_SPI + 0x20); // TX_FIFO_DATA_REG } Native.wrMem(0, Const.WB_SPI + 0x07); // SD_ADDR_7_0 Native.wrMem((addr << 1) & 0xfe, Const.WB_SPI + 0x08); // SD_ADDR_15_8 Native.wrMem((addr >> 7) & 0xff, Const.WB_SPI + 0x09); // SD_ADDR_23_16 Native.wrMem((addr >> 15) & 0xff, Const.WB_SPI + 0x0a); // SD_ADDR_31_24 Native.wrMem(0x03, Const.WB_SPI + 2); // TRANS_TYPE = RW_WRITE_SD_BLOCK Native.wrMem(0x01, Const.WB_SPI + 3); // TRANS_CTRL_REG = SPI_TRANS_START while ((Native.rdMem(Const.WB_SPI + 4) & 0x01) == 1) ; // TRANS_STS_REG==TRANS_BUSY // TRANS_ERROR_REG[5:4] == 00 i = Native.rdMem(Const.WB_SPI + 5); if (i != 0) { // System.out.println("ERROR mmc_write_sector"); return 1; } return 0; } public void ClearMedium() { int[] zeros = new int[512]; // FIXME: Use correct number of sectors for (int sector = 0; sector < 150; sector++) { if (sector % 100 == 0) System.out.println("Clearing sector " + sector); WriteSector(sector, zeros); } } public int GetTotalBytes() { // TODO how to read sd card size? return 32*1024*1024; // assuming 32MB for testing } }