Browse Source

Merge pull request #341 from armink/master

[YModem] YModem optimization;
[BSP] Add more error handling in STM32F1 bsp.
Bernard Xiong 10 years ago
parent
commit
e41fe36a08

+ 23 - 12
bsp/stm32f10x/drivers/usart.c

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

+ 6 - 5
components/utilities/ymodem/ymodem.c

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

+ 6 - 1
components/utilities/ymodem/ymodem.h

@@ -55,6 +55,11 @@ enum rym_code {
 #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 {
     RYM_STAGE_NONE,
     /* set when C is send */
@@ -128,7 +133,7 @@ struct rym_ctx
  * @param handshake_timeout the timeout when hand shaking. The unit is in
  * 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,
         int handshake_timeout);