xmodem.h File Reference

Go to the source code of this file.

Data Structures

struct  XMODEM_BUFFER
struct  XMODEM_CONTROL

Defines

#define XMODEM_BLOCK_SIZE   128
#define XMODEM_RETRIES   20
#define XMODEM_SOH   0x01
#define XMODEM_STX   0x02
#define XMODEM_EOT   0x04
#define XMODEM_ACK   0x06
#define XMODEM_NAK   0x15
#define XMODEM_ETB   0x17
#define XMODEM_CAN   0x18
#define XMODEM_CHAR_C   0x43

Functions

void XmodemInit (void)
void XmodemSvc (void)
void XmodemRxReset (void)
void XmodemRxStart (void)
bool XmodemStatusCheck (void)
bool XmodemCrcCheck (U8 *pData)

Variables

XMODEM_CONTROL XmodemCtrl


Define Documentation

#define XMODEM_ACK   0x06

Definition at line 9 of file xmodem.h.

#define XMODEM_BLOCK_SIZE   128

Definition at line 4 of file xmodem.h.

#define XMODEM_CAN   0x18

Definition at line 12 of file xmodem.h.

#define XMODEM_CHAR_C   0x43

Definition at line 13 of file xmodem.h.

#define XMODEM_EOT   0x04

Definition at line 8 of file xmodem.h.

#define XMODEM_ETB   0x17

Definition at line 11 of file xmodem.h.

#define XMODEM_NAK   0x15

Definition at line 10 of file xmodem.h.

#define XMODEM_RETRIES   20

Definition at line 5 of file xmodem.h.

#define XMODEM_SOH   0x01

Definition at line 6 of file xmodem.h.

#define XMODEM_STX   0x02

Definition at line 7 of file xmodem.h.


Function Documentation

bool XmodemCrcCheck ( U8 pData  ) 

Definition at line 66 of file xmodem.c.

00066                               {
00067     U16 Crc16,DataCrc16;
00068     U8 ByteCount;
00069     U8 i;
00070 
00071     Crc16=0;
00072     DataCrc16=0;
00073     ByteCount=128;
00074     while(ByteCount--){
00075         Crc16=Crc16^((U16)*pData++<<8);
00076         for(i=0;i<8;i++){
00077             if(Crc16&0x8000) Crc16=(Crc16<<1)^0x1021;
00078             else Crc16=Crc16<<1;
00079         }
00080     }
00081     DataCrc16=(*pData++)*0x100;
00082     DataCrc16+=*pData;
00083     if(DataCrc16==Crc16) return true;
00084     else return false;
00085 }

void XmodemInit ( void   ) 

void XmodemRxReset ( void   ) 

void XmodemRxStart ( void   ) 

Definition at line 41 of file xmodem.c.

00041                         {
00042      XmodemRxReset();
00043      XmodemCtrl.State=XmodemRxState;
00044 }

bool XmodemStatusCheck ( void   ) 

Definition at line 45 of file xmodem.c.

00045                             {
00046     if(XmodemCtrl.State==XmodemIdleState) return true;
00047     else return false;
00048 }

void XmodemSvc ( void   ) 

Definition at line 86 of file xmodem.c.

