From 311dfa65d823ebb1448a12e9a24d09c7ca7a9e2a Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Wed, 16 Apr 2008 18:37:33 +0000 Subject: 2008-04-16 Matthieu Bucchianeri * ChangeLog, Makefile.am, README, bsp_specs, configure.ac, mk_libnds.sh, patch.libnds, preinstall.am, block/block.c, clock/clock.c, console/console.c, coproc/coproc.S, coproc/coproc.c, coproc/coproc.ld, dswifi/dswifi_license.txt, dswifi/makefile, dswifi/arm7/makefile, dswifi/arm7/source/wifi_arm7.c, dswifi/arm7/source/wifi_arm7.h, dswifi/arm9/makefile, dswifi/arm9/source/sgIP.c, dswifi/arm9/source/sgIP.h, dswifi/arm9/source/sgIP_ARP.c, dswifi/arm9/source/sgIP_ARP.h, dswifi/arm9/source/sgIP_Config.h, dswifi/arm9/source/sgIP_DHCP.c, dswifi/arm9/source/sgIP_DHCP.h, dswifi/arm9/source/sgIP_DNS.c, dswifi/arm9/source/sgIP_DNS.h, dswifi/arm9/source/sgIP_Hub.c, dswifi/arm9/source/sgIP_Hub.h, dswifi/arm9/source/sgIP_ICMP.c, dswifi/arm9/source/sgIP_ICMP.h, dswifi/arm9/source/sgIP_IP.c, dswifi/arm9/source/sgIP_IP.h, dswifi/arm9/source/sgIP_TCP.c, dswifi/arm9/source/sgIP_TCP.h, dswifi/arm9/source/sgIP_UDP.c, dswifi/arm9/source/sgIP_UDP.h, dswifi/arm9/source/sgIP_memblock.c, dswifi/arm9/source/sgIP_memblock.h, dswifi/arm9/source/sgIP_sockets.c, dswifi/arm9/source/sgIP_sockets.h, dswifi/arm9/source/wifi_arm9.c, dswifi/arm9/source/wifi_arm9.h, dswifi/common/source/dsregs.h, dswifi/common/source/spinlock.h, dswifi/common/source/spinlock.s, dswifi/common/source/wifi_shared.h, dswifi/include/dswifi7.h, dswifi/include/dswifi9.h, dswifi/include/dswifi_version.h, dswifi/include/netdb.h, dswifi/include/sgIP_errno.h, dswifi/include/netinet/in.h, fb/fb.c, fb/fb.h, include/bsp.h, include/my_ipc.h, include/tm27.h, include/types.h, include/sys/iosupport.h, irq/irq.c, irq/irq.h, libfat/gba/include/fat.h, libfat/include/fat.h, libfat/nds/include/fat.h, libfat/source/bit_ops.h, libfat/source/cache.c, libfat/source/cache.h, libfat/source/common.h, libfat/source/directory.c, libfat/source/directory.h, libfat/source/fatdir.c, libfat/source/fatdir.h, libfat/source/fatfile.c, libfat/source/fatfile.h, libfat/source/file_allocation_table.c, libfat/source/file_allocation_table.h, libfat/source/filetime.c, libfat/source/filetime.h, libfat/source/libfat.c, libfat/source/mem_allocate.h, libfat/source/partition.c, libfat/source/partition.h, libfat/source/disc_io/disc.c, libfat/source/disc_io/disc.h, libfat/source/disc_io/disc_io.h, libfat/source/disc_io/io_cf_common.c, libfat/source/disc_io/io_cf_common.h, libfat/source/disc_io/io_dldi.h, libfat/source/disc_io/io_dldi.s, libfat/source/disc_io/io_efa2.c, libfat/source/disc_io/io_efa2.h, libfat/source/disc_io/io_fcsr.c, libfat/source/disc_io/io_fcsr.h, libfat/source/disc_io/io_m3_common.c, libfat/source/disc_io/io_m3_common.h, libfat/source/disc_io/io_m3cf.c, libfat/source/disc_io/io_m3cf.h, libfat/source/disc_io/io_m3sd.c, libfat/source/disc_io/io_m3sd.h, libfat/source/disc_io/io_mpcf.c, libfat/source/disc_io/io_mpcf.h, libfat/source/disc_io/io_njsd.c, libfat/source/disc_io/io_njsd.h, libfat/source/disc_io/io_nmmc.c, libfat/source/disc_io/io_nmmc.h, libfat/source/disc_io/io_sc_common.c, libfat/source/disc_io/io_sc_common.h, libfat/source/disc_io/io_sccf.c, libfat/source/disc_io/io_sccf.h, libfat/source/disc_io/io_scsd.c, libfat/source/disc_io/io_scsd.h, libfat/source/disc_io/io_scsd_s.s, libfat/source/disc_io/io_sd_common.c, libfat/source/disc_io/io_sd_common.h, libnds/Makefile.arm7, libnds/Makefile.arm9, libnds/libnds_license.txt, libnds/basicARM7/source/defaultARM7.c, libnds/include/default_font_bin.h, libnds/include/gbfs.h, libnds/include/nds.h, libnds/include/nds/bios.h, libnds/include/nds/card.h, libnds/include/nds/dma.h, libnds/include/nds/interrupts.h, libnds/include/nds/ipc.h, libnds/include/nds/jtypes.h, libnds/include/nds/memory.h, libnds/include/nds/registers_alt.h, libnds/include/nds/reload.h, libnds/include/nds/system.h, libnds/include/nds/timers.h, libnds/include/nds/arm7/audio.h, libnds/include/nds/arm7/clock.h, libnds/include/nds/arm7/serial.h, libnds/include/nds/arm7/touch.h, libnds/include/nds/arm9/background.h, libnds/include/nds/arm9/boxtest.h, libnds/include/nds/arm9/cache.h, libnds/include/nds/arm9/console.h, libnds/include/nds/arm9/exceptions.h, libnds/include/nds/arm9/image.h, libnds/include/nds/arm9/input.h, libnds/include/nds/arm9/math.h, libnds/include/nds/arm9/ndsmotion.h, libnds/include/nds/arm9/pcx.h, libnds/include/nds/arm9/postest.h, libnds/include/nds/arm9/rumble.h, libnds/include/nds/arm9/sound.h, libnds/include/nds/arm9/sprite.h, libnds/include/nds/arm9/trig_lut.h, libnds/include/nds/arm9/video.h, libnds/include/nds/arm9/videoGL.h, libnds/source/arm7/audio.c, libnds/source/arm7/clock.c, libnds/source/arm7/microphone.c, libnds/source/arm7/spi.c, libnds/source/arm7/touch.c, libnds/source/arm7/userSettings.c, libnds/source/arm9/COS.bin, libnds/source/arm9/COS.s, libnds/source/arm9/SIN.bin, libnds/source/arm9/SIN.s, libnds/source/arm9/TAN.bin, libnds/source/arm9/TAN.s, libnds/source/arm9/boxtest.c, libnds/source/arm9/console.c, libnds/source/arm9/dcache.s, libnds/source/arm9/default_font.bin, libnds/source/arm9/default_font.s, libnds/source/arm9/exceptionHandler.S, libnds/source/arm9/exceptionHandler.s, libnds/source/arm9/exceptions.c, libnds/source/arm9/gurumeditation.c, libnds/source/arm9/icache.s, libnds/source/arm9/image.c, libnds/source/arm9/initSystem.c, libnds/source/arm9/keys.c, libnds/source/arm9/ndsmotion.c, libnds/source/arm9/pcx.c, libnds/source/arm9/rumble.c, libnds/source/arm9/sound.c, libnds/source/arm9/system.c, libnds/source/arm9/touch.c, libnds/source/arm9/video.c, libnds/source/arm9/videoGL.c, libnds/source/common/biosCalls.s, libnds/source/common/card.c, libnds/source/common/gbfs.c, libnds/source/common/interruptDispatcher.s, libnds/source/common/interrupts.c, rtc/rtc.c, sound/sound.c, sound/sound.h, start/start.S, startup/linkcmds, startup/start.c, timer/timer.c, tools/Makefile.am, tools/bin2s, tools/bin2s.c, tools/configure.ac, tools/runtest, tools/ndstool/include/arm7_sha1_homebrew.h, tools/ndstool/include/arm7_sha1_nintendo.h, tools/ndstool/include/banner.h, tools/ndstool/include/bigint.h, tools/ndstool/include/crc.h, tools/ndstool/include/default_icon.h, tools/ndstool/include/encryption.h, tools/ndstool/include/header.h, tools/ndstool/include/hook.h, tools/ndstool/include/little.h, tools/ndstool/include/loadme.h, tools/ndstool/include/logo.h, tools/ndstool/include/ndscreate.h, tools/ndstool/include/ndsextract.h, tools/ndstool/include/ndstool.h, tools/ndstool/include/ndstree.h, tools/ndstool/include/overlay.h, tools/ndstool/include/passme.h, tools/ndstool/include/passme_sram.h, tools/ndstool/include/passme_vhd1.h, tools/ndstool/include/passme_vhd2.h, tools/ndstool/include/raster.h, tools/ndstool/include/sha1.h, tools/ndstool/include/types.h, tools/ndstool/source/arm7_sha1_homebrew.c, tools/ndstool/source/arm7_sha1_nintendo.c, tools/ndstool/source/banner.cpp, tools/ndstool/source/bigint.cpp, tools/ndstool/source/compile_date.c, tools/ndstool/source/crc.cpp, tools/ndstool/source/default_icon.c, tools/ndstool/source/encryption.cpp, tools/ndstool/source/header.cpp, tools/ndstool/source/hook.cpp, tools/ndstool/source/loadme.c, tools/ndstool/source/logo.cpp, tools/ndstool/source/ndscodes.cpp, tools/ndstool/source/ndscreate.cpp, tools/ndstool/source/ndsextract.cpp, tools/ndstool/source/ndstool.cpp, tools/ndstool/source/ndstree.cpp, tools/ndstool/source/passme.cpp, tools/ndstool/source/passme_sram.c, tools/ndstool/source/raster.cpp, tools/ndstool/source/sha1.cpp, touchscreen/README.reco, touchscreen/parser.c, touchscreen/reco.c, touchscreen/reco.h, touchscreen/touchscreen.c, touchscreen/touchscreen.h, wifi/compat.c, wifi/compat.h, wifi/wifi.c: New files. --- .../lib/libbsp/arm/nds/libnds/source/common/card.c | 394 +++++++++++++++++++++ 1 file changed, 394 insertions(+) create mode 100644 c/src/lib/libbsp/arm/nds/libnds/source/common/card.c (limited to 'c/src/lib/libbsp/arm/nds/libnds/source/common/card.c') diff --git a/c/src/lib/libbsp/arm/nds/libnds/source/common/card.c b/c/src/lib/libbsp/arm/nds/libnds/source/common/card.c new file mode 100644 index 0000000000..8aad2d93aa --- /dev/null +++ b/c/src/lib/libbsp/arm/nds/libnds/source/common/card.c @@ -0,0 +1,394 @@ +/*--------------------------------------------------------------------------------- + $Id$ + + Copyright (C) 2005 + Michael Noland (joat) + Jason Rogers (dovoto) + Dave Murphy (WinterMute) + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any + damages arising from the use of this software. + + Permission is granted to anyone to use this software for any + purpose, including commercial applications, and to alter it and + redistribute it freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you + must not claim that you wrote the original software. If you use + this software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and + must not be misrepresented as being the original software. + 3. This notice may not be removed or altered from any source + distribution. + + +---------------------------------------------------------------------------------*/ +#include "nds/card.h" +#include "nds/dma.h" +#include "nds/memory.h" + + +//--------------------------------------------------------------------------------- +void cardWriteCommand(const uint8 * command) { +//--------------------------------------------------------------------------------- + int index; + + CARD_CR1H = CARD_CR1_ENABLE | CARD_CR1_IRQ; + + for (index = 0; index < 8; index++) { + CARD_COMMAND[7-index] = command[index]; + } +} + + +//--------------------------------------------------------------------------------- +void cardPolledTransfer(uint32 flags, uint32 * destination, uint32 length, const uint8 * command) { +//--------------------------------------------------------------------------------- + u32 data;; + cardWriteCommand(command); + CARD_CR2 = flags; + uint32 * target = destination + length; + do { + // Read data if available + if (CARD_CR2 & CARD_DATA_READY) { + data=CARD_DATA_RD; + if (destination < target) + *destination = data; + destination++; + } + } while (CARD_CR2 & CARD_BUSY); +} + + +//--------------------------------------------------------------------------------- +void cardStartTransfer(const uint8 * command, uint32 * destination, int channel, uint32 flags) { +//--------------------------------------------------------------------------------- + cardWriteCommand(command); + + // Set up a DMA channel to transfer a word every time the card makes one + DMA_SRC(channel) = (uint32)&CARD_DATA_RD; + DMA_DEST(channel) = (uint32)destination; + DMA_CR(channel) = DMA_ENABLE | DMA_START_CARD | DMA_32_BIT | DMA_REPEAT | DMA_SRC_FIX | 0x0001;; + + CARD_CR2 = flags; +} + + +//--------------------------------------------------------------------------------- +uint32 cardWriteAndRead(const uint8 * command, uint32 flags) { +//--------------------------------------------------------------------------------- + cardWriteCommand(command); + CARD_CR2 = flags | CARD_ACTIVATE | CARD_nRESET | 0x07000000; + while (!(CARD_CR2 & CARD_DATA_READY)) ; + return CARD_DATA_RD; +} + + +//--------------------------------------------------------------------------------- +void cardRead00(uint32 address, uint32 * destination, uint32 length, uint32 flags) { +//---------------------------------------------------------------------------------f + uint8 command[8]; + command[7] = 0; + command[6] = (address >> 24) & 0xff; + command[5] = (address >> 16) & 0xff; + command[4] = (address >> 8) & 0xff; + command[3] = address & 0xff; + command[2] = 0; + command[1] = 0; + command[0] = 0; + cardPolledTransfer(flags, destination, length, command); +} + + +//--------------------------------------------------------------------------------- +void cardReadHeader(uint8 * header) { +//--------------------------------------------------------------------------------- + cardRead00(0, (uint32 *)header, 512, 0xA93F1FFF); +} + + +//--------------------------------------------------------------------------------- +int cardReadID(uint32 flags) { +//--------------------------------------------------------------------------------- + uint8 command[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90}; + return cardWriteAndRead(command, flags); +} + + +//--------------------------------------------------------------------------------- +static inline void EepromWaitBusy() { +//--------------------------------------------------------------------------------- + while (CARD_CR1 & /*BUSY*/0x80); +} + +//--------------------------------------------------------------------------------- +uint8 cardEepromReadID(uint8 i) { +//--------------------------------------------------------------------------------- + return cardEepromCommand(/*READID*/0xAB, i&1); +} + +//--------------------------------------------------------------------------------- +uint8 cardEepromCommand(uint8 command, uint32 address) { +//--------------------------------------------------------------------------------- + uint8 retval; + int k; + CARD_CR1 = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40; + + CARD_CR1 = 0xFFFF; + CARD_EEPDATA = command; + + EepromWaitBusy(); + + CARD_EEPDATA = (address >> 16) & 0xFF; + EepromWaitBusy(); + + CARD_EEPDATA = (address >> 8) & 0xFF; + EepromWaitBusy(); + + CARD_EEPDATA = (address) & 0xFF; + EepromWaitBusy(); + + for(k=0;k<256;k++) + { + retval = CARD_EEPDATA; + if(retval!=0xFF) + break; + EepromWaitBusy(); + } + + CARD_CR1 = /*MODE*/0x40; + return retval; +} + +//--------------------------------------------------------------------------------- +int cardEepromGetType(void) +//--------------------------------------------------------------------------------- +{ + uint8 c00; + uint8 c05; + uint8 c9f; + uint8 c03; + +#ifdef ARM9 + sysSetBusOwners(BUS_OWNER_ARM9, BUS_OWNER_ARM9); +#endif + + c03=cardEepromCommand(0x03,0); + c05=cardEepromCommand(0x05,0); + c9f=cardEepromCommand(0x9f,0); + c00=cardEepromCommand(0x00,0); + + if((c00==0x00) && (c9f==0x00)) return 0; // PassMe? + if((c00==0xff) && (c05==0xff) && (c9f==0xff))return -1; + + if((c00==0xff) && (c05 & 0xFD) == 0xF0 && (c9f==0xff))return 1; + if((c00==0xff) && (c05 & 0xFD) == 0x00 && (c9f==0xff))return 2; + if((c00==0xff) && (c05 & 0xFD) == 0x00 && (c9f==0x00))return 3; + if((c00==0xff) && (c05 & 0xFD) == 0x00 && (c9f==0x12))return 3; // NEW TYPE 3 + if((c00==0xff) && (c05 & 0xFD) == 0x00 && (c9f==0x13))return 3; // NEW TYPE 3+ 4Mbit + if((c00==0xff) && (c05 & 0xFD) == 0x00 && (c9f==0x14))return 3; // NEW TYPE 3++ 8Mbit MK4-FLASH Memory + + return 0; +} + +//--------------------------------------------------------------------------------- +uint32 cardEepromGetSize() { +//--------------------------------------------------------------------------------- + + int type = cardEepromGetType(); + + if(type == -1) + return 0; + if(type == 0) + return 8192; + if(type == 1) + return 512; + if(type == 2) { + static const uint32 offset0 = (8*1024-1); // 8KB + static const uint32 offset1 = (2*8*1024-1); // 16KB + u8 buf1; // +0k data read -> write + u8 buf2; // +8k data read -> read + u8 buf3; // +0k ~data write + u8 buf4; // +8k data new comp buf2 + cardReadEeprom(offset0,&buf1,1,type); + cardReadEeprom(offset1,&buf2,1,type); + buf3=~buf1; + cardWriteEeprom(offset0,&buf3,1,type); + cardReadEeprom (offset1,&buf4,1,type); + cardWriteEeprom(offset0,&buf1,1,type); + if(buf4!=buf2) // +8k + return 8*1024; // 8KB(64kbit) + else + return 64*1024; // 64KB(512kbit) + } + if(type == 3) { + uint8 c9f; + c9f=cardEepromCommand(0x9f,0); + + if(c9f==0x14) + return 1024*1024; // NEW TYPE 3++ 8Mbit(1024KByte) + + if(c9f==0x13) + return 512*1024; // NEW TYPE 3+ 4Mbit(512KByte) + + return 256*1024; // TYPE 3 2Mbit(256KByte) + } + + return 0; +} + + +//--------------------------------------------------------------------------------- +void cardReadEeprom(uint32 address, uint8 *data, uint32 length, uint32 addrtype) { +//--------------------------------------------------------------------------------- + + CARD_CR1 = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40; + CARD_EEPDATA = 0x03 | ((addrtype == 1) ? address>>8<<3 : 0); + EepromWaitBusy(); + + if (addrtype == 3) { + CARD_EEPDATA = (address >> 16) & 0xFF; + EepromWaitBusy(); + } + + if (addrtype >= 2) { + CARD_EEPDATA = (address >> 8) & 0xFF; + EepromWaitBusy(); + } + + + CARD_EEPDATA = (address) & 0xFF; + EepromWaitBusy(); + + while (length > 0) { + CARD_EEPDATA = 0; + EepromWaitBusy(); + *data++ = CARD_EEPDATA; + length--; + } + + EepromWaitBusy(); + CARD_CR1 = /*MODE*/0x40; +} + + +//--------------------------------------------------------------------------------- +void cardWriteEeprom(uint32 address, uint8 *data, uint32 length, uint32 addrtype) { +//--------------------------------------------------------------------------------- + + uint32 address_end = address + length; + int i; + int maxblocks = 32; + if(addrtype == 1) maxblocks = 16; + if(addrtype == 2) maxblocks = 32; + if(addrtype == 3) maxblocks = 256; + + while (address < address_end) { + // set WEL (Write Enable Latch) + CARD_CR1 = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40; + CARD_EEPDATA = 0x06; EepromWaitBusy(); + CARD_CR1 = /*MODE*/0x40; + + // program maximum of 32 bytes + CARD_CR1 = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40; + + if(addrtype == 1) { + // WRITE COMMAND 0x02 + A8 << 3 + CARD_EEPDATA = 0x02 | (address & BIT(8)) >> (8-3) ; + EepromWaitBusy(); + CARD_EEPDATA = address & 0xFF; + EepromWaitBusy(); + } + else if(addrtype == 2) { + CARD_EEPDATA = 0x02; + EepromWaitBusy(); + CARD_EEPDATA = address >> 8; + EepromWaitBusy(); + CARD_EEPDATA = address & 0xFF; + EepromWaitBusy(); + } + else if(addrtype == 3) { + CARD_EEPDATA = 0x02; + EepromWaitBusy(); + CARD_EEPDATA = (address >> 16) & 0xFF; + EepromWaitBusy(); + CARD_EEPDATA = (address >> 8) & 0xFF; + EepromWaitBusy(); + CARD_EEPDATA = address & 0xFF; + EepromWaitBusy(); + } + + for (i=0; address> 16) & 0xFF; + EepromWaitBusy(); + CARD_EEPDATA = (address >> 8) & 0xFF; + EepromWaitBusy(); + CARD_EEPDATA = address & 0xFF; + EepromWaitBusy(); + + CARD_CR1 = /*MODE*/0x40; + + // wait erase to finish + CARD_CR1 = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40; + CARD_EEPDATA = 0x05; + EepromWaitBusy(); + + do + { + CARD_EEPDATA = 0; + EepromWaitBusy(); + } while (CARD_EEPDATA & 0x01); // WIP (Write In Progress) ? + CARD_CR1 = /*MODE*/0x40; +} + + -- cgit v1.2.3