diff options
| author | Bernard Xiong <[email protected]> | 2014-07-15 18:12:15 +0800 |
|---|---|---|
| committer | Bernard Xiong <[email protected]> | 2014-07-15 18:12:15 +0800 |
| commit | 19ef55375a39a2ae1ed662ec07baad528c419940 (patch) | |
| tree | ff41a6f165cbff4eaa0fb55cce9e457fd5df1dac | |
| parent | 0bc57e9b8223181d4827eb4c422776bf72dc5a3a (diff) | |
| parent | 2aa51d42f910781cc25747347eea4e0ae6bd1b77 (diff) | |
Merge pull request #299 from grissiom/next-ymodem
Next ymodem
| -rw-r--r-- | components/utilities/ymodem/ymodem.c | 25 | ||||
| -rw-r--r-- | components/utilities/ymodem/ymodem.h | 2 |
2 files changed, 16 insertions, 11 deletions
diff --git a/components/utilities/ymodem/ymodem.c b/components/utilities/ymodem/ymodem.c index fdd1950cc0..f5ebeab832 100644 --- a/components/utilities/ymodem/ymodem.c +++ b/components/utilities/ymodem/ymodem.c @@ -70,18 +70,23 @@ static enum rym_code _rym_read_code( struct rym_ctx *ctx, rt_tick_t timeout) { - /* consume the available sem and read the data in buffer if possible */ - while (rt_sem_trytake(&ctx->sem) == RT_EOK) - ; + /* Fast path */ if (rt_device_read(ctx->dev, 0, ctx->buf, 1) == 1) return *ctx->buf; - /* no data yet, wait for one */ - if (rt_sem_take(&ctx->sem, timeout) != RT_EOK) - return RYM_CODE_NONE; - /* read one */ - if (rt_device_read(ctx->dev, 0, ctx->buf, 1) == 1) - return *ctx->buf; - return RYM_CODE_NONE; + + /* Slow path */ + do { + rt_size_t rsz; + + /* No data yet, wait for one */ + if (rt_sem_take(&ctx->sem, timeout) != RT_EOK) + return RYM_CODE_NONE; + + /* Try to read one */ + rsz = rt_device_read(ctx->dev, 0, ctx->buf, 1); + if (rsz == 1) + return *ctx->buf; + } while (1); } /* the caller should at least alloc _RYM_STX_PKG_SZ buffer */ diff --git a/components/utilities/ymodem/ymodem.h b/components/utilities/ymodem/ymodem.h index daed61d15f..43ee6f5c10 100644 --- a/components/utilities/ymodem/ymodem.h +++ b/components/utilities/ymodem/ymodem.h @@ -52,7 +52,7 @@ 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 enum rym_stage { |
