BBCプログラムの抜粋です
//---------------------------------------------------------------------------
void __fastcall TForm2::Button_DownloadClick(TObject *Sender)
{
if(PortOpen() != -1){
if(Configuration() == 0){
Label_Status->Caption = "SUCCESS";
}else{
Label_Status->Caption = "FAILURE";
}
PortClose();
}
return;
}
//---------------------------------------------------------------------------
int __fastcall TForm2::Configuration()
{
HANDLE hFile;
int selectDevice;
int sizeBitstream;
int sizeSendData;
int tx_loop;
int tx_loop_tail;
int ret;
BYTE *bufBitstream;
BYTE *bufSendData;
BYTE byDone;
DWORD numOfBytesRead;
String fileExt, str;
hFile = CreateFileA(Edit_Bitstream->Text.c_str(),
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
NULL,
NULL);
if(hFile == INVALID_HANDLE_VALUE){
MessageBox(Handle, "File open error", "NOTICE", MB_OK);
return -1;
}
selectDevice = ComboBox_Device->ItemIndex + 1;
fileExt = ExtractFileExt(Edit_Bitstream->Text);
//
// XILINX
//
if(gDetectDevices[selectDevice].deviceVendor == "XILINX"){
if( (fileExt != ".bit")&&(fileExt != ".bin") ){
MessageBox(Handle, "Invalid file for this device", "NOTICE", MB_OK);
return -1;
}
//
// ALTERA
//
}else if(gDetectDevices[selectDevice].deviceVendor == "ALTERA"){
if(fileExt != ".rbf"){
MessageBox(Handle, "Invalid file for this device", "NOTICE", MB_OK);
return -1;
}
//
// XILINX or ALTERA
//
}else{
//Do nothing
}
sizeBitstream = GetFileSize(hFile, NULL);
sizeSendData = (sizeBitstream*8*2) + (CCLK_ADDITIONAL*2); //BYTE*CLOCK(HIGH & LOW)
bufBitstream = new BYTE[sizeBitstream+1];
bufSendData = new BYTE[sizeSendData+1];
ZeroMemory(bufBitstream, sizeBitstream+1);
ZeroMemory(bufSendData, sizeSendData+1);
ReadFile(hFile, bufBitstream, sizeBitstream, &numOfBytesRead, NULL);
ConvertBitstream(bufBitstream, bufSendData, sizeBitstream, sizeSendData, fileExt);
AddMemo("Start Configuration to " + gDetectDevices[selectDevice].name);
ResetFPGA();
Sleep(3*2); // Wait for T_PL(Program Latency)
SendConfigData(bufSendData, sizeSendData);
AddMemo("Configuration End");
CloseHandle(hFile);
delete []bufBitstream;
delete []bufSendData;
FT_GetBitMode(gFTHandle, &byDone);
byDone &= PIN_DONE;
if(byDone){
return 0;
}else{
return -1;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm2::ConvertBitstream(BYTE *bufBitstream, BYTE *bufSendData, int sizeBitstream, int sizeSendData, String fileExt)
{
int sendBytePos;
int txLoop, txTail;
BYTE byteTemp;
sendBytePos = 0;
for(int bytePos=0; bytePos<sizeBitstream; bytePos++)
{
byteTemp = bufBitstream[bytePos];
//
// XILINX
//
if( (fileExt == ".bit")||(fileExt == ".bin") ){
for(int bitPos=0; bitPos<8; bitPos++){
if(byteTemp & 0x80){
bufSendData[sendBytePos++] = MASK_SEND_DATA | PIN_DATA;
bufSendData[sendBytePos++] = MASK_SEND_DATA | PIN_DATA | PIN_CLK;
}
else{
bufSendData[sendBytePos++] = MASK_SEND_DATA;
bufSendData[sendBytePos++] = MASK_SEND_DATA | PIN_CLK;
}
byteTemp <<= 1;
}
}
//
// ALTERA
//
else if(fileExt == ".rbf"){
for(int bitPos=0; bitPos<8; bitPos++){
if(byteTemp & 0x01){
bufSendData[sendBytePos++] = MASK_SEND_DATA | PIN_DATA;
bufSendData[sendBytePos++] = MASK_SEND_DATA | PIN_DATA | PIN_CLK;
}
else{
bufSendData[sendBytePos++] = MASK_SEND_DATA;
bufSendData[sendBytePos++] = MASK_SEND_DATA | PIN_CLK;
}
byteTemp >>= 1;
}
}
}
//
// Extra clocking
//
for(int bytePos=0; bytePos<CCLK_ADDITIONAL; bytePos++){
bufSendData[sendBytePos++] = MASK_SEND_DATA | PIN_DATA;
bufSendData[sendBytePos++] = MASK_SEND_DATA | PIN_DATA | PIN_CLK;
}
return;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::SendConfigData(BYTE *bufData, int size)
{
int txLoop, txTail;
DWORD dwBytesWritten;
DWORD startTime, diffTime;
String str;
FT_STATUS ftStatus;
txLoop = size/FT_BUFF_SIZE_OUT;
txTail = size%FT_BUFF_SIZE_OUT;
startTime = timeGetTime();
for(int i=0; i<txLoop; i++){
FT_Write(gFTHandle, bufData, FT_BUFF_SIZE_OUT, &dwBytesWritten);
bufData += FT_BUFF_SIZE_OUT;
}
if(txTail > 0){
FT_Write(gFTHandle, bufData, txTail, &dwBytesWritten);
ProgressBar->StepBy(txTail);
}
diffTime = timeGetTime() - startTime;
Label_Time->Caption = str.sprintf("%d ms", diffTime);
return;
}