void SendFile(RAFile *file) { DEBUG_FUNC_IN(DEBUG_F_FPGA | DEBUG_L0); unsigned char c1, c2; unsigned long j; unsigned long n; unsigned char *p; printf("["); n = (file->file.size + 511) >> 9; // sector count (rounded up) while (n--) { // read data sector from memory card RARead(file,sector_buffer,512); do { // read FPGA status EnableFpga(); c1 = SPI(0); c2 = SPI(0); SPI(0); SPI(0); SPI(0); SPI(0); DisableFpga(); } while (!(c1 & CMD_RDTRK)); if ((n & 15) == 0) printf("*"); // send data sector to FPGA EnableFpga(); c1 = SPI(0); c2 = SPI(0); SPI(0); SPI(0); SPI(0); SPI(0); p = sector_buffer; for (j = 0; j < 512; j++) SPI(*p++); DisableFpga(); } printf("]\r"); DEBUG_FUNC_OUT(DEBUG_F_FPGA | DEBUG_L0); }
int RARead(RAFile *file,unsigned char *pBuffer, unsigned long bytes) { DEBUG_FUNC_IN(DEBUG_F_RAFILE | DEBUG_L2); int result=1; // Since we can only read from the SD card on 512-byte aligned boundaries, // we need to copy in multiple pieces. unsigned long blockoffset=file->ptr&511; // Offset within the current 512 block at which the previous read finished // Bytes blockoffset to 512 will be drained first, before reading new data. if(blockoffset) // If blockoffset is zero we'll just use aligned reads and don't need to drain the buffer. { int i; int l=bytes; if(l>512) l=512; for(i=blockoffset;i<l;++i) { *pBuffer++=file->buffer[i]; } file->ptr+=l-blockoffset; bytes-=l-blockoffset; } // We've now read any bytes left over from a previous read. If any data remains to be read we can read it // in 512-byte aligned chunks, until the last block. while(bytes>511) { result&=FileRead(&file->file,pBuffer); // Read direct to pBuffer FileNextSector(&file->file); bytes-=512; file->ptr+=512; pBuffer+=512; } if(bytes) // Do we have any bytes left to read? { unsigned int i; result&=FileRead(&file->file,file->buffer); // Read to temporary buffer, allowing us to preserve any leftover for the next read. FileNextSector(&file->file); for(i=0;i<bytes;++i) { *pBuffer++=file->buffer[i]; } file->ptr+=bytes; } return(result); DEBUG_FUNC_OUT(DEBUG_F_RAFILE | DEBUG_L2); }
int RAOpen(RAFile *file,const char *filename) { DEBUG_FUNC_IN(DEBUG_F_RAFILE | DEBUG_L1); int result=1; if(!file) return(0); result=FileOpen(&file->file,filename); file->size=file->file.size; file->ptr=0; return(result); DEBUG_FUNC_OUT(DEBUG_F_RAFILE | DEBUG_L1); }
// fatal error void FatalError(void) { DEBUG_FUNC_IN(); DisableCard(); // loop forever while(1) { TIMER_wait(200); LEDS(0x0); TIMER_wait(200); LEDS(led); } DEBUG_FUNC_OUT(); }
//// FatalError() //// void FatalError(unsigned long error) { DEBUG_FUNC_IN(); sprintf(s,"Fatal error: %lu", error); BootPrintEx(s); printf(s); // loop forever while(1) { TIMER_wait(200); LEDS(0x0); TIMER_wait(200); LEDS(error); } DEBUG_FUNC_OUT(); }
void main(void) { DEBUG_FUNC_IN(); fileTYPE ft; int i; // !!! a pointer to start of RAM unsigned char * ram = ((unsigned char *)0x400000); // initialize SD card LEDS(led=0xf); if (!MMC_Init()) FatalError(); // find drive LEDS(led=0x8); if (!FindDrive()) FatalError(); // open file LEDS(led=0x3); LoadFile(firmware,ram); #if 0 if (!FileOpen(&ft, firmware)) FatalError(); // load firmware to RAM LEDS(led=0x1); for(i=0; i<((ft.size>>9)+1); i++) { FileRead(&ft, ram+(i*512)); FileNextSector(&ft); } #endif // jump to RAM firmware LEDS(led=0x0); DisableCard(); sys_jump(0x400004); // loop forever while(1); DEBUG_FUNC_OUT(); }
int RASeek(RAFile *file,unsigned long offset,unsigned long origin) { DEBUG_FUNC_IN(DEBUG_F_RAFILE | DEBUG_L1); int result=1; unsigned long blockoffset; unsigned long blockaddress; if(origin==SEEK_CUR) offset+=file->ptr; blockoffset=offset&511; blockaddress=offset-blockoffset; // 512-byte-aligned... result&=FileSeek(&file->file,blockaddress,SEEK_SET); if(result && blockoffset) // If we're seeking into the middle of a block, we need to buffer it... { result&=FileRead(&file->file,file->buffer); FileNextSector(&file->file); } file->ptr=offset; return(result); DEBUG_FUNC_OUT(DEBUG_F_RAFILE | DEBUG_L1); }
void SendFileEncrypted(RAFile *file,unsigned char *key,int keysize) { DEBUG_FUNC_IN(DEBUG_F_FPGA | DEBUG_L0); unsigned char c1, c2; unsigned char headersize; unsigned int keyidx=0; unsigned long j; unsigned long n; unsigned char *p; int badbyte=0; printf("["); headersize=file->size&255; // ROM should be a round number of kilobytes; overspill will likely be the Amiga Forever header. RARead(file,sector_buffer,headersize); // Read extra bytes n = (file->size + (511-headersize)) >> 9; // sector count (rounded up) while (n--) { RARead(file,sector_buffer,512); for (j = 0; j < 512; j++) { sector_buffer[j]^=key[keyidx++]; if(keyidx>=(unsigned)keysize) keyidx-=keysize; } do { // read FPGA status EnableFpga(); c1 = SPI(0); c2 = SPI(0); SPI(0); SPI(0); SPI(0); SPI(0); DisableFpga(); } while (!(c1 & CMD_RDTRK)); if ((n & 15) == 0) printf("*"); // send data sector to FPGA EnableFpga(); c1 = SPI(0); c2 = SPI(0); SPI(0); SPI(0); SPI(0); SPI(0); p = sector_buffer; for (j = 0; j < 512; j++) SPI(*p++); DisableFpga(); } printf("]\r"); DEBUG_FUNC_OUT(DEBUG_F_FPGA | DEBUG_L0); }
__geta4 void main(void) #endif { DEBUG_FUNC_IN(); uint32_t spiclk; fileTYPE sd_boot_file; HideSplash(); SPI_fast(); // boot message draw_boot_logo(); BootPrintEx("**** MINIMIG-DE1 ****"); BootPrintEx("Minimig by Dennis van Weeren"); BootPrintEx("Updates by Jakub Bednarski, Tobias Gubener, Sascha Boing, A.M. Robinson & others"); BootPrintEx("DE1 port by Rok Krajnc ([email protected])"); BootPrintEx(" "); sprintf(s, "Build git commit: %s", __BUILD_REV); BootPrintEx(s); sprintf(s, "Build git tag: %s", __BUILD_TAG); BootPrintEx(s); BootPrintEx(" "); BootPrintEx("For updates & code see https://github.com/rkrajnc/minimig-de1"); BootPrintEx("For support, see http://www.minimig.net"); BootPrintEx(" "); printf("\r\r**** MINIMIG-DE1 ****\r\r"); printf("Minimig by Dennis van Weeren\r"); printf("Updates by Jakub Bednarski, Tobias Gubener, Sascha Boing, A.M. Robinson & others\r"); printf("DE1 port by Rok Krajnc ([email protected])\r\r"); printf("Build no. "); printf(__BUILD_NUM); //printf(" by "); //printf(__BUILD_USER); printf("\rgit commit "); printf(__BUILD_REV); printf("\rgit tag"); printf(__BUILD_TAG); printf("\r\r"); printf("For updates & code see https://github.com/rkrajnc/minimig-de1\r"); printf("For support, see http://www.minimig.net/\r\r"); spiclk = 100000 / (20*(read32(REG_SPI_DIV_ADR) + 2)); printf("SPI divider: %u\r", read32(REG_SPI_DIV_ADR)); sprintf(s, "SPI clock: %u.%uMHz", spiclk/100, spiclk%100); BootPrintEx(s); printf("%s\r", s); if (!MMC_Init()) FatalError(1); BootPrintEx("SD card found ..."); printf("SD card found ...\r"); if (!FindDrive()) FatalError(2); BootPrintEx("Drive found ..."); printf("Drive found ...\r"); ChangeDirectory(DIRECTORY_ROOT); //eject all disk df[0].status = 0; df[1].status = 0; df[2].status = 0; df[3].status = 0; BootPrintEx("Booting ..."); printf("Booting ...\r"); TIMER_wait(8000); config.kickstart.name[0]=0; SetConfigurationFilename(0); // Use default config LoadConfiguration(0); // Use slot-based config filename // main loop while (1) { HandleFpga(); HandleUI(); } DEBUG_FUNC_OUT(); }