using System; using phcs_TedKit2; namespace com.nxp.cai.tedkit2 { class Example { /** * Evaluates the given status code and prints message in case it is * different than PHTEDKITSTATUS_OK. * * @param status The status code being evaluated. * @return Returns true if status is PHTEDKITSTATUS_SUCCESS, false * otherwise. */ private static bool evalStatus(ushort status) { if (status != API.ReturnCode.PHTEDKITSTATUS_OK) { Console.WriteLine( "Error code " + status + "(0x" + status + ") returned."); return false; } return true; } public static int Main(string[] args) { API api = null; try { // An instance of the API library. api = new API(); // An instance of the I/O data structure used to exchange data with // the TED-Kit 2 Library. API.IOData ioData = new API.IOData(); // Ask for all connected FTDI devices. ioData.Function = API.Function.PHTEDKITIOFKT_GET_DEVICE_NUMBER; api.Run(API.Layer.PHTEDKITCOMPID_IO, ioData); if (!evalStatus(ioData.StatusCode)) { Console.WriteLine("Unable to retreive connected devices."); return 1; } Console.WriteLine( "Number of devices found: " + ioData.DeviceNum + "\n"); // make sure at least one device is available if (ioData.DeviceNum == 0) { Console.WriteLine("No TED-Kit-2 detected, tests aborted."); return 1; } // list all FTDI devices connected and use the first // with the vendor-and-product ID for NXP TED-Kit-2 found ushort index = 0; Boolean found = false; ioData.Function = API.Function.PHTEDKITIOFKT_GET_DEVICE_INFODETAIL; for (ushort i = 0; i < ioData.DeviceNum; i++) { ioData.Port = i; api.Run(API.Layer.PHTEDKITCOMPID_IO, ioData); if (evalStatus(ioData.StatusCode)) { Console.WriteLine("No : {0}", i); Console.WriteLine("Flags : {0}", ioData.Flags); Console.WriteLine("Type : {0}", ioData.Type); Console.WriteLine("DeviceID : {0:X}", ioData.ID); Console.WriteLine("LocID : {0}", ioData.LocId); Console.WriteLine("SerialNumber : {0}", API.toString(ioData.SerialNumber)); Console.WriteLine("Description : {0}", API.toString(ioData.Description)); if ((ioData.ID == API.PHTEDKITUSB_VIDPID) && !found) { found = true; index = i; } } else { Console.WriteLine("Unable to retreive information for device #{0}", i); Console.WriteLine(); } } if (!found) { Console.WriteLine( "No NXP TED-Kit-2 device found, test aborted."); return 1; } Console.WriteLine("Device being used: #{0}", index); // open the device Console.WriteLine(); Console.WriteLine("Open"); ioData.Port = index; ioData.Function = API.Function.PHTEDKITIOFKT_OPEN; ioData.OpenMode = API.PHTEDKITIOFKT_NORMAL_OPERATION; api.Run(API.Layer.PHTEDKITCOMPID_IO, ioData); if (!evalStatus(ioData.StatusCode)) { Console.WriteLine("Unable to open device #{0}", index); return 1; } // //////////////////////////////////////////////////////////////// API.BaseData baseData = new API.BaseData(); // GetFWVersion Console.WriteLine(); Console.WriteLine("GetFWVersion"); baseData.Function = API.Function.PHTEDKITBASEAPIFKT_GETFWVERSION; api.Run(API.Layer.PHTEDKITCOMPID_BASEAPI, baseData); if (evalStatus(baseData.StatusCode)) { Console.WriteLine("Firmware Code : {0}", baseData.RxData1); Console.WriteLine("Firmware Version : {0}.{1}", baseData.RxData2, baseData.RxData3); } /////////////////////////////////////////////////////////////////// // get device status int frequency=1; Console.WriteLine(); Console.WriteLine(" get device status"); /* populate data structure */ baseData.Function = API.Function.PHTEDKITBASEAPIFKT_GETDEVICESTATUS; /* call the API¡¯s run(..) method */ api.Run(API.Layer.PHTEDKITCOMPID_BASEAPI, baseData); /* evaluate status code returned */ if (!evalStatus(baseData.StatusCode)) { /* failure, handle error */ Console.WriteLine("Failure code: {0}", baseData.StatusCode); } else { Console.WriteLine("¦ÌC memory free : {0}", ((baseData.RxBuf1[0] << 8) | baseData.RxBuf1[1])); Console.WriteLine("¦Ìc memory largest block free: {0}", ((baseData.RxBuf1[2] << 8) | baseData.RxBuf1[3])); Console.WriteLine("Supply Voltage : {0}", ((baseData.RxBuf1[4] << 8) | baseData.RxBuf1[5]) * 0.03255F); frequency = ((baseData.RxBuf1[6] << 24) | (baseData.RxBuf1[7] << 16)| (baseData.RxBuf1[8] << 8) | baseData.RxBuf1[9]); Console.WriteLine("¦ÌC clock frequency : {0} Hz", frequency); } float tickTime = Convert.ToSingle(1000000.0 / frequency); // //////////////////////////////////////////////////////////////// // config the ABIC1 XBoard Console.WriteLine(); Console.WriteLine("config the ABIC1 XBoard"); /* populate data structure to configure an ABIC1 in XSlot #0 to work as base station for a HITAG2. */ baseData.Function = API.Function.PHTEDKITBASEAPIFKT_SETXBOARDCONFIG; baseData.Device = API.BaseStation.PHTEDKITEXTAPIDEVICE_ABIC1; baseData.TxData1 = API.XBoardXSlot.PHTEDKITXBOARD_XSLOT_0; /* offset = 0 -> set all configuration data at once */ baseData.TxData2 = 0; /* length = 13 -> set all configuration data at once */ baseData.TxData3 = 13; /* 1 byte "interface & mode" -> set to 0 -> "non-filtered" */ baseData.TxBuf1[0] = 1; //baseData.TxBuf1[1] = 1; /* set the data rate to 100 kHz */ //copy((uint32_t)(10 / tickTime), data.TxBuf1, 1); // 10/tickTime=480 =0x01E0-> 00 00 01 E0 ;E0=224 baseData.TxBuf1[1] = Convert.ToByte(Convert.ToUInt32(10 / tickTime) >> 24 & 0xFF); baseData.TxBuf1[2] = Convert.ToByte(Convert.ToUInt32(10 / tickTime) >> 16 & 0xFF); baseData.TxBuf1[3] = Convert.ToByte(Convert.ToUInt32(10 / tickTime) >> 08 & 0xFF); baseData.TxBuf1[4] = Convert.ToByte(Convert.ToUInt32(10 / tickTime) & 0xFF); /* demodulator sampling phase */ baseData.TxBuf1[5] = 40; /* ignore, set to zero. */ baseData.TxBuf1[6] = 20; /* ignore, set to zero. */ baseData.TxBuf1[7] = 0; /* set ABIC1 configuration register 0. */ baseData.TxBuf1[8] = 7; /* set ABIC1 configuration register 1. */ baseData.TxBuf1[9] = 0; /* set ABIC1 configuration register 2. */ baseData.TxBuf1[10] = 0; /* set ABIC1 configuration register 3. */ baseData.TxBuf1[11] = 0; /* no test mode */ baseData.TxBuf1[12] = 0; /* call the API¡¯s run(..) method */ api.Run(API.Layer.PHTEDKITCOMPID_EXTAPI, baseData); /* evaluate status code returned */ if (baseData.StatusCode != API.ReturnCode.PHTEDKITSTATUS_OK) { /* failure, handle error */ Console.WriteLine("failure code: {0}", baseData.StatusCode); } else { Console.WriteLine("config the ABIC1 XBoard OK"); } /////////////////////////////////////////////////////////////////// // Configuring the Data Transmission Console.WriteLine(); Console.WriteLine("Configuring the Data Transmission"); baseData.Function = API.Function.PHTEDKITBASEAPIFKT_SETTRANSMISSIONPARAMS; baseData.TxData1 = API.XBoardXSlot.PHTEDKITXBOARD_XSLOT_0; /* Global Inversion -> off */ baseData.TxData2 = 0; /* PreambleLength */ baseData.TxData3 = 0; /* PreambleSymbolDuration */ baseData.TxTime1 = 0; /* HeaderLength */ baseData.TxData4 = 0; /* HeaderSymbolDuration */ baseData.TxTime2 = 0; /* TrailerLength */ baseData.TxData5 = 0; /* TrailerSymbolDuration */ baseData.TxTime3 = 0; /* IdleLevel */ baseData.TxData6 = 0; /* Tx Data Coding Type -> BPLM */ baseData.TxData7 = API.BodyDataEncoding.PHTEDKITCODING_BPLM; /* T_Pulse -> 48¦Ìs */ //longToBytes((long)(48 / tickTime), baseData.TxBuf1, 0); baseData.TxBuf1[0] = Convert.ToByte(Convert.ToUInt32(48 / tickTime) >> 24 & 0xFF); baseData.TxBuf1[1] = Convert.ToByte(Convert.ToUInt32(48 / tickTime) >> 16 & 0xFF); baseData.TxBuf1[2] = Convert.ToByte(Convert.ToUInt32(48 / tickTime) >> 08 & 0xFF); baseData.TxBuf1[3] = Convert.ToByte(Convert.ToUInt32(48 / tickTime) & 0xFF); /* T_Log0 -> 160¦Ìs */ //longToBytes((long)(160 / tickTime), baseData.TxBuf1, 4); baseData.TxBuf1[4] = Convert.ToByte(Convert.ToUInt32(160 / tickTime) >> 24 & 0xFF); baseData.TxBuf1[5] = Convert.ToByte(Convert.ToUInt32(160 / tickTime) >> 16 & 0xFF); baseData.TxBuf1[6] = Convert.ToByte(Convert.ToUInt32(160 / tickTime) >> 08 & 0xFF); baseData.TxBuf1[7] = Convert.ToByte(Convert.ToUInt32(160 / tickTime) & 0xFF); /* T_Log1 -> 224¦Ìs */ //longToBytes((long)(224 / tickTime), baseData.TxBuf1, 8); baseData.TxBuf1[8] = Convert.ToByte(Convert.ToUInt32(224 / tickTime) >> 24 & 0xFF); baseData.TxBuf1[9] = Convert.ToByte(Convert.ToUInt32(224 / tickTime) >> 16 & 0xFF); baseData.TxBuf1[10] = Convert.ToByte(Convert.ToUInt32(224 / tickTime) >> 08 & 0xFF); baseData.TxBuf1[11] = Convert.ToByte(Convert.ToUInt32(224 / tickTime) & 0xFF); /* T_Stop -> 288¦Ìs */ //longToBytes((long)(288 / tickTime), baseData.TxBuf1, 12); baseData.TxBuf1[12] = Convert.ToByte(Convert.ToUInt32(288 / tickTime) >> 24 & 0xFF); baseData.TxBuf1[13] = Convert.ToByte(Convert.ToUInt32(288 / tickTime) >> 16 & 0xFF); baseData.TxBuf1[14] = Convert.ToByte(Convert.ToUInt32(288 / tickTime) >> 08 & 0xFF); baseData.TxBuf1[15] = Convert.ToByte(Convert.ToUInt32(288 / tickTime) & 0xFF); api.Run(API.Layer.PHTEDKITCOMPID_BASEAPI, baseData); if (baseData.StatusCode != API.ReturnCode.PHTEDKITSTATUS_OK) { /* failure, handle error */ Console.WriteLine("failure code: {0}", baseData.StatusCode); } else { Console.WriteLine("Configuring the Data Transmission OK"); } /////////////////////////////////////////////////////////////////// // Configuring the Data Reception Console.WriteLine(); Console.WriteLine("Configuring the Data Reception"); baseData.Function = API.Function.PHTEDKITBASEAPIFKT_SETRECEPTIONPARAMS; baseData.TxData1 = API.XBoardXSlot.PHTEDKITXBOARD_XSLOT_0; /* SyncMode -> time based */ baseData.TxData2 = 1; /* SyncDelay -> 1330¦Ìs */ baseData.TxTime1 = Convert.ToUInt32(1330 / tickTime); /* Global Inversion -> off */ baseData.TxData3 = 0; /* Header Length -> 10 half-bits */ baseData.TxData4 = 10; /* Header Symbol Duration -> 128¦Ìs */ baseData.TxTime2 = Convert.ToUInt32(128 / tickTime); baseData.TxData5 = API.BodyDataEncoding.PHTEDKITCODING_MANCHESTER; /* Body Symbol Duration -> 128 ¦Ìs */ //longToBytes((long)(128 / tickTime), baseData.TxBuf1, 0); baseData.TxBuf1[0] = Convert.ToByte(Convert.ToUInt32(128 / tickTime) >> 24 & 0xFF); baseData.TxBuf1[1] = Convert.ToByte(Convert.ToUInt32(128 / tickTime) >> 16 & 0xFF); baseData.TxBuf1[2] = Convert.ToByte(Convert.ToUInt32(128 / tickTime) >> 08 & 0xFF); baseData.TxBuf1[3] = Convert.ToByte(Convert.ToUInt32(128 / tickTime) & 0xFF); for (int i = 4; i < 15; i++) { baseData.TxBuf1[i] = 0; } /* Header Pattern for Manchester/EQ -> 5540hex (10 half-bits) */ baseData.TxBuf2[0] = 0x55; baseData.TxBuf2[1] = 0x40; api.Run(API.Layer.PHTEDKITCOMPID_BASEAPI, baseData); //************* if (baseData.StatusCode != API.ReturnCode.PHTEDKITSTATUS_OK) { /* failure, handle error */ Console.WriteLine("failure code: {0}", baseData.StatusCode); } else { Console.WriteLine("Configuring the Data Reception OK"); } /////////////////////////////////////////////////////////////////// // Configuring the Data Transmission Console.WriteLine(); Console.WriteLine("Configuring the Data Transmission"); baseData.Function = API.Function.PHTEDKITBASEAPIFKT_SETTRANSMISSIONPARAMS; baseData.TxData1 = API.XBoardXSlot.PHTEDKITXBOARD_XSLOT_0; /* Global Inversion -> off */ baseData.TxData2 = 0; /* PreambleLength */ baseData.TxData3 = 0; /* PreambleSymbolDuration */ baseData.TxTime1 = 0; /* HeaderLength */ baseData.TxData4 = 0; /* HeaderSymbolDuration */ baseData.TxTime2 = 0; /* TrailerLength */ baseData.TxData5 = 0; /* TrailerSymbolDuration */ baseData.TxTime3 = 0; /* IdleLevel */ baseData.TxData6 = 0; /* Tx Data Coding Type -> BPLM */ baseData.TxData7 = API.BodyDataEncoding.PHTEDKITCODING_BPLM; /* T_Pulse -> 48¦Ìs */ //longToBytes((long)(48 / tickTime), baseData.TxBuf1, 0); baseData.TxBuf1[0] = Convert.ToByte(Convert.ToUInt32(48 / tickTime) >> 24 & 0xFF); baseData.TxBuf1[1] = Convert.ToByte(Convert.ToUInt32(48 / tickTime) >> 16 & 0xFF); baseData.TxBuf1[2] = Convert.ToByte(Convert.ToUInt32(48 / tickTime) >> 08 & 0xFF); baseData.TxBuf1[3] = Convert.ToByte(Convert.ToUInt32(48 / tickTime) & 0xFF); /* T_Log0 -> 160¦Ìs */ //longToBytes((long)(160 / tickTime), baseData.TxBuf1, 4); baseData.TxBuf1[4] = Convert.ToByte(Convert.ToUInt32(160 / tickTime) >> 24 & 0xFF); baseData.TxBuf1[5] = Convert.ToByte(Convert.ToUInt32(160 / tickTime) >> 16 & 0xFF); baseData.TxBuf1[6] = Convert.ToByte(Convert.ToUInt32(160 / tickTime) >> 08 & 0xFF); baseData.TxBuf1[7] = Convert.ToByte(Convert.ToUInt32(160 / tickTime) & 0xFF); /* T_Log1 -> 224¦Ìs */ //longToBytes((long)(224 / tickTime), baseData.TxBuf1, 8); baseData.TxBuf1[8] = Convert.ToByte(Convert.ToUInt32(224 / tickTime) >> 24 & 0xFF); baseData.TxBuf1[9] = Convert.ToByte(Convert.ToUInt32(224 / tickTime) >> 16 & 0xFF); baseData.TxBuf1[10] = Convert.ToByte(Convert.ToUInt32(224 / tickTime) >> 08 & 0xFF); baseData.TxBuf1[11] = Convert.ToByte(Convert.ToUInt32(224 / tickTime) & 0xFF); /* T_Stop -> 288¦Ìs */ //longToBytes((long)(288 / tickTime), baseData.TxBuf1, 12); baseData.TxBuf1[12] = Convert.ToByte(Convert.ToUInt32(288 / tickTime) >> 24 & 0xFF); baseData.TxBuf1[13] = Convert.ToByte(Convert.ToUInt32(288 / tickTime) >> 16 & 0xFF); baseData.TxBuf1[14] = Convert.ToByte(Convert.ToUInt32(288 / tickTime) >> 08 & 0xFF); baseData.TxBuf1[15] = Convert.ToByte(Convert.ToUInt32(288 / tickTime) & 0xFF); api.Run(API.Layer.PHTEDKITCOMPID_BASEAPI, baseData); if (baseData.StatusCode != API.ReturnCode.PHTEDKITSTATUS_OK) { /* failure, handle error */ Console.WriteLine("failure code: {0}", baseData.StatusCode); } else { Console.WriteLine("Configuring the Data Transmission OK"); } /////////////////////////////////////////////////////////////////// // Configuring the Data Reception Console.WriteLine(); Console.WriteLine("Configuring the Data Reception"); baseData.Function = API.Function.PHTEDKITBASEAPIFKT_SETRECEPTIONPARAMS; baseData.TxData1 = API.XBoardXSlot.PHTEDKITXBOARD_XSLOT_0; /* SyncMode -> time based */ baseData.TxData2 = 1; /* SyncDelay -> 1330¦Ìs */ baseData.TxTime1 = Convert.ToUInt32(1330 / tickTime); /* Global Inversion -> off */ baseData.TxData3 = 0; /* Header Length -> 10 half-bits */ baseData.TxData4 = 10; /* Header Symbol Duration -> 128¦Ìs */ baseData.TxTime2 = Convert.ToUInt32(128 / tickTime); baseData.TxData5 = API.BodyDataEncoding.PHTEDKITCODING_MANCHESTER; /* Body Symbol Duration -> 128 ¦Ìs */ //longToBytes((long)(128 / tickTime), baseData.TxBuf1, 0); baseData.TxBuf1[0] = Convert.ToByte(Convert.ToUInt32(128 / tickTime) >> 24 & 0xFF); baseData.TxBuf1[1] = Convert.ToByte(Convert.ToUInt32(128 / tickTime) >> 16 & 0xFF); baseData.TxBuf1[2] = Convert.ToByte(Convert.ToUInt32(128 / tickTime) >> 08 & 0xFF); baseData.TxBuf1[3] = Convert.ToByte(Convert.ToUInt32(128 / tickTime) & 0xFF); for (int i = 4; i < 15; i++) { baseData.TxBuf1[i] = 0; } /* Header Pattern for Manchester/EQ -> 5540hex (10 half-bits) */ baseData.TxBuf2[0] = 0x55; baseData.TxBuf2[1] = 0x40; api.Run(API.Layer.PHTEDKITCOMPID_BASEAPI, baseData); //************* if (baseData.StatusCode != API.ReturnCode.PHTEDKITSTATUS_OK) { /* failure, handle error */ Console.WriteLine("failure code: {0}", baseData.StatusCode); } else { Console.WriteLine("Configuring the Data Reception OK"); } /*****************************************************/ /* * Step 6: Reading the XMA configuration of the transponder. */ /* * Step 6.1: enter the XMA config state */ //Console.WriteLine("Entering transponder XMA state"); // /* To ensure the transponder is in WAIT state, configure a hard // * (field) reset by turning the field off and on again */ // /* reset duration 5ms -> 5000µs */ // baseData.TxTime1 = Convert.ToUInt32(5000 / tickTime); // /* reset delay 6.64ms -> 6640µs */ // baseData.TxTime2 = Convert.ToUInt32(6640 / tickTime); // baseData.Function = API.Function.PHTEDKITBASEAPIFKT_TRANSMITRECEIVE; // baseData.Device = API.Transponder.PHTEDKITEXTAPIDEVICE_HITAG2; // baseData.State = API.State.PHTEDKITHITAG2STATE_WAIT; // baseData.Command = API.Command.PHTEDKITHITAG2CMD_XMACFG; // baseData.TxData1 = 0; // baseData.TxData2 = 0; // /* send the command once (plain and inverted) */ // baseData.TxData5 = 2; // api.Run(API.Layer.PHTEDKITCOMPID_EXTAPI, baseData); // if (baseData.StatusCode != API.ReturnCode.PHTEDKITSTATUS_OK) // { // Console.WriteLine("Unable to enter the XMA config state, test aborted. Error code {0}", baseData.StatusCode); // //return EXIT_FAILURE; // } // /* void the reset request for the next commands. */ // baseData.TxTime1 = 0; // baseData.TxTime2 = 0; // /* // * Step 6.2: Read configuration of segments 0..7 // */ // Console.WriteLine("Reading transponder's memory configuration"); // for (byte i = 0; i < 8; i++) // { // /* set the segment to ask for configuration */ // baseData.TxBuf1[0] = i; // baseData.Function = API.Function.PHTEDKITBASEAPIFKT_TRANSMITRECEIVE; // baseData.Device = API.Transponder.PHTEDKITEXTAPIDEVICE_HITAG2; // baseData.State = API.State.PHTEDKITHITAG2STATE_XMACFG; // baseData.Command = API.Command.PHTEDKITHITAG2CMD_READCFG; // baseData.TxData1 = 0; // baseData.TxData2 = 0; // /* send the command once (plain and inverted) */ // baseData.TxData5 = 2; // api.Run(API.Layer.PHTEDKITCOMPID_EXTAPI, baseData); // if (baseData.StatusCode != API.ReturnCode.PHTEDKITSTATUS_OK) // { // Console.WriteLine("Unable to read XMA config, test aborted. Error code {0}", baseData.StatusCode); // // return EXIT_FAILURE; // } // Console.WriteLine("segment {0} configuration: mode={1}, size={2} blocks.", i, (baseData.RxBuf1[0] & 0x0F), (baseData.RxBuf1[1] & 0x0F)); // if ((baseData.RxBuf1[1] & 0x0F) != 0) // { // Console.WriteLine(" read/write access is "); // switch (baseData.RxBuf1[0] & 7) // { // case 0: Console.WriteLine("denied/denied"); break; // case 1: Console.WriteLine("plain/denied"); break; // case 2: Console.WriteLine("denied/plain"); break; // case 3: Console.WriteLine("plain/plain"); break; // case 4: Console.WriteLine("plain/ciphered"); break; // case 5: Console.WriteLine("ciphered/denied"); break; // case 6: Console.WriteLine("denied/ciphered"); break; // case 7: Console.WriteLine("ciphered/ciphered"); break; // } // //printf("\n"); // } // } /******************************************************************/ /* * Step 7: Executing an authentication in ciphered mode * (default secret key) */ Console.WriteLine("\nRunning transponder authentication sequence...\n"); /* * Step 7.1: Send authentication init command to the transponder */ /* To ensure the transponder is in WAIT state again, issue a soft * reset command. */ //baseData.Function = API.Function.PHTEDKITBASEAPIFKT_TRANSMITRECEIVE; //baseData.Device = API.Transponder.PHTEDKITEXTAPIDEVICE_HITAG2; //baseData.State = API.State.PHTEDKITHITAG2STATE_WAIT; //baseData.Command = API.Command.PHTEDKITHITAG2CMD_SOFTRESET; //baseData.TxData1 = 0; //baseData.TxData2 = 0; ///* send the command once (plain and inverted) */ //baseData.TxData5 = 2; //api.Run(API.Layer.PHTEDKITCOMPID_EXTAPI, baseData); //if (baseData.StatusCode != API.ReturnCode.PHTEDKITSTATUS_OK) //{ // Console.WriteLine("Unable to soft reset, test aborted. Error code {0}",baseData.StatusCode); // //return EXIT_FAILURE; //} /* Wait until the transponder has booted before sending the next * command. */ //baseData.Function = API.Function.PHTEDKITBASEAPIFKT_DELAY; ///* T_initstate = 6.32ms -> 6320µs */ //baseData.TxTime1 = Convert.ToUInt32(6320 / tickTime); //api.Run(API.Layer.PHTEDKITCOMPID_BASEAPI, baseData); ////phcsApiInt_Run(api, PHTEDKITCOMPID_BASEAPI, &baseData); //if (baseData.StatusCode != API.ReturnCode.PHTEDKITSTATUS_OK) //{ // Console.WriteLine("Unable to delay the next command, test aborted. Error code {0}", baseData.StatusCode); // //return EXIT_FAILURE; //} ///* Set TxTime1 back to zero to avoid a field reset before the next // * transmit/receive command. */ //baseData.TxTime1 = 0; /* Send the first step of the authentication sequence. */ //for (int i = 0; i < 512; i++) // { // baseData.TxBuf1[i] = 0; //} baseData.TxBuf1[0] = 0; baseData.TxTime1 = 240000; baseData.TxTime2 = 240000; baseData.Function = API.Function.PHTEDKITBASEAPIFKT_TRANSMITRECEIVE; baseData.Device = API.Transponder.PHTEDKITEXTAPIDEVICE_HITAG2; baseData.State = API.State.PHTEDKITHITAG2STATE_WAIT; baseData.Command = API.Command.PHTEDKITHITAG2CMD_STARTAUTH; baseData.TxData1 = 0; baseData.TxData2 = 0; /* send the command once (plain and inverted) */ baseData.TxData5 = 2; api.Run(API.Layer.PHTEDKITCOMPID_EXTAPI, baseData); //transmitReceive(api, xSlotPort, PHTEDKITHITAG2STATE_WAIT, // PHTEDKITHITAG2CMD_STARTAUTH, &baseData); if (baseData.StatusCode != API.ReturnCode.PHTEDKITSTATUS_OK) { Console.WriteLine("Unable to send authentication init, test aborted. Error code {0:x4}", baseData.StatusCode); //return EXIT_FAILURE; } /* extract the IDE of the transponder. */ //ide = bytesToLong(baseData.RxBuf1, 0); int ide = ((baseData.RxBuf1[0] << 24) | (baseData.RxBuf1[1] << 16) | (baseData.RxBuf1[2] << 8) | baseData.RxBuf1[3]); Console.WriteLine("transponder IDE: {0:x8}", ide); /* * Step 7.2: send authentication start command to the transponder */ /* authentication in password mode -> 1 */ baseData.TxBuf1[0] = 1; /* set the IDE */ //longToBytes(ide, baseData.TxBuf1, 1); baseData.TxBuf1[1] = Convert.ToByte(0x4D494B52 >> 24 & 0xFF); baseData.TxBuf1[2] = Convert.ToByte(0x4D494B52 >> 16 & 0xFF); baseData.TxBuf1[3] = Convert.ToByte(0x4D494B52 >> 08 & 0xFF); baseData.TxBuf1[4] = Convert.ToByte(0x4D494B52 & 0xFF); ///* set the challenge == 0 */ //baseData.TxBuf1[5] = 0; //baseData.TxBuf1[6] = 0; //baseData.TxBuf1[7] = 0; //baseData.TxBuf1[8] = 0; ///* set the (default) secret key */ //baseData.TxBuf1[9] = Convert.ToByte("M"); //baseData.TxBuf1[10] = Convert.ToByte("I"); //baseData.TxBuf1[11] = Convert.ToByte("K");// 'K'; //baseData.TxBuf1[12] = Convert.ToByte("R");//'R'; //baseData.TxBuf1[13] = Convert.ToByte("O");//'O'; //baseData.TxBuf1[14] = Convert.ToByte("N");//'N'; baseData.Function = API.Function.PHTEDKITBASEAPIFKT_TRANSMITRECEIVE; baseData.Device = API.Transponder.PHTEDKITEXTAPIDEVICE_HITAG2; baseData.State = API.State.PHTEDKITHITAG2STATE_WAIT; baseData.Command = API.Command.PHTEDKITHITAG2CMD_STARTAUTH; baseData.TxData1 = 0; baseData.TxData2 = 0; /* send the command once (plain and inverted) */ baseData.TxData5 = 2; api.Run(API.Layer.PHTEDKITCOMPID_EXTAPI, baseData); //transmitReceive(api, xSlotPort, PHTEDKITHITAG2STATE_WAIT, // PHTEDKITHITAG2CMD_STARTAUTH, &baseData); if (baseData.StatusCode != API.ReturnCode.PHTEDKITSTATUS_OK) { Console.WriteLine ("Unable to send authentication start, test aborted. Error code {0:x4}", baseData.StatusCode); //return EXIT_FAILURE; } Console.WriteLine("transponder password: {0:x6}",(((baseData.RxBuf1[0] << 24) | (baseData.RxBuf1[1] << 16) | (baseData.RxBuf1[2] << 8) | baseData.RxBuf1[3]) & 0x00FFFFFF)); Console.WriteLine("authentication successful\n"); /******************************************************************/ /* * Step 8: Selecting an appropriate XMA segment and block */ Console.WriteLine("Reading transponder's memory pages 0...7 of block 0 of segment 1"); /* * Step 8.1: Select the segment and switch from state * AUTHORIZED to XMA. */ /* select segment #1 */ baseData.TxBuf1[0] = 1; baseData.Function = API.Function.PHTEDKITBASEAPIFKT_TRANSMITRECEIVE; baseData.Device = API.Transponder.PHTEDKITEXTAPIDEVICE_HITAG2; baseData.State = API.State.PHTEDKITHITAG2STATE_AUTHORIZED; baseData.Command = API.Command.PHTEDKITHITAG2CMD_XMA; baseData.TxData1 = 0; baseData.TxData2 = 0; /* send the command once (plain and inverted) */ baseData.TxData5 = 2; api.Run(API.Layer.PHTEDKITCOMPID_EXTAPI, baseData); //transmitReceive(api, xSlotPort, PHTEDKITHITAG2STATE_AUTHORIZED, // PHTEDKITHITAG2CMD_XMA, &baseData); if (baseData.StatusCode != API.ReturnCode.PHTEDKITSTATUS_OK) { Console.WriteLine("Unable to select memory segement #1, test aborted. Error code {0:x4}", baseData.StatusCode); //return EXIT_FAILURE; } /* * Step 8.2: Select the block. */ /* select block #0 */ baseData.TxBuf1[0] = 0; //transmitReceive(api, xSlotPort, PHTEDKITHITAG2STATE_XMA, // PHTEDKITHITAG2CMD_SELBLOCK, &baseData); baseData.Function = API.Function.PHTEDKITBASEAPIFKT_TRANSMITRECEIVE; baseData.Device = API.Transponder.PHTEDKITEXTAPIDEVICE_HITAG2; baseData.State = API.State.PHTEDKITHITAG2STATE_XMA; baseData.Command = API.Command.PHTEDKITHITAG2CMD_SELBLOCK; baseData.TxData1 = 0; baseData.TxData2 = 0; /* send the command once (plain and inverted) */ baseData.TxData5 = 2; api.Run(API.Layer.PHTEDKITCOMPID_EXTAPI, baseData); if (baseData.StatusCode != API.ReturnCode.PHTEDKITSTATUS_OK) { Console.WriteLine("Unable to select memory block #0, test aborted.Error code {0:x4}", baseData.StatusCode); //return EXIT_FAILURE; } /******************************************************************/ /* * Step 9: Reading all pages from the selected block. */ /* iterate over all 8 pages of the previously selected block */ for (byte i = 0; i < 8; i++) { /* select page "i" */ baseData.TxBuf1[0] = i; //transmitReceive(api, xSlotPort, PHTEDKITHITAG2STATE_XMA, // PHTEDKITHITAG2CMD_READPAGE, &baseData); baseData.Function = API.Function.PHTEDKITBASEAPIFKT_TRANSMITRECEIVE; baseData.Device = API.Transponder.PHTEDKITEXTAPIDEVICE_HITAG2; baseData.State = API.State.PHTEDKITHITAG2STATE_XMA; baseData.Command = API.Command.PHTEDKITHITAG2CMD_READPAGE; baseData.TxData1 = 0; baseData.TxData2 = 0; /* send the command once (plain and inverted) */ baseData.TxData5 = 2; api.Run(API.Layer.PHTEDKITCOMPID_EXTAPI, baseData); if (baseData.StatusCode != API.ReturnCode.PHTEDKITSTATUS_OK) { Console.WriteLine("Unable to read page {0} of block #0 of segment #1,test aborted. Error code {1:x4}", i, baseData.StatusCode); //return EXIT_FAILURE; } Console.WriteLine("page {0} := {1:x8}", i, ((baseData.RxBuf1[0] << 24) | (baseData.RxBuf1[1] << 16) | (baseData.RxBuf1[2] << 8) | baseData.RxBuf1[3])); } // /******************************************************************/ // /* // * Step 10: Writing a page of the block. // */ // Console.WriteLine("writing to page #7...\n"); // /* set the page to write = 7 */ // baseData.TxBuf1[0] = 7; // /* set the value to be written. */ // longToBytes(0x76543210, baseData.TxBuf1, 1); // transmitReceive(api, xSlotPort, PHTEDKITHITAG2STATE_XMA, // PHTEDKITHITAG2CMD_WRITEPAGE, &baseData); // if (baseData.StatusCode != PHTEDKITSTATUS_OK) // { // printf("Unable to write page #7 of block #0 of segment #1, \ //test aborted. Error code 0x%04X\n", baseData.StatusCode); // return EXIT_FAILURE; // } // printf("Wait until the page has been written...\n"); // baseData.Function = PHTEDKITBASEAPIFKT_DELAY; // /* T_prog = 4.92ms -> 4920µs */ // baseData.TxTime1 = (uint32_t)(4920 / tickTime); // phcsApiInt_Run(api, PHTEDKITCOMPID_BASEAPI, &baseData); // if (baseData.StatusCode != PHTEDKITSTATUS_OK) // { // printf("Unable to delay the next command, test aborted. \ //Error code 0x%04X\n", baseData.StatusCode); // return EXIT_FAILURE; // } // /* Set TxTime1 back to zero to avoid a field reset before the next // transmit/receive command. */ // baseData.TxTime1 = 0; // /******************************************************************/ // /* // * Step 11. Read that page back // */ // printf("Read it back...\n"); // /* select page 7 */ // baseData.TxBuf1[0] = 7; // transmitReceive(api, xSlotPort, PHTEDKITHITAG2STATE_XMA, // PHTEDKITHITAG2CMD_READPAGE, &baseData); // if (baseData.StatusCode != PHTEDKITSTATUS_OK) // { // printf("Unable to read page #7 of block #0 of segment #1, \ //test aborted. Error code 0x%04X\n", baseData.StatusCode); // return EXIT_FAILURE; // } // printf("page #7 := 0x%08X\n", bytesToLong(baseData.RxBuf1, 0)); // /******************************************************************/ // //////////////////////////////////////////////////////////////// // close the device Console.WriteLine(); Console.WriteLine("Closing device #{0}.", index); ioData.Function = API.Function.PHTEDKITIOFKT_CLOSE; api.Run(API.Layer.PHTEDKITCOMPID_IO, ioData); if (!evalStatus(ioData.StatusCode)) { Console.WriteLine("Unable to close device #{0}.", index); return 1; } } finally { if (api != null) { api.dispose(); } } return 0; } } }