Просмотр исходного кода

Merge pull request #1041 from HiFiPhile/vdc

Fix vendor fifo deadlock, add tud_vendor_n_read_flush
Ha Thach 4 лет назад
Родитель
Сommit
8d97f0e81f
2 измененных файлов с 16 добавлено и 0 удалено
  1. 9 0
      src/class/vendor/vendor_device.c
  2. 7 0
      src/class/vendor/vendor_device.h

+ 9 - 0
src/class/vendor/vendor_device.c

@@ -103,6 +103,13 @@ uint32_t tud_vendor_n_read (uint8_t itf, void* buffer, uint32_t bufsize)
   return num_read;
 }
 
+void tud_vendor_n_read_flush (uint8_t itf)
+{
+  vendord_interface_t* p_itf = &_vendord_itf[itf];
+  tu_fifo_clear(&p_itf->rx_ff);
+  _prep_out_transaction(p_itf);
+}
+
 //--------------------------------------------------------------------+
 // Write API
 //--------------------------------------------------------------------+
@@ -199,6 +206,8 @@ uint16_t vendord_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, ui
     TU_BREAKPOINT();
   }
 
+  maybe_transmit(p_vendor);
+
   return drv_len;
 }
 

+ 7 - 0
src/class/vendor/vendor_device.h

@@ -45,6 +45,7 @@ bool     tud_vendor_n_mounted         (uint8_t itf);
 uint32_t tud_vendor_n_available       (uint8_t itf);
 uint32_t tud_vendor_n_read            (uint8_t itf, void* buffer, uint32_t bufsize);
 bool     tud_vendor_n_peek            (uint8_t itf, uint8_t* u8);
+void     tud_vendor_n_read_flush      (uint8_t itf);
 
 uint32_t tud_vendor_n_write           (uint8_t itf, void const* buffer, uint32_t bufsize);
 uint32_t tud_vendor_n_write_available (uint8_t itf);
@@ -59,6 +60,7 @@ static inline bool     tud_vendor_mounted         (void);
 static inline uint32_t tud_vendor_available       (void);
 static inline uint32_t tud_vendor_read            (void* buffer, uint32_t bufsize);
 static inline bool     tud_vendor_peek            (uint8_t* u8);
+static inline void     tud_vendor_read_flush      (void);
 static inline uint32_t tud_vendor_write           (void const* buffer, uint32_t bufsize);
 static inline uint32_t tud_vendor_write_str       (char const* str);
 static inline uint32_t tud_vendor_write_available (void);
@@ -99,6 +101,11 @@ static inline bool tud_vendor_peek (uint8_t* u8)
   return tud_vendor_n_peek(0, u8);
 }
 
+static inline void tud_vendor_read_flush(void)
+{
+    tud_vendor_n_read_flush(0);
+}
+
 static inline uint32_t tud_vendor_write (void const* buffer, uint32_t bufsize)
 {
   return tud_vendor_n_write(0, buffer, bufsize);