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

adding code to allow configure MIC2555 to pull down D+/D- (still need bit bangding I2C on PB_0 PB_1)
add back port reset after get 8 bytes of device descriptor

hathach 13 лет назад
Родитель
Сommit
c036efff1d

+ 1 - 1
demos/bsp/boards/board.h

@@ -57,7 +57,7 @@
 
 
 #include <stdint.h>
 #include <stdint.h>
 #include "common/compiler/compiler.h"
 #include "common/compiler/compiler.h"
-#include "common/binary.h" // This file is too good to not use
+#include "common/binary.h"
 
 
 #define BOARD_AT86RF2XX             1
 #define BOARD_AT86RF2XX             1
 #define BOARD_LPCXPRESSO1347        2
 #define BOARD_LPCXPRESSO1347        2

+ 62 - 0
demos/bsp/boards/board_ea4357.c

@@ -39,6 +39,8 @@
 
 
 #if BOARD == BOARD_EA4357
 #if BOARD == BOARD_EA4357
 
 
+#include "common/assertion.h" // TODO there is hal_debugger_ in assertion
+
 #define UART_PORT   LPC_USART0
 #define UART_PORT   LPC_USART0
 
 
 #if 0
 #if 0
@@ -48,6 +50,59 @@ static const struct {
 }leds[CFG_LED_NUMBER] = { {0, 8} };
 }leds[CFG_LED_NUMBER] = { {0, 8} };
 #endif
 #endif
 
 
+// MIC2555 1YML = 0101111, 0YML = 0101101
+#define MIC255_ADDR BIN8(0101111)
+
+static uint8_t mic255_regs_read(uint8_t regs_addr)
+{
+  uint8_t value;
+
+  ASSERT( SUCCESS == I2C_MasterTransferData(
+      LPC_I2C0,
+      & (I2C_M_SETUP_Type)
+      {
+        .sl_addr7bit         = MIC255_ADDR,
+        .retransmissions_max = 3,
+
+        .tx_data             = &regs_addr,
+        .tx_length           = 1,
+
+        .rx_data             = &value,
+        .rx_length           = 1
+      },
+      I2C_TRANSFER_POLLING), 0xFF);
+
+  return value;
+}
+
+static bool mic255_regs_write(uint8_t regs_addr, uint8_t data)
+{
+  uint8_t xfer_data[2] = { regs_addr, data} ;
+
+  ASSERT( SUCCESS == I2C_MasterTransferData(
+      LPC_I2C0,
+      & (I2C_M_SETUP_Type)
+      {
+        .sl_addr7bit         = MIC255_ADDR,
+        .retransmissions_max = 3,
+
+        .tx_data             = xfer_data,
+        .tx_length           = 2,
+      },
+      I2C_TRANSFER_POLLING), false);
+
+  return true;
+}
+
+
+static uint16_t mic255_get_vendorid(void)
+{
+  uint8_t vendor_low  = mic255_regs_read(0);
+  uint8_t vendor_high = mic255_regs_read(1);
+
+  return (vendor_high << 8) | vendor_low;
+}
+
 void board_init(void)
 void board_init(void)
 {
 {
   SystemInit();
   SystemInit();
@@ -61,6 +116,13 @@ void board_init(void)
   // USB1 Power: EA4357 channel A U20 is enabled by SJ5 connected to pad 1-2, no more action required
   // USB1 Power: EA4357 channel A U20 is enabled by SJ5 connected to pad 1-2, no more action required
   scu_pinmux(0x2, 5, MD_PLN | MD_EZI | MD_ZI, FUNC2);	// USB1_VBUS monitor presence, must be high for bus reset occur
   scu_pinmux(0x2, 5, MD_PLN | MD_EZI | MD_ZI, FUNC2);	// USB1_VBUS monitor presence, must be high for bus reset occur
 
 
+  // init I2C and set up MIC2555 to have 15k pull-down on USB1 D+ & D-
+//  I2C_Init(LPC_I2C0, 100000);
+//  I2C_Cmd(LPC_I2C0, ENABLE);
+//
+//  ASSERT_INT(0x058d, mic255_get_vendorid(), (void) 0); // verify vendor id
+//  ASSERT( mic255_regs_write(6, BIN8(1100)), (void) 0); // pull down D+/D- for host
+
 #if 0
 #if 0
   // Leds Init
   // Leds Init
 	for (uint8_t i=0; i<CFG_LED_NUMBER; i++)
 	for (uint8_t i=0; i<CFG_LED_NUMBER; i++)

+ 1 - 0
demos/bsp/boards/board_ea4357.h

@@ -60,6 +60,7 @@
 #include "lpc43xx_cgu.h"
 #include "lpc43xx_cgu.h"
 #include "lpc43xx_gpio.h"
 #include "lpc43xx_gpio.h"
 #include "lpc43xx_uart.h"
 #include "lpc43xx_uart.h"
+#include "lpc43xx_i2c.h"
 
 
 #define CFG_LED_NUMBER  0
 #define CFG_LED_NUMBER  0
 #define CFG_LED_ON               (1)
 #define CFG_LED_ON               (1)

+ 1 - 1
tinyusb/common/assertion.h

@@ -57,7 +57,7 @@ extern "C"
 #endif
 #endif
 
 
 #include "tusb_option.h"
 #include "tusb_option.h"
-#include "hal/hal.h"
+#include "hal/hal.h" // TODO find a way to break hal dependency
 
 
 //--------------------------------------------------------------------+
 //--------------------------------------------------------------------+
 // Compile-time Assert
 // Compile-time Assert

+ 0 - 8
tinyusb/host/ehci/ehci.c

@@ -452,14 +452,6 @@ void port_connect_status_change_isr(uint8_t hostid)
   if (regs->portsc_bit.current_connect_status) // device plugged
   if (regs->portsc_bit.current_connect_status) // device plugged
   {
   {
     hcd_port_reset(hostid);
     hcd_port_reset(hostid);
-
-    #ifndef _TEST_
-    // TODO finalize delay after reset, hack delay 100 ms, otherwise speed is detected as LOW in most cases
-    volatile uint32_t delay_us = 100000;
-    delay_us *= (SystemCoreClock / 1000000) / 3;
-    while(delay_us--);
-    #endif
-
     usbh_device_plugged_isr(hostid, regs->portsc_bit.nxp_port_speed); // NXP specific port speed
     usbh_device_plugged_isr(hostid, regs->portsc_bit.nxp_port_speed); // NXP specific port speed
   }else // device unplugged
   }else // device unplugged
   {
   {

+ 1 - 1
tinyusb/host/usbh.c

@@ -295,7 +295,7 @@ OSAL_TASK_DECLARE(usbh_enumeration_task)
     )
     )
   );
   );
 
 
-//  hcd_port_reset( usbh_devices[0].core_id ); // reset port after 8 byte descriptor
+  hcd_port_reset( usbh_devices[0].core_id ); // reset port after 8 byte descriptor
 
 
   //------------- Set new address -------------//
   //------------- Set new address -------------//
   new_addr = get_new_address();
   new_addr = get_new_address();