00001 /******************** 00002 *Project: 80X86 32BIT MULTI TASKING OPERATING SYSTEM 00003 *Function: Xmodem protocol library 00004 * 00005 *File: xmodem.c 00006 *Author: Book Chen 00007 *Date: 2010.01.01 00008 ********************* 00009 */ 00010 #include "includes.h" 00011 00012 #define XmodemIdleState 0 00013 #define XmodemRxState 1 00014 00015 #define XmodemSohSubstate 0 00016 #define XmodemBlockNumberSubstate 1 00017 #define XmodemBlockNumber2Substate 2 00018 #define XmodemDataSubstate 3 00019 00020 #define XMODEM_DOWNLOAD_ADDRESS IMAGE_ADDRESS 00021 00022 XMODEM_CONTROL XmodemCtrl; 00023 00024 void XmodemInit(void){ 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 } 00041 void XmodemRxStart(void){ 00042 XmodemRxReset(); 00043 XmodemCtrl.State=XmodemRxState; 00044 } 00045 bool XmodemStatusCheck(void){ 00046 if(XmodemCtrl.State==XmodemIdleState) return true; 00047 else return false; 00048 } 00049 void XmodemRxReset(void){ 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 } 00066 bool XmodemCrcCheck(U8 *pData){ 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 } 00086 void XmodemSvc(void){ 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 } 00192
1.5.9