summaryrefslogtreecommitdiff
path: root/components/utilities/ymodem
diff options
context:
space:
mode:
Diffstat (limited to 'components/utilities/ymodem')
-rw-r--r--components/utilities/ymodem/ymodem.c13
-rw-r--r--components/utilities/ymodem/ymodem.h10
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,