/***************************************************************** NP1003 USB SDRAM SAMPLE PROGRAM 1 (C)Copyright 2003 Nahitafu Nahitech http://www.nahitech.com/nahitafu/ *****************************************************************/ #include #include #include #include #include "Ftd2xx.h" #define BUFFER_MAX 65536 FT_STATUS ftStatus; FT_HANDLE ftHandle; DWORD SDRAM_BlockWrite(unsigned char *TxBuffer,unsigned int len){ unsigned char uc; DWORD BytesTransmitted; if(len == 0) { printf("Data length must not be 0.\n"); return 0; } if(len > 65533) { printf("Data length must be less than 65533.\n"); return 0; } len--; TxBuffer[0] = 0x01; TxBuffer[1] = len & 0xff; TxBuffer[2] = (len>>8) & 0xff; len++; ftStatus = FT_Write(ftHandle, TxBuffer , len+3, &BytesTransmitted); return BytesTransmitted; } DWORD SDRAM_BlockRead(unsigned char *RxBuffer,unsigned int len){ unsigned char uc; unsigned char TxBuffer[4]; DWORD BytesTransmitted; DWORD BytesReceived; if(len == 0) { printf("\nData length must not be 0.\n"); return 0; } if(len > 65533) { printf("Data length must be less than 65533.\n"); return 0; } len--; TxBuffer[0] = 0x02; TxBuffer[1] = len & 0xff; TxBuffer[2] = (len>>8) & 0xff; len++; ftStatus = FT_Write(ftHandle, TxBuffer , 3, &BytesTransmitted); while(FT_GetQueueStatus(ftHandle,&BytesReceived) == FT_OK) { if(BytesReceived >= len) break; } ftStatus = FT_Read(ftHandle, RxBuffer , len, &BytesReceived); return BytesReceived; } void SDRAM_SetAddr(DWORD Addr){ unsigned char uc; unsigned char TxBuffer[5]; DWORD BytesTransmitted; TxBuffer[0] = 0x03; TxBuffer[1] = Addr & 0xff; TxBuffer[2] = (Addr >>8 ) & 0xff; TxBuffer[3] = (Addr >>16) & 0xff; TxBuffer[4] = (Addr >>24) & 0xff; ftStatus = FT_Write(ftHandle, TxBuffer , 5, &BytesTransmitted); } void FPGA_NullCommand(){ unsigned char TxBuffer[64]; DWORD BytesTransmitted; memset(TxBuffer,0,64); ftStatus = FT_Write(ftHandle, TxBuffer , 64, &BytesTransmitted); } void ClearUSBQueue() { unsigned char *RxBuffer; DWORD Length; DWORD BytesReceived; Sleep(50); if(FT_GetQueueStatus(ftHandle,&Length) != FT_OK) return; if(!Length) return; RxBuffer = new unsigned char[Length]; FT_Read(ftHandle, RxBuffer , Length, &BytesReceived); delete[] RxBuffer; } DWORD hextoint(const char *tmp){ char c; DWORD retval = 0; for(int i=0;i= '0' && c <= '9') retval += (c - '0'); else if(c >= 'A' && c <= 'F') retval += (c - 'A' + 10); else if(c >= 'a' && c <= 'f') retval += (c - 'a' + 10); else { return 0; } if(i == strlen(tmp)-1) return retval; retval *= 16; } return retval; } int main(int argc, char* argv[]){ DWORD EventDWord; DWORD RxBytes; DWORD TxBytes; // DWORD BytesReceived; // DWORD BytesTransmitted; DWORD TotalBytes = 0; DWORD numDevs; DWORD offset = 0; DWORD len = 32768; DWORD curlen = 0; DWORD rlen = 0; FILE *fp=NULL; unsigned char *Buffer; unsigned char uc; char c; ftStatus = FT_ResetDevice(ftHandle); ftStatus = FT_SetTimeouts(ftHandle,500,0); printf("\nNP1003 USB=>SDRAM test program Version 1.1 (C)Copyright 2004 Nahitafu Nahitech\n"); if(argc < 3){ printf("usage:np1003s1 -w filename [offset_address] \n"); printf(" np1003s1 -r filename length [offset_address] \n"); printf("-r : read from SDRAM to file\n"); printf("-w : write to SDRAM from file\n"); printf("\n"); return -1; } if(!strcmpi(argv[1],"-r")){ if(argc < 4) { printf("Missing data length.\n"); return -1; } rlen = hextoint(argv[3]); printf("Receive %d bytes data from SDRAM to file %s ...\n",rlen,argv[2]); if(argc >= 5) { offset = hextoint(argv[4]); printf("Memory address offset : %08X\n",offset); } fp = fopen(argv[2],"rb"); if(fp){ printf("Overwrite file:%s OK?(Y/N) ",argv[2]); c = getch(); if(c != 'y' && c !='Y') return -1; } fclose(fp); fp = fopen(argv[2],"wb"); } else if(!strcmpi(argv[1],"-w")){ fp = fopen(argv[2],"rb"); printf("send data from file %s to SDRAM ...\n",argv[2]); if(argc >= 4) { offset = hextoint(argv[3]); printf("Memory address offset : 0x%08X\n",offset); } } if(!fp){ printf("File not found %s.\n",argv[2]); return -1; } ftStatus = FT_ListDevices(&numDevs,NULL,FT_LIST_NUMBER_ONLY); if (ftStatus == FT_OK) { printf("FT_ListDevices OK, number of devices is %d. \n",numDevs); } else { printf("FT_ListDevices failed\n"); return -1; } ftStatus = FT_Open(0,&ftHandle); if (ftStatus == FT_OK) { printf("FT_Open OK, use ftHandle to access device\n"); } else { printf("FT_Open failed\n"); return -1; } Buffer = new unsigned char[65536]; FT_SetTimeouts(ftHandle,500,0); FPGA_NullCommand(); ClearUSBQueue(); SDRAM_SetAddr(offset); if(!strcmpi(argv[1],"-w") && fp){ while(1){ curlen = fread(Buffer+3,1,len,fp); if(curlen == 0) break; SDRAM_BlockWrite(Buffer,curlen); for(int k=0;k<70;k++){ putchar(8); } TotalBytes += curlen; printf("%d Bytes send",TotalBytes); } printf("\n"); } if(!strcmpi(argv[1],"-r") && fp){ while(1){ curlen = SDRAM_BlockRead(Buffer,len < rlen ? len : rlen); if(fwrite(Buffer,1,curlen,fp) == 0) break; // file write error for(int k=0;k<70;k++){ putchar(8); } TotalBytes += curlen; printf("%d Bytes received",TotalBytes); if(rlen <= len) break; rlen -= len; } printf("\n"); } fclose(fp); delete[] Buffer; FT_Close(ftHandle); return 0; }