home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 81 / IOPROG_81.ISO / soft / Codice / SymmeticEncryption.ZIP / SpuntoHardwareKeyProgrammerUnit.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2004-03-09  |  13.0 KB  |  410 lines

  1. //---------------------------------------------------------------------------
  2. //  C++ Hardware Key Programmer 1.0
  3. //  Copyright 2004 spuntosoft@tiscali.it
  4. //---------------------------------------------------------------------------
  5. #include <vcl.h>
  6. #pragma hdrstop
  7.  
  8. #include "SpuntoHardwareKeyProgrammerUnit.h"
  9. //---------------------------------------------------------------------------
  10. #pragma package(smart_init)
  11. #pragma link "SpuntoLedComponent"
  12. #pragma link "TSpuntoHardwarePortIO_unit"
  13. #pragma link "CSPIN"
  14. #pragma resource "*.dfm"
  15. unsigned short datain, dataout, bitin, bitout, Contabit, CombaseAddress, MCRAddress, LCRAddress, MSRAddress;
  16. bool WaveFormHigh;
  17. int DefaultDelay;
  18.  
  19. TSpuntoHardwareKeyProgrammerForm *SpuntoHardwareKeyProgrammerForm;
  20.  
  21. //---------------------------------------------------------------------------
  22.  
  23. void TSpuntoHardwareKeyProgrammerForm::HardwareDeviceSerialON(unsigned short HardwareDeviceComPort)
  24. {
  25. SpuntoHardwarePort->WritePort(HardwareDeviceComPort+1,0x00);      //INT OFF
  26. SpuntoHardwarePort->WritePort(HardwareDeviceComPort+3,0x80);      //DLAB ON
  27. SpuntoHardwarePort->WritePort(HardwareDeviceComPort+0,0x80);      //300 BPS  LB
  28. SpuntoHardwarePort->WritePort(HardwareDeviceComPort+1,0x01);      //300 BPS  HB
  29. SpuntoHardwarePort->WritePort(HardwareDeviceComPort+3,0x03);      //8BITS NP 1STOP
  30. SpuntoHardwarePort->WritePort(HardwareDeviceComPort+2,0xC7);      //FIFO REGISTER
  31. SpuntoHardwarePort->WritePort(HardwareDeviceComPort+4,0x0B);      //DTR,RTS OUT2 ON
  32. SpuntoHardwarePort->WritePort(HardwareDeviceComPort,0xFF);        //SENDS FF TO COM PORT
  33. }
  34. //---------------------------------------------------------------------------
  35. byte TSpuntoHardwareKeyProgrammerForm::EEPROMCheck(void) //EEPROM Check
  36. {
  37.  
  38. int  KeyAddress;
  39. byte WrittenData, KeyData;
  40.  
  41.   KeyAddress=KeyAddressSpinEdit->Value;
  42.   KeyData=KeyDataSpinEdit->Value;
  43.  
  44.   WrittenData=Read_data(KeyAddress);         //Reads written data
  45.  
  46.   if (WrittenData==KeyData)                  //Verifies written data
  47.    {
  48.      KeyOKLabel->Caption="OK";               //Verification passed
  49.      AckLabel->Caption="SUCCESSFUL";
  50.      KeyOKLabel->Font->Color=clGreen;
  51.      EEPROMStatusLabel->Caption="READY";
  52.    }
  53.    else
  54.    {
  55.      KeyOKLabel->Caption="FAULT";            //Verification not passed
  56.      AckLabel->Caption="NOT SUCCESSFUL";           
  57.      KeyOKLabel->Font->Color=clRed;
  58.      EEPROMStatusLabel->Caption="NOT PRESENT";
  59.    }
  60.  
  61.    return(WrittenData);
  62. }
  63. //---------------------------------------------------------------------------
  64. void TSpuntoHardwareKeyProgrammerForm::TheDelay(int DelayUnit)         //Delay
  65. {
  66. int I;
  67.   for(I=DelayUnit; I>=0; I--) {}
  68. }
  69.  
  70. //---------------------------------------------------------------------------
  71. void TSpuntoHardwareKeyProgrammerForm::Low_SDA(void)
  72. {                 // Sets SDA LOW
  73.   datain=SpuntoHardwarePort->ReadPort(MCRAddress);
  74.   datain=(datain & 0xFE);      // SDA=DTR bit to 0
  75.   SpuntoHardwarePort->WritePort(MCRAddress,datain);
  76.   TheDelay(DefaultDelay);
  77. }
  78. //---------------------------------------------------------------------------
  79. void TSpuntoHardwareKeyProgrammerForm::High_SDA(void)
  80. {                 // Sets SDA High
  81.   datain=SpuntoHardwarePort->ReadPort(MCRAddress);
  82.   datain=(datain | 0x01);      // SDA=DTR bit to 1
  83.   SpuntoHardwarePort->WritePort(MCRAddress,datain);
  84.   TheDelay(DefaultDelay);
  85. }
  86. //---------------------------------------------------------------------------
  87. void TSpuntoHardwareKeyProgrammerForm::Low_SCL(void)
  88. {                 // Sets SCL LOW
  89.   datain=SpuntoHardwarePort->ReadPort(MCRAddress);
  90.   datain=(datain & 0xFD);      // SCL=RTS bit to 0
  91.   SpuntoHardwarePort->WritePort(MCRAddress,datain);
  92.   TheDelay(DefaultDelay);
  93. }
  94. //---------------------------------------------------------------------------
  95. void TSpuntoHardwareKeyProgrammerForm::High_SCL(void)
  96. {                 // Sets SCL High
  97.   datain=SpuntoHardwarePort->ReadPort(MCRAddress);
  98.   datain=(datain | 0x02);      // SCL=RTS bit to 1
  99.   SpuntoHardwarePort->WritePort(MCRAddress,datain);
  100.   TheDelay(DefaultDelay);
  101. }
  102. //---------------------------------------------------------------------------
  103. void TSpuntoHardwareKeyProgrammerForm::Start(void)
  104. {
  105. // Start condition: SDA Low SCL High
  106.    High_SDA();
  107.    High_SCL();
  108.    Low_SDA();
  109.    Low_SCL();
  110. }
  111. //---------------------------------------------------------------------------
  112. void TSpuntoHardwareKeyProgrammerForm::Stop(void)
  113. {
  114. // Stop condition: SDA High SCL High
  115.    Low_SDA();
  116.    High_SCL();
  117.    High_SDA();
  118.    Low_SCL();
  119.    Low_SDA();
  120. }
  121. //---------------------------------------------------------------------------
  122. void TSpuntoHardwareKeyProgrammerForm::Output_byte(byte Out_byte)
  123. {
  124. //
  125.    int I;
  126.    for(I=7; I>=0; I--)
  127.    {
  128.          bitout=Out_byte >>I;
  129.      if ((bitout & 0x01) == 0)
  130.      {
  131.         Low_SDA();
  132.      }
  133.      else
  134.      {
  135.         High_SDA();
  136.      }
  137.      High_SCL();
  138.      Low_SCL();
  139.    }
  140. }
  141. //---------------------------------------------------------------------------
  142. byte TSpuntoHardwareKeyProgrammerForm::Input_byte(void)
  143. {
  144. //
  145.    byte Inp_byte=0x00;
  146.    int I;
  147.    High_SDA();
  148.    for (I=0; I<8; I++)
  149.    {
  150.      High_SCL();
  151.          TheDelay(1000);
  152.          datain=SpuntoHardwarePort->ReadPort(MSRAddress);
  153.          bitin=(datain & 0x10);
  154.          bitin=bitin>>4;
  155.          Inp_byte=(Inp_byte | bitin);
  156.          if (I<7) {Inp_byte=Inp_byte << 1;}
  157.      Low_SCL();
  158.    }
  159.  
  160.    return(Inp_byte);
  161. }
  162.  
  163. //---------------------------------------------------------------------------
  164. byte TSpuntoHardwareKeyProgrammerForm::Acknowledge(void)
  165. {
  166. //
  167.    High_SDA();
  168.    High_SCL();
  169.    datain=SpuntoHardwarePort->ReadPort(MSRAddress);
  170.    bitin=(datain & 0x10);
  171.    bitin=bitin>>4;
  172.    if (bitin==0)
  173.    {
  174.      bitout=0;
  175.      AckLabel->Caption="SUCCESSFUL";
  176.      EEPROMStatusLabel->Caption="READY";
  177.    }
  178.    else
  179.    {
  180.      bitout=1;
  181.      AckLabel->Caption="NOT SUCCESSFUL";
  182.      EEPROMStatusLabel->Caption="NOT PRESENT";
  183.    }
  184.    Low_SCL();
  185.    return(bitout);
  186. }
  187. //---------------------------------------------------------------------------
  188. void TSpuntoHardwareKeyProgrammerForm::Write_data(int Address, byte Data)
  189. {
  190. //
  191. byte Control_Byte, Memory_Block;
  192.  
  193.    Memory_Block=Address >>8;
  194.    Memory_Block=Memory_Block <<1;
  195.    Control_Byte=0xa0;                             //1010 0000 Control Code 1010
  196.    Control_Byte=(Control_Byte | Memory_Block);    //Sets the control byte
  197.    Start();                                       //Start bit
  198.    Output_byte(Control_Byte);                     //Control Byte
  199.    Acknowledge();
  200.    Output_byte(Address&0xff);                     //Address Byte
  201.    Acknowledge();
  202.    Output_byte(Data);                               //Data Byte
  203.    Acknowledge();                                 //Stop bit
  204.    Stop();
  205. }
  206.  
  207. //---------------------------------------------------------------------------
  208. byte TSpuntoHardwareKeyProgrammerForm::Read_data(int Address)
  209. {
  210. //
  211. byte Control_Byte, Memory_Block, DataValue;
  212.    Memory_Block=Address >>8;
  213.    Memory_Block=Memory_Block <<1;
  214.    Control_Byte=0xa0;                             //1010 0000 Control Code 1010
  215.    Control_Byte=(Control_Byte | Memory_Block);    //Sets the control byte
  216.    Start();
  217.    Output_byte(Control_Byte);
  218.    Acknowledge();
  219.    Output_byte(Address&0xff);
  220.    Acknowledge();
  221.    Start();
  222.    Control_Byte=(Control_Byte | 0x01);          //Sets R-/W bit to 1 (Read)
  223.    Output_byte(Control_Byte);
  224.    Acknowledge();
  225.    DataValue=Input_byte();
  226.    Stop();
  227.  
  228.    return(DataValue);
  229.  }
  230.  
  231. //---------------------------------------------------------------------------
  232. __fastcall TSpuntoHardwareKeyProgrammerForm::TSpuntoHardwareKeyProgrammerForm(TComponent* Owner)
  233.         : TForm(Owner)
  234. {
  235. }
  236.  
  237.  
  238. //---------------------------------------------------------------------------
  239. void __fastcall TSpuntoHardwareKeyProgrammerForm::PeriodTrackBarChange(TObject *Sender)
  240. {                           //PeriodTrackbar management
  241. DefaultDelay=(PeriodTrackBar->Position)*100;
  242. Label1->Caption = IntToStr(PeriodTrackBar->Position);
  243. }
  244. //---------------------------------------------------------------------------
  245. void __fastcall TSpuntoHardwareKeyProgrammerForm::FormCreate(TObject *Sender)
  246. {
  247. // Sets the labels
  248. Label1->Caption = IntToStr(PeriodTrackBar->Position);
  249.  
  250. // Default (COM1) Port setup
  251.   CombaseAddress=0x03f8;
  252.   MCRAddress=CombaseAddress+4;
  253.   LCRAddress=CombaseAddress+3;
  254.   MSRAddress=CombaseAddress+6;
  255.  
  256.   Contabit=0;
  257.   DefaultDelay=(PeriodTrackBar->Position)*100;
  258.  
  259.   EEPROMCheck();
  260.  
  261.   }
  262. //---------------------------------------------------------------------------
  263. void __fastcall TSpuntoHardwareKeyProgrammerForm::PowerONSpeedButtonClick(TObject *Sender)
  264. {                               //Power ON
  265.  
  266. }
  267. //---------------------------------------------------------------------------
  268. void __fastcall TSpuntoHardwareKeyProgrammerForm::COM1RadioButtonClick(TObject *Sender)
  269. {
  270. // COM1 Port setup
  271.   CombaseAddress=0x03f8;
  272.   MCRAddress=CombaseAddress+4;
  273.   LCRAddress=CombaseAddress+3;
  274.   MSRAddress=CombaseAddress+6;
  275. }
  276. //---------------------------------------------------------------------------
  277.  
  278. void __fastcall TSpuntoHardwareKeyProgrammerForm::COM2RadioButtonClick(TObject *Sender)
  279. {
  280. // COM2 Port setup
  281.   CombaseAddress=0x02f8;
  282.   MCRAddress=CombaseAddress+4;
  283.   LCRAddress=CombaseAddress+3;
  284.   MSRAddress=CombaseAddress+6;
  285. }
  286. //---------------------------------------------------------------------------
  287. void __fastcall TSpuntoHardwareKeyProgrammerForm::WriteEEPROMClick(
  288.       TObject *Sender)
  289. {
  290. int ProgramAddress;
  291. byte ProgramData, WrittenData, IsEEPROMReady;
  292.  
  293.   ProgramAddress=CSpinEditAddress->Value;
  294.   ProgramData=CSpinEditData->Value;
  295.  
  296.   Write_data(ProgramAddress, ProgramData);       //Writes the EEPROM
  297.   WrittenData=Read_data(ProgramAddress);         //Reads written data
  298.  
  299.   if ((WrittenData==ProgramData)& ( WrittenData!=0)) //Verifies written data
  300.    {
  301.      AckLabel->Caption="SUCCESSFUL";
  302.      EEPROMStatusLabel->Caption="READY";
  303.    }
  304.    else
  305.    {
  306.      AckLabel->Caption="NOT SUCCESSFUL";
  307.      EEPROMStatusLabel->Caption="NOT PRESENT";
  308.    }
  309. }
  310. //---------------------------------------------------------------------------
  311.  
  312.  
  313. void __fastcall TSpuntoHardwareKeyProgrammerForm::SCL_LOW_ButtonClick(TObject *Sender)
  314. {
  315.  Low_SCL();
  316. }                   
  317. //---------------------------------------------------------------------------
  318.  
  319. void __fastcall TSpuntoHardwareKeyProgrammerForm::SDA_LOW_ButtonClick(
  320.       TObject *Sender)
  321. {
  322.  Low_SDA();
  323. }
  324. //---------------------------------------------------------------------------
  325.  
  326. void __fastcall TSpuntoHardwareKeyProgrammerForm::SCL_HIGH_ButtonClick(
  327.       TObject *Sender)
  328. {
  329.  High_SCL();        
  330. }
  331. //---------------------------------------------------------------------------
  332.  
  333. void __fastcall TSpuntoHardwareKeyProgrammerForm::SDA_HIGH_ButtonClick(
  334.       TObject *Sender)
  335. {
  336.  High_SDA();        
  337. }
  338. //---------------------------------------------------------------------------
  339.  
  340. void __fastcall TSpuntoHardwareKeyProgrammerForm::HardwareKeyONButtonClick(
  341.       TObject *Sender)
  342. {
  343.    HardwareDeviceSerialON(CombaseAddress);
  344. }
  345. //---------------------------------------------------------------------------
  346.  
  347. void __fastcall TSpuntoHardwareKeyProgrammerForm::ReadEEPROMButtonClick(
  348.       TObject *Sender)
  349. {
  350. int QueryAddress;
  351. Byte FirstByteRead,SecondByteRead;
  352.  
  353. QueryAddress=CSpinEditAddress->Value;
  354. FirstByteRead=Read_data(QueryAddress);              //Reads EEPROM twice
  355. SecondByteRead=Read_data(QueryAddress);
  356.  
  357.   if ((FirstByteRead==SecondByteRead)& ( SecondByteRead!=0)) //Verifies read data
  358.    {
  359.      AckLabel->Caption="SUCCESSFUL";                //Verification passed
  360.      EEPROMStatusLabel->Caption="READY";
  361.      CSpinEditData->Font->Color=clWindowText;
  362.    }
  363.    else
  364.    {
  365.      AckLabel->Caption="NOT SUCCESSFUL";            //Verification not passed
  366.      EEPROMStatusLabel->Caption="NOT PRESENT";
  367.      CSpinEditData->Font->Color=clRed;
  368.    }
  369.  
  370. CSpinEditData->Value=SecondByteRead;
  371. }
  372. //---------------------------------------------------------------------------
  373.  
  374.  
  375. void __fastcall TSpuntoHardwareKeyProgrammerForm::CheckEEPROMButtonClick(
  376.       TObject *Sender)
  377. {
  378. EEPROMCheck();
  379. }
  380. //---------------------------------------------------------------------------
  381.  
  382. void __fastcall TSpuntoHardwareKeyProgrammerForm::CSpinEditAddressChange(
  383.       TObject *Sender)
  384. {
  385. int QueryAddress;
  386. Byte FirstByteRead,SecondByteRead;
  387.  
  388. QueryAddress=CSpinEditAddress->Value;
  389. FirstByteRead=Read_data(QueryAddress);              //Reads EEPROM twice
  390. SecondByteRead=Read_data(QueryAddress);
  391.  
  392.   if ((FirstByteRead==SecondByteRead)& ( SecondByteRead!=0)) //Verifies read data
  393.    {
  394.      AckLabel->Caption="SUCCESSFUL";                //Verification passed
  395.      EEPROMStatusLabel->Caption="READY";
  396.      CSpinEditData->Font->Color=clWindowText;
  397.    }
  398.    else
  399.    {
  400.      AckLabel->Caption="NOT SUCCESSFUL";            //Verification not passed
  401.      EEPROMStatusLabel->Caption="NOT PRESENT";
  402.      CSpinEditData->Font->Color=clRed;
  403.    }
  404.  
  405. CSpinEditData->Value=SecondByteRead;
  406. }
  407. //---------------------------------------------------------------------------
  408.  
  409.  
  410.