diff options
Diffstat (limited to 'components/utilities')
| -rw-r--r-- | components/utilities/ymodem/ymodem.c | 13 | ||||
| -rw-r--r-- | components/utilities/ymodem/ymodem.h | 10 |
2 files changed, 20 insertions, 3 deletions
diff --git a/components/utilities/ymodem/ymodem.c b/components/utilities/ymodem/ymodem.c index 3af1528024..e4d909e90f 100644 --- a/components/utilities/ymodem/ymodem.c +++ b/components/utilities/ymodem/ymodem.c @@ -174,6 +174,18 @@ static rt_err_t _rym_trans_data( return -RYM_ERR_SEQ; } + /* As we are sending C continuously, there is a chance that the + * sender(remote) receive an C after sending the first handshake package. + * So the sender will interpret it as NAK and re-send the package. So we + * just ignore it and proceed. */ + if (ctx->stage == RYM_STAGE_ESTABLISHED && ctx->buf[1] == 0x00) + { + *code = RYM_CODE_NONE; + return RT_EOK; + } + + ctx->stage = RYM_STAGE_TRANSMITTING; + /* sanity check */ recv_crc = (rt_uint16_t)(*(ctx->buf+tsz-1) << 8) | *(ctx->buf+tsz); if (recv_crc != CRC16(ctx->buf+3, data_sz)) @@ -214,7 +226,6 @@ static rt_err_t _rym_do_trans(struct rym_ctx *ctx) default: return -RYM_ERR_CODE; }; - ctx->stage = RYM_STAGE_TRANSMITTING; err = _rym_trans_data(ctx, data_sz, &code); if (err != RT_EOK) diff --git a/components/utilities/ymodem/ymodem.h b/components/utilities/ymodem/ymodem.h index daed61d15f..fe22bd8135 100644 --- a/components/utilities/ymodem/ymodem.h +++ b/components/utilities/ymodem/ymodem.h @@ -52,7 +52,12 @@ enum rym_code { #endif /* how many ticks between two handshake code. */ #ifndef RYM_CHD_INTV_TICK -#define RYM_CHD_INTV_TICK (RT_TICK_PER_SECOND / 4) +#define RYM_CHD_INTV_TICK (RT_TICK_PER_SECOND * 3) +#endif + +/* how many CAN be sent when user active end the session. */ +#ifndef RYM_END_SESSION_SEND_CAN_NUM +#define RYM_END_SESSION_SEND_CAN_NUM 0x07 #endif enum rym_stage { @@ -61,7 +66,8 @@ enum rym_stage { RYM_STAGE_ESTABLISHING, /* set when we've got the packet 0 and sent ACK and second C */ RYM_STAGE_ESTABLISHED, - /* set when the sender respond to our second C */ + /* set when the sender respond to our second C and recviever got a real + * data packet. */ RYM_STAGE_TRANSMITTING, /* set when the sender send a EOT */ RYM_STAGE_FINISHING, |
