📄 xmodem_8c-source.html
字号:
00124 {00125 <span class="comment">// is this the packet we were waiting for?</span>00126 <span class="keywordflow">if</span>(xmbuf[1] == seqnum)00127 {00128 <span class="comment">// write/deliver data</span>00129 write(&xmbuf[3], pktsize);00130 <span class="comment">//spiflashWrite(flashaddr, pktsize, &xmbuf[3]);</span>00131 totalbytes += pktsize;00132 <span class="comment">// next sequence number</span>00133 seqnum++;00134 <span class="comment">// reset retries</span>00135 retry = XMODEM_RETRY_LIMIT;00136 <span class="comment">// reply with ACK</span>00137 response = ACK;00138 <span class="keywordflow">continue</span>;00139 }00140 <span class="keywordflow">else</span> <span class="keywordflow">if</span>(xmbuf[1] == (<span class="keywordtype">unsigned</span> char)(seqnum-1))00141 {00142 <span class="comment">// this is a retransmission of the last packet</span>00143 <span class="comment">// ACK and move on</span>00144 response = ACK;00145 <span class="keywordflow">continue</span>;00146 }00147 <span class="keywordflow">else</span>00148 {00149 <span class="comment">// we are completely out of sync</span>00150 <span class="comment">// cancel transmission</span>00151 <a class="code" href="group__xmodem.html#ga5">xmodemInFlush</a>();00152 xmodemOut(CAN);00153 xmodemOut(CAN);00154 xmodemOut(CAN);00155 <span class="keywordflow">return</span> XMODEM_ERROR_OUTOFSYNC;00156 }00157 }00158 <span class="keywordflow">else</span>00159 {00160 <span class="comment">// packet was corrupt</span>00161 <span class="comment">// NAK it and try again</span>00162 retry--;00163 <a class="code" href="group__xmodem.html#ga5">xmodemInFlush</a>();00164 response = NAK;00165 <span class="keywordflow">continue</span>;00166 }00167 }00168 00169 <span class="comment">// exceeded retry count</span>00170 <a class="code" href="group__xmodem.html#ga5">xmodemInFlush</a>();00171 xmodemOut(CAN);00172 xmodemOut(CAN);00173 xmodemOut(CAN);00174 <span class="keywordflow">return</span> XMODEM_ERROR_RETRYEXCEED;00175 }00176 00177 <a name="l00178"></a><a class="code" href="group__xmodem.html#ga2">00178</a> <span class="keywordtype">long</span> <a class="code" href="group__xmodem.html#ga2">xmodemTransmit</a>( <span class="keywordtype">int</span> (*read)(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buffer, <span class="keywordtype">int</span> size) )00179 {00180 <span class="comment">// still to be written</span>00181 <span class="keywordflow">return</span> 0;00182 }00183 00184 uint16_t crc_xmodem_update(uint16_t crc, uint8_t data)00185 {00186 <span class="keywordtype">int</span> i;00187 00188 crc = crc ^ ((uint16_t)data << 8);00189 <span class="keywordflow">for</span> (i=0; i<8; i++)00190 {00191 <span class="keywordflow">if</span>(crc & 0x8000)00192 crc = (crc << 1) ^ 0x1021;00193 <span class="keywordflow">else</span>00194 crc <<= 1;00195 }00196 00197 <span class="keywordflow">return</span> crc;00198 }00199 <a name="l00200"></a><a class="code" href="group__xmodem.html#ga3">00200</a> <span class="keywordtype">int</span> <a class="code" href="group__xmodem.html#ga3">xmodemCrcCheck</a>(<span class="keywordtype">int</span> crcflag, <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buffer, <span class="keywordtype">int</span> size)00201 {00202 <span class="comment">// crcflag=0 - do regular checksum</span>00203 <span class="comment">// crcflag=1 - do CRC checksum</span>00204 00205 <span class="keywordflow">if</span>(crcflag)00206 {00207 <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> crc=0;00208 <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> pktcrc = (buffer[size]<<8)+buffer[size+1];00209 <span class="comment">// do CRC checksum</span>00210 <span class="keywordflow">while</span>(size--)00211 crc = crc_xmodem_update(crc, *buffer++);00212 <span class="comment">// check checksum against packet</span>00213 <span class="keywordflow">if</span>(crc == pktcrc)00214 <span class="keywordflow">return</span> 1;00215 }00216 <span class="keywordflow">else</span>00217 {00218 <span class="keywordtype">int</span> i;00219 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> cksum = 0;00220 <span class="comment">// do regular checksum</span>00221 <span class="keywordflow">for</span>(i=0; i<size; ++i)00222 {00223 cksum += buffer[i];00224 }00225 <span class="comment">// check checksum against packet</span>00226 <span class="keywordflow">if</span>(cksum == buffer[size])00227 <span class="keywordflow">return</span> 1;00228 }00229 00230 <span class="keywordflow">return</span> 0;00231 }00232 00233 <a name="l00234"></a><a class="code" href="group__xmodem.html#ga4">00234</a> <span class="keywordtype">int</span> <a class="code" href="group__xmodem.html#ga4">xmodemInTime</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> timeout)00235 {00236 <span class="keywordtype">int</span> c=-1;00237 00238 <span class="keywordflow">while</span>( (timeout--) && ((c=xmodemIn()) < 0) )00239 <a class="code" href="group__timer.html#ga10">timerPause</a>(1);00240 00241 <span class="keywordflow">return</span> c;00242 }00243 <a name="l00244"></a><a class="code" href="group__xmodem.html#ga5">00244</a> <span class="keywordtype">void</span> <a class="code" href="group__xmodem.html#ga5">xmodemInFlush</a>(<span class="keywordtype">void</span>)00245 {00246 <span class="keywordflow">while</span>(<a class="code" href="group__xmodem.html#ga4">xmodemInTime</a>(XMODEM_TIMEOUT_DELAY) >= 0);00247 }</pre></div><hr size="1"><address style="align: right;"><small>Generated on Sun Oct 29 03:41:08 2006 for Procyon AVRlib by <a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.2 </small></address></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -