OpenCores
URL https://opencores.org/ocsvn/z80control/z80control/trunk

Subversion Repositories z80control

[/] [z80control/] [trunk/] [CII_Starter_USB_API_v1/] [SW/] [USB_JTAG.h] - Rev 12

Compare with Previous | Blame | View Log

 
#include "FTD2XX.h"
#include <queue.h>
 
#define   DEFAULT_DEVICE           0
#define   INIT_CMD_SIZE            5
#define   MAX_TOTAL_PACKET         256-20
#define   MAX_TXD_PACKET           256
#define   MAX_RXD_PACKET           100
#define   ALMOST_FULL_SIZE         20
 
class USB_JTAG
{
     FT_HANDLE FT_Handle;
     FT_STATUS FT_Status;
     int  DeviceNumber;
     unsigned long  NumOfWritten;
     unsigned long  NumOfRead;
     unsigned char  Init_CMD[INIT_CMD_SIZE];
     unsigned char  Close_CMD;
     unsigned char  TXD_Buffer[MAX_TXD_PACKET];
     queue<unsigned char> Buffer;
public:
     USB_JTAG();
     FT_STATUS Get_Status();
     void Select_Device(int Number);
     int  Number_Of_Device();
     int  Number_Of_Queue_Data();
     bool Open_Device();
     bool Close_Device();
     bool Reset_Device(int sleep);
     bool Initial_JTAG();
     bool Write_Data(unsigned char* Source, int Size, int WithRead, bool Immediate);
     bool Read_Data(unsigned char* Dest, int Size);
     ~USB_JTAG();
};
 
/* TODO : USB_JTAG */
USB_JTAG::USB_JTAG()
{
     Init_CMD[0]    = 0x26;
     Init_CMD[1]    = 0x27;
     Init_CMD[2]    = 0x26;
     Init_CMD[3]    = 0x81;
     Init_CMD[4]    = 0x00;
     Close_CMD      = 0x1F;
     DeviceNumber   = DEFAULT_DEVICE;
     FT_Status      = FT_OK;
}
 
/* TODO : Get_Status */
FT_STATUS USB_JTAG::Get_Status()
{
     return FT_Status;
}
 
/* TODO : Select_Device */
void USB_JTAG::Select_Device(int Number)
{
     DeviceNumber=Number;
}
 
/* TODO : Number_Of_Device */
int  USB_JTAG::Number_Of_Device()
{
     unsigned long numDevs=0;
     FT_Status=FT_ListDevices(&numDevs,NULL,FT_LIST_NUMBER_ONLY);
     return numDevs;
}
 
/* TODO : Number_Of_Queue_Data */
int  USB_JTAG::Number_Of_Queue_Data()
{
     unsigned long numData=0;
     FT_Status=FT_GetQueueStatus(FT_Handle,&numData);
     return numData;
}
 
/* TODO : Open_Device */
bool USB_JTAG::Open_Device()
{
     FT_Status=FT_Open(DeviceNumber,&FT_Handle);
     if(FT_Status!=FT_OK)  return false;
     FT_SetLatencyTimer(FT_Handle,0x02);
     return true;
}
 
/* TODO : Close_Device */
bool USB_JTAG::Close_Device()
{
     FT_Status=FT_Write(FT_Handle,&Close_CMD,1,&NumOfWritten);
     if(FT_Status!=FT_OK)  return false;
     FT_Status=FT_Close(FT_Handle);
     if(FT_Status!=FT_OK)  return false;
     return true;
}
 
/* TODO : Reset_Device */
bool USB_JTAG::Reset_Device(int sleep)
{
     Close_Device();
     Sleep(sleep);
     Open_Device();
     Initial_JTAG();
     if(FT_Status!=FT_OK)  return false;
     return true;
}
 
/* TODO : Initial_JTAG */
bool USB_JTAG::Initial_JTAG()
{
     FT_Status=FT_Write(FT_Handle,Init_CMD,5,&NumOfWritten);
     if(FT_Status!=FT_OK)  return false;
     return true;
}
 
/* TODO : Write_Data */
bool USB_JTAG::Write_Data(unsigned char* Source, int Size, int WithRead, bool Immediate)
{
     int i;
     if(Size!=0)
     {
          //   Insert Write Command
          Buffer.push((unsigned char)Size|0x80);
          for(i=0;i<Size;i++)
          Buffer.push(Source[i]);
     }
     if(WithRead!=0)
     {
          //   Insert Read Command
          Buffer.push((unsigned char)WithRead|0xC0);
          for(i=0;i<WithRead;i++)
          Buffer.push(0x00);
     }
     //   Transfer Queue To Array
     int Trans_Size=Buffer.size();
     if(Immediate || Trans_Size>MAX_TXD_PACKET-ALMOST_FULL_SIZE)
     {
          for(i=0;i<Trans_Size;i++)
          {
               TXD_Buffer[i]=Buffer.front();
               Buffer.pop();
          }
          FT_Status=FT_Write(FT_Handle,TXD_Buffer,Trans_Size,&NumOfWritten);
     }
     if(FT_Status!=FT_OK)  return false;
     return true;
}
 
/* TODO : Read_Data */
bool  USB_JTAG::Read_Data(unsigned char* Dest, int Size)
{
     FT_Status=FT_Read(FT_Handle,Dest,Size,&NumOfRead);
     if(FT_Status!=FT_OK)  return false;
     return true;
}
 
/* TODO : ~USB_JTAG */
USB_JTAG::~USB_JTAG()
{
     Close_Device();
}
 
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.