Merge pull request #341 from armink/master

[YModem] YModem optimization;
[BSP] Add more error handling in STM32F1 bsp.
This commit is contained in:
Bernard Xiong 2014-09-14 19:42:32 +08:00
commit e41fe36a08
3 changed files with 35 additions and 18 deletions

View File

@ -21,19 +21,19 @@
#include <rtdevice.h> #include <rtdevice.h>
/* USART1 */ /* USART1 */
#define UART1_GPIO_TX GPIO_Pin_9 #define UART1_GPIO_TX GPIO_Pin_9
#define UART1_GPIO_RX GPIO_Pin_10 #define UART1_GPIO_RX GPIO_Pin_10
#define UART1_GPIO GPIOA #define UART1_GPIO GPIOA
/* USART2 */ /* USART2 */
#define UART2_GPIO_TX GPIO_Pin_2 #define UART2_GPIO_TX GPIO_Pin_2
#define UART2_GPIO_RX GPIO_Pin_3 #define UART2_GPIO_RX GPIO_Pin_3
#define UART2_GPIO GPIOA #define UART2_GPIO GPIOA
/* USART3_REMAP[1:0] = 00 */ /* USART3_REMAP[1:0] = 00 */
#define UART3_GPIO_TX GPIO_Pin_10 #define UART3_GPIO_TX GPIO_Pin_10
#define UART3_GPIO_RX GPIO_Pin_11 #define UART3_GPIO_RX GPIO_Pin_11
#define UART3_GPIO GPIOB #define UART3_GPIO GPIOB
/* STM32 uart driver */ /* STM32 uart driver */
struct stm32_uart struct stm32_uart
@ -163,7 +163,10 @@ void USART1_IRQHandler(void)
/* clear interrupt */ /* clear interrupt */
USART_ClearITPendingBit(uart->uart_device, USART_IT_TC); USART_ClearITPendingBit(uart->uart_device, USART_IT_TC);
} }
if (USART_GetFlagStatus(uart->uart_device, USART_FLAG_ORE) == SET)
{
stm32_getc(&serial1);
}
/* leave interrupt */ /* leave interrupt */
rt_interrupt_leave(); rt_interrupt_leave();
} }
@ -197,6 +200,10 @@ void USART2_IRQHandler(void)
/* clear interrupt */ /* clear interrupt */
USART_ClearITPendingBit(uart->uart_device, USART_IT_TC); USART_ClearITPendingBit(uart->uart_device, USART_IT_TC);
} }
if (USART_GetFlagStatus(uart->uart_device, USART_FLAG_ORE) == SET)
{
stm32_getc(&serial2);
}
/* leave interrupt */ /* leave interrupt */
rt_interrupt_leave(); rt_interrupt_leave();
@ -204,7 +211,7 @@ void USART2_IRQHandler(void)
#endif /* RT_USING_UART2 */ #endif /* RT_USING_UART2 */
#if defined(RT_USING_UART3) #if defined(RT_USING_UART3)
/* UART1 device driver structure */ /* UART3 device driver structure */
struct stm32_uart uart3 = struct stm32_uart uart3 =
{ {
USART3, USART3,
@ -231,6 +238,10 @@ void USART3_IRQHandler(void)
/* clear interrupt */ /* clear interrupt */
USART_ClearITPendingBit(uart->uart_device, USART_IT_TC); USART_ClearITPendingBit(uart->uart_device, USART_IT_TC);
} }
if (USART_GetFlagStatus(uart->uart_device, USART_FLAG_ORE) == SET)
{
stm32_getc(&serial3);
}
/* leave interrupt */ /* leave interrupt */
rt_interrupt_leave(); rt_interrupt_leave();
@ -282,7 +293,7 @@ static void GPIO_Configuration(void)
/* Configure USART Rx/tx PIN */ /* Configure USART Rx/tx PIN */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = UART2_GPIO_RX; GPIO_InitStructure.GPIO_Pin = UART2_GPIO_RX;
GPIO_Init(UART1_GPIO, &GPIO_InitStructure); GPIO_Init(UART2_GPIO, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = UART2_GPIO_TX; GPIO_InitStructure.GPIO_Pin = UART2_GPIO_TX;

View File

@ -197,7 +197,7 @@ static rt_err_t _rym_do_trans(struct rym_ctx *ctx)
{ {
rt_err_t err; rt_err_t err;
enum rym_code code; enum rym_code code;
rt_size_t data_sz; rt_size_t data_sz, i;
code = _rym_read_code(ctx, code = _rym_read_code(ctx,
RYM_WAIT_PKG_TICK); RYM_WAIT_PKG_TICK);
@ -223,8 +223,9 @@ static rt_err_t _rym_do_trans(struct rym_ctx *ctx)
{ {
case RYM_CODE_CAN: case RYM_CODE_CAN:
/* the spec require multiple CAN */ /* the spec require multiple CAN */
_rym_putchar(ctx, RYM_CODE_CAN); for (i = 0; i < RYM_END_SESSION_SEND_CAN_NUM; i++) {
_rym_putchar(ctx, RYM_CODE_CAN); _rym_putchar(ctx, RYM_CODE_CAN);
}
return -RYM_ERR_CAN; return -RYM_ERR_CAN;
case RYM_CODE_ACK: case RYM_CODE_ACK:
_rym_putchar(ctx, RYM_CODE_ACK); _rym_putchar(ctx, RYM_CODE_ACK);
@ -310,6 +311,7 @@ static rt_err_t _rym_do_recv(
rt_err_t rym_recv_on_device( rt_err_t rym_recv_on_device(
struct rym_ctx *ctx, struct rym_ctx *ctx,
rt_device_t dev, rt_device_t dev,
rt_uint16_t oflag,
rym_callback on_begin, rym_callback on_begin,
rym_callback on_data, rym_callback on_data,
rym_callback on_end, rym_callback on_end,
@ -340,7 +342,7 @@ rt_err_t rym_recv_on_device(
dev->flag &= ~RT_DEVICE_FLAG_STREAM; dev->flag &= ~RT_DEVICE_FLAG_STREAM;
rt_hw_interrupt_enable(int_lvl); rt_hw_interrupt_enable(int_lvl);
res = rt_device_open(dev, 0); res = rt_device_open(dev, oflag);
if (res != RT_EOK) if (res != RT_EOK)
goto __exit; goto __exit;
@ -363,4 +365,3 @@ __exit:
return res; return res;
} }

View File

@ -55,6 +55,11 @@ enum rym_code {
#define RYM_CHD_INTV_TICK (RT_TICK_PER_SECOND * 3) #define RYM_CHD_INTV_TICK (RT_TICK_PER_SECOND * 3)
#endif #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 { enum rym_stage {
RYM_STAGE_NONE, RYM_STAGE_NONE,
/* set when C is send */ /* set when C is send */
@ -128,7 +133,7 @@ struct rym_ctx
* @param handshake_timeout the timeout when hand shaking. The unit is in * @param handshake_timeout the timeout when hand shaking. The unit is in
* second. * second.
*/ */
rt_err_t rym_recv_on_device(struct rym_ctx *ctx, rt_device_t dev, rt_err_t rym_recv_on_device(struct rym_ctx *ctx, rt_device_t dev, rt_uint16_t oflag,
rym_callback on_begin, rym_callback on_data, rym_callback on_end, rym_callback on_begin, rym_callback on_data, rym_callback on_end,
int handshake_timeout); int handshake_timeout);