mirror of https://github.com/ARMmbed/mbed-os.git
Merge pull request #12917 from rajkan01/usb_serial_greentea
Bare metal profile: Enable USB serial greentea testpull/12973/head
commit
595754dffa
|
@ -19,10 +19,6 @@
|
|||
#error [NOT_SUPPORTED] usb device tests not enabled
|
||||
#else
|
||||
|
||||
#if !defined(MBED_CONF_RTOS_PRESENT)
|
||||
#error [NOT_SUPPORTED] USB stack and test cases require RTOS to run.
|
||||
#else
|
||||
|
||||
#if !defined(DEVICE_USBDEVICE) || !DEVICE_USBDEVICE
|
||||
#error [NOT_SUPPORTED] USB Device not supported for this target
|
||||
#else
|
||||
|
@ -78,11 +74,11 @@
|
|||
// The solution is to wait for the first DTR spike, ignore it, and wait for
|
||||
// the correct DTR signal again.
|
||||
#define LINUX_HOST_DTR_FIX 1
|
||||
#define LINUX_HOST_DTR_FIX_DELAY_MS 1
|
||||
#define LINUX_HOST_DTR_FIX_DELAY_MS 1ms
|
||||
|
||||
#define CDC_LOOPBACK_REPS 1200
|
||||
#define SERIAL_LOOPBACK_REPS 100
|
||||
#define USB_RECONNECT_DELAY_MS 1
|
||||
#define USB_RECONNECT_DELAY_MS 1ms
|
||||
|
||||
#define LINE_CODING_SEP (',')
|
||||
#define LINE_CODING_DELIM (';')
|
||||
|
@ -153,8 +149,7 @@ line_coding_t test_codings[] = {
|
|||
{ 9600, 8, 0, 0 },
|
||||
{ 57600, 8, 0, 0 },
|
||||
};
|
||||
|
||||
Mail<line_coding_t, 8> lc_mail;
|
||||
static CircularBuffer<line_coding_t, 8> lc_data;
|
||||
|
||||
#define EF_SEND (1ul << 0)
|
||||
EventFlags event_flags;
|
||||
|
@ -297,7 +292,7 @@ void test_cdc_usb_reconnect()
|
|||
usb_cdc.connect();
|
||||
// Wait for the USB enumeration to complete.
|
||||
while (!usb_cdc.configured()) {
|
||||
ThisThread::sleep_for(1);
|
||||
ThisThread::sleep_for(1ms);
|
||||
}
|
||||
TEST_ASSERT_TRUE(usb_cdc.configured());
|
||||
TEST_ASSERT_FALSE(usb_cdc.ready());
|
||||
|
@ -322,7 +317,7 @@ void test_cdc_usb_reconnect()
|
|||
usb_cdc.connect();
|
||||
// Wait for the USB enumeration to complete.
|
||||
while (!usb_cdc.configured()) {
|
||||
ThisThread::sleep_for(1);
|
||||
ThisThread::sleep_for(1ms);
|
||||
}
|
||||
TEST_ASSERT_TRUE(usb_cdc.configured());
|
||||
TEST_ASSERT_FALSE(usb_cdc.ready());
|
||||
|
@ -370,7 +365,7 @@ void test_cdc_rx_single_bytes()
|
|||
}
|
||||
// Wait for the host to close its port.
|
||||
while (usb_cdc.ready()) {
|
||||
ThisThread::sleep_for(1);
|
||||
ThisThread::sleep_for(1ms);
|
||||
}
|
||||
usb_cdc.disconnect();
|
||||
}
|
||||
|
@ -381,7 +376,7 @@ void tx_thread_fun(USBCDC *usb_cdc)
|
|||
uint8_t buff[TX_BUFF_SIZE] = { 0 };
|
||||
while (event_flags.get() & EF_SEND) {
|
||||
if (!usb_cdc->send(buff, TX_BUFF_SIZE)) {
|
||||
ThisThread::sleep_for(1);
|
||||
ThisThread::sleep_for(1ms);
|
||||
continue;
|
||||
}
|
||||
buff_val++;
|
||||
|
@ -389,6 +384,17 @@ void tx_thread_fun(USBCDC *usb_cdc)
|
|||
}
|
||||
}
|
||||
|
||||
void tx_ticker_fun(USBCDC *usb_cdc, uint8_t start_val, uint8_t size = TX_BUFF_SIZE)
|
||||
{
|
||||
static uint8_t buff_val = start_val;
|
||||
uint32_t actual_tx = 0;
|
||||
uint8_t buff[TX_BUFF_SIZE] = { 0 };
|
||||
memset(buff, buff_val, size);
|
||||
usb_cdc->send_nb(buff, size, &actual_tx);
|
||||
TEST_ASSERT_EQUAL_UINT8(size, actual_tx);
|
||||
buff_val++;
|
||||
}
|
||||
|
||||
/** Test CDC receive single bytes concurrently
|
||||
*
|
||||
* Given the USB CDC device connected to a host
|
||||
|
@ -406,9 +412,15 @@ void test_cdc_rx_single_bytes_concurrent()
|
|||
ThisThread::sleep_for(LINUX_HOST_DTR_FIX_DELAY_MS);
|
||||
#endif
|
||||
usb_cdc.wait_ready();
|
||||
#if defined(MBED_CONF_RTOS_PRESENT)
|
||||
Thread tx_thread;
|
||||
event_flags.set(EF_SEND);
|
||||
tx_thread.start(mbed::callback(tx_thread_fun, &usb_cdc));
|
||||
#else
|
||||
Ticker t;
|
||||
t.attach([&] { tx_ticker_fun(&usb_cdc, 0, 1); }, 2ms);
|
||||
#endif
|
||||
|
||||
uint8_t buff = 0x01;
|
||||
for (int expected = 0xff; expected >= 0; expected--) {
|
||||
TEST_ASSERT(usb_cdc.receive(&buff, 1, NULL));
|
||||
|
@ -418,11 +430,16 @@ void test_cdc_rx_single_bytes_concurrent()
|
|||
TEST_ASSERT(usb_cdc.receive(&buff, 1, NULL));
|
||||
TEST_ASSERT_EQUAL_UINT8(expected, buff);
|
||||
}
|
||||
|
||||
#if defined(MBED_CONF_RTOS_PRESENT)
|
||||
event_flags.clear(EF_SEND);
|
||||
tx_thread.join();
|
||||
#else
|
||||
t.detach();
|
||||
#endif
|
||||
// Wait for the host to close its port.
|
||||
while (usb_cdc.ready()) {
|
||||
ThisThread::sleep_for(1);
|
||||
ThisThread::sleep_for(1ms);
|
||||
}
|
||||
usb_cdc.disconnect();
|
||||
}
|
||||
|
@ -461,7 +478,7 @@ void test_cdc_rx_multiple_bytes()
|
|||
}
|
||||
// Wait for the host to close its port.
|
||||
while (usb_cdc.ready()) {
|
||||
ThisThread::sleep_for(1);
|
||||
ThisThread::sleep_for(1ms);
|
||||
}
|
||||
usb_cdc.disconnect();
|
||||
}
|
||||
|
@ -483,9 +500,14 @@ void test_cdc_rx_multiple_bytes_concurrent()
|
|||
ThisThread::sleep_for(LINUX_HOST_DTR_FIX_DELAY_MS);
|
||||
#endif
|
||||
usb_cdc.wait_ready();
|
||||
#if defined(MBED_CONF_RTOS_PRESENT)
|
||||
Thread tx_thread;
|
||||
event_flags.set(EF_SEND);
|
||||
tx_thread.start(mbed::callback(tx_thread_fun, &usb_cdc));
|
||||
#else
|
||||
Ticker t;
|
||||
t.attach([&] { tx_ticker_fun(&usb_cdc, 0); }, 3ms);
|
||||
#endif
|
||||
uint8_t buff[RX_BUFF_SIZE] = { 0 };
|
||||
uint8_t expected_buff[RX_BUFF_SIZE] = { 0 };
|
||||
for (int expected = 0xff; expected >= 0; expected--) {
|
||||
|
@ -502,11 +524,15 @@ void test_cdc_rx_multiple_bytes_concurrent()
|
|||
TEST_ASSERT_EQUAL_UINT8_ARRAY(expected_buff, buff, RX_BUFF_SIZE);
|
||||
}
|
||||
}
|
||||
#if defined(MBED_CONF_RTOS_PRESENT)
|
||||
event_flags.clear(EF_SEND);
|
||||
tx_thread.join();
|
||||
#else
|
||||
t.detach();
|
||||
#endif
|
||||
// Wait for the host to close its port.
|
||||
while (usb_cdc.ready()) {
|
||||
ThisThread::sleep_for(1);
|
||||
ThisThread::sleep_for(1ms);
|
||||
}
|
||||
usb_cdc.disconnect();
|
||||
}
|
||||
|
@ -538,7 +564,7 @@ void test_cdc_loopback()
|
|||
}
|
||||
// Wait for the host to close its port.
|
||||
while (usb_cdc.ready()) {
|
||||
ThisThread::sleep_for(1);
|
||||
ThisThread::sleep_for(1ms);
|
||||
}
|
||||
usb_cdc.disconnect();
|
||||
}
|
||||
|
@ -560,7 +586,7 @@ void test_serial_usb_reconnect()
|
|||
usb_serial.connect();
|
||||
// Wait for the USB enumeration to complete.
|
||||
while (!usb_serial.configured()) {
|
||||
ThisThread::sleep_for(1);
|
||||
ThisThread::sleep_for(1ms);
|
||||
}
|
||||
TEST_ASSERT_TRUE(usb_serial.configured());
|
||||
TEST_ASSERT_FALSE(usb_serial.connected());
|
||||
|
@ -573,7 +599,7 @@ void test_serial_usb_reconnect()
|
|||
ThisThread::sleep_for(LINUX_HOST_DTR_FIX_DELAY_MS);
|
||||
#endif
|
||||
while (!usb_serial.connected()) {
|
||||
ThisThread::sleep_for(1);
|
||||
ThisThread::sleep_for(1ms);
|
||||
}
|
||||
TEST_ASSERT_TRUE(usb_serial.configured());
|
||||
TEST_ASSERT_TRUE(usb_serial.connected());
|
||||
|
@ -590,7 +616,7 @@ void test_serial_usb_reconnect()
|
|||
usb_serial.connect();
|
||||
// Wait for the USB enumeration to complete.
|
||||
while (!usb_serial.configured()) {
|
||||
ThisThread::sleep_for(1);
|
||||
ThisThread::sleep_for(1ms);
|
||||
}
|
||||
TEST_ASSERT_TRUE(usb_serial.configured());
|
||||
TEST_ASSERT_FALSE(usb_serial.connected());
|
||||
|
@ -603,7 +629,7 @@ void test_serial_usb_reconnect()
|
|||
ThisThread::sleep_for(LINUX_HOST_DTR_FIX_DELAY_MS);
|
||||
#endif
|
||||
while (!usb_serial.connected()) {
|
||||
ThisThread::sleep_for(1);
|
||||
ThisThread::sleep_for(1ms);
|
||||
}
|
||||
TEST_ASSERT_TRUE(usb_serial.configured());
|
||||
TEST_ASSERT_TRUE(usb_serial.connected());
|
||||
|
@ -633,7 +659,7 @@ void test_serial_term_reopen()
|
|||
ThisThread::sleep_for(LINUX_HOST_DTR_FIX_DELAY_MS);
|
||||
#endif
|
||||
while (!usb_serial.connected()) {
|
||||
ThisThread::sleep_for(1);
|
||||
ThisThread::sleep_for(1ms);
|
||||
}
|
||||
TEST_ASSERT_TRUE(usb_serial.configured());
|
||||
TEST_ASSERT_TRUE(usb_serial.ready());
|
||||
|
@ -642,7 +668,7 @@ void test_serial_term_reopen()
|
|||
|
||||
// Wait for the host to close the terminal.
|
||||
while (usb_serial.ready()) {
|
||||
ThisThread::sleep_for(1);
|
||||
ThisThread::sleep_for(1ms);
|
||||
}
|
||||
TEST_ASSERT_TRUE(usb_serial.configured());
|
||||
TEST_ASSERT_FALSE(usb_serial.ready());
|
||||
|
@ -656,7 +682,7 @@ void test_serial_term_reopen()
|
|||
ThisThread::sleep_for(LINUX_HOST_DTR_FIX_DELAY_MS);
|
||||
#endif
|
||||
while (!usb_serial.connected()) {
|
||||
ThisThread::sleep_for(1);
|
||||
ThisThread::sleep_for(1ms);
|
||||
}
|
||||
TEST_ASSERT_TRUE(usb_serial.configured());
|
||||
TEST_ASSERT_TRUE(usb_serial.ready());
|
||||
|
@ -665,7 +691,7 @@ void test_serial_term_reopen()
|
|||
|
||||
// Wait for the host to close the terminal again.
|
||||
while (usb_serial.ready()) {
|
||||
ThisThread::sleep_for(1);
|
||||
ThisThread::sleep_for(1ms);
|
||||
}
|
||||
TEST_ASSERT_TRUE(usb_serial.configured());
|
||||
TEST_ASSERT_FALSE(usb_serial.ready());
|
||||
|
@ -699,7 +725,7 @@ void test_serial_getc()
|
|||
}
|
||||
// Wait for the host to close its port.
|
||||
while (usb_serial.ready()) {
|
||||
ThisThread::sleep_for(1);
|
||||
ThisThread::sleep_for(1ms);
|
||||
}
|
||||
usb_serial.disconnect();
|
||||
}
|
||||
|
@ -736,19 +762,21 @@ void test_serial_printf_scanf()
|
|||
}
|
||||
// Wait for the host to close its port.
|
||||
while (usb_serial.ready()) {
|
||||
ThisThread::sleep_for(1);
|
||||
ThisThread::sleep_for(1ms);
|
||||
}
|
||||
usb_serial.disconnect();
|
||||
}
|
||||
|
||||
void line_coding_changed_cb(int baud, int bits, int parity, int stop)
|
||||
{
|
||||
line_coding_t *lc = lc_mail.alloc();
|
||||
lc->baud = baud;
|
||||
lc->bits = bits;
|
||||
lc->parity = parity;
|
||||
lc->stop = stop;
|
||||
lc_mail.put(lc);
|
||||
line_coding_t lc = {
|
||||
.baud = baud,
|
||||
.bits = bits,
|
||||
.parity = parity,
|
||||
.stop = stop
|
||||
};
|
||||
lc_data.push(lc);
|
||||
event_flags.set(EF_SEND);
|
||||
}
|
||||
|
||||
/** Test Serial / CDC line coding change
|
||||
|
@ -772,9 +800,9 @@ void test_serial_line_coding_change()
|
|||
size_t num_line_codings = sizeof test_codings / sizeof test_codings[0];
|
||||
line_coding_t *lc_prev = &default_lc;
|
||||
line_coding_t *lc_expected = NULL;
|
||||
line_coding_t *lc_actual = NULL;
|
||||
int num_expected_callbacks, rc;
|
||||
for (size_t i = 0; i < num_line_codings; i++) {
|
||||
line_coding_t lc_actual = {0};
|
||||
lc_expected = &(test_codings[i]);
|
||||
num_expected_callbacks = lc_prev->get_num_diffs(*lc_expected);
|
||||
rc = usb_serial.printf("%06i,%02i,%01i,%01i%c", lc_expected->baud, lc_expected->bits, lc_expected->parity,
|
||||
|
@ -786,27 +814,21 @@ void test_serial_line_coding_change()
|
|||
// calls to line_coding_changed callback on the device.
|
||||
while (num_expected_callbacks > 0) {
|
||||
num_expected_callbacks--;
|
||||
osEvent event = lc_mail.get();
|
||||
TEST_ASSERT_EQUAL_UINT32(osEventMail, event.status);
|
||||
lc_actual = (line_coding_t *) event.value.p;
|
||||
if (lc_expected->get_num_diffs(*lc_actual) == 0) {
|
||||
event_flags.wait_all(EF_SEND);
|
||||
lc_data.pop(lc_actual);
|
||||
if (lc_expected->get_num_diffs(lc_actual) == 0) {
|
||||
break;
|
||||
} else if (num_expected_callbacks > 0) {
|
||||
// Discard lc_actual only if there is still a chance to get new
|
||||
// set of params.
|
||||
lc_mail.free(lc_actual);
|
||||
}
|
||||
}
|
||||
TEST_ASSERT_EQUAL_INT(lc_expected->baud, lc_actual->baud);
|
||||
TEST_ASSERT_EQUAL_INT(lc_expected->bits, lc_actual->bits);
|
||||
TEST_ASSERT_EQUAL_INT(lc_expected->parity, lc_actual->parity);
|
||||
TEST_ASSERT_EQUAL_INT(lc_expected->stop, lc_actual->stop);
|
||||
lc_mail.free(lc_actual);
|
||||
TEST_ASSERT_EQUAL_INT(lc_expected->baud, lc_actual.baud);
|
||||
TEST_ASSERT_EQUAL_INT(lc_expected->bits, lc_actual.bits);
|
||||
TEST_ASSERT_EQUAL_INT(lc_expected->parity, lc_actual.parity);
|
||||
TEST_ASSERT_EQUAL_INT(lc_expected->stop, lc_actual.stop);
|
||||
lc_prev = lc_expected;
|
||||
}
|
||||
// Wait for the host to close its port.
|
||||
while (usb_serial.ready()) {
|
||||
ThisThread::sleep_for(1);
|
||||
ThisThread::sleep_for(1ms);
|
||||
}
|
||||
usb_serial.disconnect();
|
||||
}
|
||||
|
@ -858,5 +880,4 @@ int main()
|
|||
}
|
||||
|
||||
#endif // !defined(DEVICE_USBDEVICE) || !DEVICE_USBDEVICE
|
||||
#endif // !defined(MBED_CONF_RTOS_PRESENT)
|
||||
#endif // !defined(USB_DEVICE_TESTS)
|
||||
|
|
Loading…
Reference in New Issue