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 |
| 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 | ) |
Definition at line 24 of file xmodem.c.
00024 { 00025 XmodemCtrl.InUse=false; 00026 XmodemCtrl.NewBlock=0; 00027 XmodemCtrl.BlockNumber=1; 00028 XmodemCtrl.Error=0; 00029 XmodemCtrl.ErrorCount=0; 00030 XmodemCtrl.ErrorCode=0; 00031 XmodemCtrl.ErrorRecord=0; 00032 XmodemCtrl.Buffer.Put=0; 00033 XmodemCtrl.Buffer.Get=0; 00034 XmodemCtrl.ByteCount=0; 00035 XmodemCtrl.Timer=0; 00036 XmodemCtrl.ReceiveFinish=false; 00037 XmodemCtrl.pData=(U8 *)XMODEM_DOWNLOAD_ADDRESS; 00038 XmodemCtrl.State=XmodemIdleState; 00039 XmodemCtrl.SubState=XmodemSohSubstate; 00040 }
| void XmodemRxReset | ( | void | ) |
Definition at line 49 of file xmodem.c.
00049 { 00050 XmodemCtrl.NewBlock=0; 00051 XmodemCtrl.BlockNumber=1; 00052 XmodemCtrl.Error=0; 00053 XmodemCtrl.ErrorCount=0; 00054 XmodemCtrl.ErrorCode=0; 00055 XmodemCtrl.ErrorRecord=0; 00056 XmodemCtrl.Buffer.Put=0; 00057 XmodemCtrl.Buffer.Get=0; 00058 XmodemCtrl.ByteCount=0; 00059 XmodemCtrl.TotalBlockCount=0; 00060 XmodemCtrl.Timer=0; 00061 XmodemCtrl.ReceiveFinish=false; 00062 XmodemCtrl.pData=(U8 *)XMODEM_DOWNLOAD_ADDRESS; 00063 XmodemCtrl.State=XmodemIdleState; 00064 XmodemCtrl.SubState=XmodemSohSubstate; 00065 }
| 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 }
1.5.9