001 package edu.wpi.first.wpilibj.fpga;
002
003 import com.ni.rio.*;
004 import edu.wpi.first.wpilibj.communication.BumARioHandle;
005
006 public abstract class tSystem implements ExpectedFPGASignature//, DMAChannelDescriptors
007 {
008 protected static int m_DeviceHandle=0;
009 private static int m_ReferenceCount=0;
010 public static NiRioStatus status = new NiRioStatus();
011
012 private static final String kRIO_DEVICE_NAME = "RIO0";
013 private static final int kFPGA_RESET_REGISTER = 0x8102;
014 private static final int kFPGA_COMMAND_REGISTER = 0x8104;
015 private static final int kFPGA_COMMAND_ENABLE_CLEAR = 4;
016 private static final int kFPGA_COMMAND_ENABLE_IN = 2;
017 private static final int kFPGA_INTERRUPT_BASE_ADDRESS = 0x8000;
018 private static final int kFPGA_SIGNATURE_REGISTER = 0x8108;
019 private static final int kMITE_IOPCR_REGISTER = 0x470;
020 private static final int kMITE_IOPCR_32BIT = 0xC00231;
021
022 protected tSystem()
023 {
024 NiRioStatus versionStatus = new NiRioStatus();
025 if (m_DeviceHandle == 0)
026 {
027 // Bum a RIO handle from network communications
028 m_DeviceHandle = BumARioHandle.bum(status.getPointer());
029
030 // Check the GUID
031 int hwGUID[] = new int[4];
032 for(int i=0; i<4; i++)
033 {
034 NiRioStatus cleanStatus = new NiRioStatus();
035
036 hwGUID[i] = NiFpga.readU32(m_DeviceHandle, kFPGA_SIGNATURE_REGISTER, cleanStatus);
037 status.setStatus(cleanStatus);
038 if (hwGUID[i] != kExpectedFPGASignature[i])
039 {
040 // versionStatus.setStatus(NiRioStatus.kRIOStatusVersionMismatch);
041 }
042 }
043
044 System.out.print("FPGA Hardware GUID: ");
045 printGUID(hwGUID);
046 System.out.println("");
047 System.out.print("FPGA Software GUID: ");
048 printGUID(kExpectedFPGASignature);
049 System.out.println("");
050 }
051 status.setStatus(versionStatus);
052 }
053
054 private static void printGUID(int guid[])
055 {
056 System.out.print("0x");
057 for(int i=0; i<4; i++)
058 {
059 long longVar = guid[i];
060 String word = Long.toString(longVar & 0xFFFFFFFFL, 16);
061 while (word.length() < 8)
062 {
063 word = "0" + word;
064 }
065 System.out.print(word);
066 }
067 }
068
069 protected void finalize()
070 {
071 }
072
073 public int[] getFpgaGuid(NiRioStatus status)
074 {
075 int[] guid = {0,0,0,0};
076 if (m_DeviceHandle == 0)
077 {
078 status.setStatus(NiRioStatus.kRIOStatusInvalidHandle);
079 return guid;
080 }
081
082 for(int i=0; i<4; i++)
083 {
084 guid[i] = NiFpga.readU32(m_DeviceHandle, kFPGA_SIGNATURE_REGISTER, status);
085 }
086 return guid;
087 }
088
089 /**
090 * Releases the native C++ resources held by the tSystem instance.
091 */
092 public void Release()
093 {
094 }
095 }