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);