8 #include "sw/device/examples/demos.h" 
   16 #include "sw/device/lib/testing/pinmux_testutils.h" 
   17 #include "sw/device/lib/testing/test_framework/check.h" 
   18 #include "sw/device/lib/testing/test_framework/ottf_test_config.h" 
   19 #include "sw/device/lib/testing/usb_testutils.h" 
   20 #include "sw/device/lib/testing/usb_testutils_controlep.h" 
   21 #include "sw/device/lib/testing/usb_testutils_simpleserial.h" 
   26 #define USBDEV_BASE_ADDR TOP_EARLGREY_USBDEV_BASE_ADDR 
   27 #include "usbdev_regs.h"   
   29 #define REG32(add) *((volatile uint32_t *)(add)) 
   31 OTTF_DEFINE_TEST_CONFIG();
 
   36 static uint8_t config_descriptors[] = {
 
   38         USB_CFG_DSCR_LEN + 2 * (USB_INTERFACE_DSCR_LEN + 2 * USB_EP_DSCR_LEN),
 
   40     VEND_INTERFACE_DSCR(0, 2, 0x50, 1),
 
   41     USB_BULK_EP_DSCR(0, 1, 32, 0),
 
   42     USB_BULK_EP_DSCR(1, 1, 32, 4),
 
   43     VEND_INTERFACE_DSCR(1, 2, 0x50, 1),
 
   44     USB_BULK_EP_DSCR(0, 2, 32, 0),
 
   45     USB_BULK_EP_DSCR(1, 2, 32, 4),
 
   60 static char make_printable(
char c, 
char replacement) {
 
   61   if (c == 0xa || c == 0xd) {
 
   65   if (c < ' ' || c > 
'~') {
 
   71 static const size_t kExpectedUsbCharsRecved = 6;
 
   72 static size_t usb_chars_recved_total;
 
   74 static dif_gpio_t gpio;
 
   75 static dif_pinmux_t pinmux;
 
   76 static dif_uart_t uart;
 
   82 static void usb_receipt_callback_0(uint8_t c) {
 
   83   c = make_printable(c, 
'?');
 
   85   ++usb_chars_recved_total;
 
   87 static void usb_receipt_callback_1(uint8_t c) {
 
   88   c = make_printable(c + 1, 
'?');
 
   90   ++usb_chars_recved_total;
 
  103   for (
int i = 0; 
string[i] != 0; ++i) {
 
  104     CHECK_STATUS_OK(usb_testutils_simpleserial_send_byte(ss_ctx, 
string[i]));
 
  109 static const uint32_t kPinflipMask = (1 << 8);
 
  110 static const uint32_t kDiffXcvrMask = (1 << 9);
 
  111 static const uint32_t kUPhyMask = (1 << 10);
 
  127 void configure_pinmux(
void) {
 
  128   pinmux_testutils_init(&pinmux);
 
  130   for (
size_t i = 0; i < 
ARRAYSIZE(leds); ++i) {
 
  135   for (
size_t i = 0; i < 
ARRAYSIZE(switches); ++i) {
 
  141 void _ottf_main(
void) {
 
  142   CHECK_DIF_OK(dif_pinmux_init(
 
  146   CHECK_DIF_OK(dif_uart_init(
 
  148   CHECK(
kUartBaudrate <= UINT32_MAX, 
"kUartBaudrate must fit in uint32_t");
 
  150         "kClockFreqPeripheralHz must fit in uint32_t");
 
  168   LOG_INFO(
"Built at: " __DATE__ 
", " __TIME__);
 
  170   demo_gpio_startup(&gpio);
 
  177   bool pinflip = gpio_state & kPinflipMask ? true : 
false;
 
  178   bool differential_xcvr = gpio_state & kDiffXcvrMask ? true : 
false;
 
  179   bool uphy = gpio_state & kUPhyMask ? true : 
false;
 
  180   LOG_INFO(
"PHY settings: pinflip=%d differential_xcvr=%d USB Phy=%d", pinflip,
 
  181            differential_xcvr, uphy);
 
  194   CHECK_STATUS_OK(usb_testutils_init(&usbdev, pinflip, differential_xcvr,
 
  195                                      differential_xcvr && !uphy));
 
  197   CHECK_STATUS_OK(usb_testutils_controlep_init(
 
  198       &usbdev_control, &usbdev, 0, config_descriptors,
 
  199       sizeof(config_descriptors), NULL, 0));
 
  201   while (usbdev_control.device_state != kUsbTestutilsDeviceConfigured) {
 
  202     CHECK_STATUS_OK(usb_testutils_poll(&usbdev));
 
  205   CHECK_STATUS_OK(usb_testutils_simpleserial_init(&simple_serial0, &usbdev, 1,
 
  206                                                   usb_receipt_callback_0));
 
  207   CHECK_STATUS_OK(usb_testutils_simpleserial_init(&simple_serial1, &usbdev, 2,
 
  208                                                   usb_receipt_callback_1));
 
  210   bool say_hello = 
true;
 
  211   bool pass_signaled = 
false;
 
  213     CHECK_STATUS_OK(usb_testutils_poll(&usbdev));
 
  215     gpio_state = demo_gpio_to_log_echo(&gpio, gpio_state);
 
  218       size_t chars_available;
 
  220           chars_available == 0) {
 
  230       if (rcv_char == 
'/') {
 
  231         uint32_t usb_irq_state =
 
  232             REG32(USBDEV_BASE_ADDR + USBDEV_INTR_STATE_REG_OFFSET);
 
  233         uint32_t usb_stat = REG32(USBDEV_BASE_ADDR + USBDEV_USBSTAT_REG_OFFSET);
 
  234         LOG_INFO(
"I%04x-%08x", usb_irq_state, usb_stat);
 
  237             usb_testutils_simpleserial_send_byte(&simple_serial0, rcv_char));
 
  238         CHECK_STATUS_OK(usb_testutils_simpleserial_send_byte(&simple_serial1,
 
  242     if (say_hello && usb_chars_recved_total > 2) {
 
  243       usb_send_str(
"Hello USB World!!!!", &simple_serial0);
 
  247     if (usb_chars_recved_total >= kExpectedUsbCharsRecved && !pass_signaled) {
 
  249       pass_signaled = 
true;
 
  253   LOG_INFO(
"USB recieved %d characters.", usb_chars_recved_total);