00086                     {
00087     U8 Data;
00088     U8 i;
00089 
00090     if(XmodemCtrl.State==XmodemIdleState) return;
00091     if(XmodemCtrl.Timer==0){
00092         Uart1TxBufferPut(XMODEM_CHAR_C);
00093         while(Uart1TxBufferCheck()!=BUFFER_EMPTY) Uart1Svc();    // for uart tx
00094         while(Uart1Ctrl.UartTxTransmit==1) Uart1Svc();
00095         XmodemCtrl.Timer=3000; 
00096     }
00097     if(Uart1RxBufferCheck()==BUFFER_EMPTY) return;
00098     XmodemCtrl.Timer=30000;         // packet time out value 30000*1ms=3sec
00099     while(1){
00100         while(Uart1RxBufferCheck()==BUFFER_EMPTY) OsEventWait(&Uart1Ctrl.Uart1Event,0xffff);
00101         //while(Uart1RxBufferCheck()==BUFFER_EMPTY) OsYield();
00102         while(Uart1RxBufferCheck()!=BUFFER_EMPTY){
00103             if(XmodemCtrl.Timer==0) break;
00104             Data=Uart1RxBufferGet();
00105             switch(XmodemCtrl.SubState){
00106                 case XmodemSohSubstate:
00107                     if(Data==XMODEM_SOH) XmodemCtrl.SubState=XmodemBlockNumberSubstate;
00108                     else if(Data==XMODEM_EOT){                                 // force receiver to send 'C'
00109                         Uart1TxBufferPut(XMODEM_ACK);
00110                         while(Uart1TxBufferCheck()!=BUFFER_EMPTY) Uart1Svc();    // for usrt tx
00111                         while(Uart1Ctrl.UartTxTransmit==1) Uart1Svc();
00112                         XmodemCtrl.ReceiveFinish=true;
00113                     }
00114                     else if(Data==XMODEM_ETB){                                 // force receiver to send 'C'
00115                         Uart1TxBufferPut(XMODEM_ACK);
00116                         while(Uart1TxBufferCheck()!=BUFFER_EMPTY) Uart1Svc();    // for usrt tx
00117                         while(Uart1Ctrl.UartTxTransmit==1) Uart1Svc();
00118                         XmodemCtrl.ReceiveFinish=true;
00119                     }
00120                     else if(Data==XMODEM_CAN){                                         // force receiver to send 'C'
00121                         Uart1TxBufferPut(XMODEM_ACK);
00122                         while(Uart1TxBufferCheck()!=BUFFER_EMPTY) Uart1Svc();    // for usrt tx
00123                         while(Uart1Ctrl.UartTxTransmit==1) Uart1Svc();
00124                         XmodemCtrl.ReceiveFinish=true;
00125                     }
00126                     else{
00127                         XmodemCtrl.Error=1;
00128                         XmodemCtrl.ErrorCode=1;
00129                         XmodemCtrl.ErrorRecord=Data;
00130                     }
00131                     break;
00132                 case XmodemBlockNumberSubstate:
00133                     if(Data==XmodemCtrl.BlockNumber) XmodemCtrl.SubState=XmodemBlockNumber2Substate;
00134                     else{
00135                         XmodemCtrl.Error=1;
00136                         XmodemCtrl.ErrorCode=2;
00137                     }
00138                     break;
00139                 case XmodemBlockNumber2Substate:
00140                     if(Data==(0xff-XmodemCtrl.BlockNumber)){
00141                         XmodemCtrl.SubState=XmodemDataSubstate;
00142                         XmodemCtrl.Buffer.Put=0;
00143                     }
00144                     else{
00145                         XmodemCtrl.Error=1;
00146                         XmodemCtrl.ErrorCode=3;
00147                     }
00148                     break;
00149                 case XmodemDataSubstate:
00150                     XmodemCtrl.Buffer.Data[XmodemCtrl.Buffer.Put]=Data;
00151                     XmodemCtrl.Buffer.Put++;
00152                     if(XmodemCtrl.Buffer.Put==130){
00153                         XmodemCtrl.NewBlock=1;
00154                     }
00155                     break;
00156             }
00157             if(XmodemCtrl.NewBlock==1) break;
00158             if(XmodemCtrl.Error==1) break;
00159         }
00160         if(XmodemCtrl.NewBlock==1){
00161             XmodemCtrl.NewBlock=0;
00162             if(XmodemCrcCheck(XmodemCtrl.Buffer.Data)==true){
00163                 XmodemCtrl.BlockNumber++;
00164                 XmodemCtrl.TotalBlockCount++;
00165                 XmodemCtrl.ByteCount+=128;
00166                 for(i=0;i<128;i++) *XmodemCtrl.pData++=XmodemCtrl.Buffer.Data[i];
00167                 Uart1TxBufferPut(XMODEM_ACK);
00168                 while(Uart1TxBufferCheck()!=BUFFER_EMPTY) Uart1Svc();    // for usrt tx
00169                 while(Uart1Ctrl.UartTxTransmit==1) Uart1Svc();
00170                 XmodemCtrl.Timer=30000;
00171                 XmodemCtrl.SubState=XmodemSohSubstate;
00172             }
00173             else{
00174                 XmodemCtrl.Error=1;
00175                 XmodemCtrl.ErrorCode=4;
00176             }
00177         }
00178         if(XmodemCtrl.Error==1){
00179             Uart1TxBufferPut(XMODEM_NAK);
00180             while(Uart1TxBufferCheck()!=BUFFER_EMPTY) Uart1Svc();    // for usrt tx
00181             while(Uart1Ctrl.UartTxTransmit==1) Uart1Svc();
00182             XmodemCtrl.State=XmodemIdleState;
00183         }
00184         if(XmodemCtrl.ReceiveFinish==true){
00185             XmodemCtrl.State=XmodemIdleState;
00186             XmodemCtrl.SubState=XmodemSohSubstate;
00187         }
00188         if(XmodemCtrl.Timer==0) XmodemCtrl.State=XmodemIdleState;
00189         if(XmodemCtrl.State==XmodemIdleState) break;
00190     }
00191 }


Variable Documentation

Definition at line 22 of file xmodem.c.


Generated on Sat Apr 10 23:28:08 2010 for 80X86 MULTI-TASKING OPERATION SYSTEM by  doxygen 1.5.9