19 #include "sw/device/lib/testing/pinmux_testutils.h"
20 #include "sw/device/lib/testing/test_framework/check.h"
24 #include "sw/device/lib/dif/autogen/dif_usbdev_autogen.h"
26 #define USBDEV_BASE_ADDR TOP_EARLGREY_USBDEV_BASE_ADDR
28 #ifndef USBDEV_BUFFER_REG_OFFSET
29 #define USBDEV_BUFFER_REG_OFFSET 0x800u
34 #define LFSR_ADVANCE(lfsr) \
36 (uint8_t)((lfsr) << 1) ^ \
37 ((((lfsr) >> 1) ^ ((lfsr) >> 2) ^ ((lfsr) >> 3) ^ ((lfsr) >> 7)) & 1U))
40 #define USBDEV_PACKET_MEM_SIZE (USBDEV_NUM_BUFFERS * USBDEV_MAX_PACKET_SIZE)
43 static alignas(uint32_t) uint8_t testpatt[USBDEV_PACKET_MEM_SIZE];
44 static alignas(uint32_t) uint8_t testcopy[USBDEV_PACKET_MEM_SIZE];
46 static dif_usbdev_t usbdev;
48 OTTF_DEFINE_TEST_CONFIG();
56 static status_t mem_dif_write(
const dif_usbdev_t *dev,
const uint8_t *data,
58 const unsigned nbufs =
59 (n + USBDEV_MAX_PACKET_SIZE - 1) / USBDEV_MAX_PACKET_SIZE;
60 TRY_CHECK(nbufs <= USBDEV_NUM_BUFFERS);
62 for (
unsigned id = 0u;
id < nbufs;
id++) {
64 &data[
id * USBDEV_MAX_PACKET_SIZE],
65 USBDEV_MAX_PACKET_SIZE));
71 static status_t mem_dif_read(
const dif_usbdev_t *dev, uint8_t *data,
size_t n) {
72 const unsigned nbufs =
73 (n + USBDEV_MAX_PACKET_SIZE - 1) / USBDEV_MAX_PACKET_SIZE;
74 TRY_CHECK(nbufs <= USBDEV_NUM_BUFFERS);
76 for (
unsigned id = 0u;
id < nbufs;
id++) {
78 &data[
id * USBDEV_MAX_PACKET_SIZE],
79 USBDEV_MAX_PACKET_SIZE));
87 static status_t mem_read(
const dif_usbdev_t *dev,
unsigned use_dif,
88 uint8_t *data,
size_t n) {
90 return mem_dif_read(dev, data, n);
100 static status_t mem_write(
const dif_usbdev_t *dev,
unsigned use_dif,
101 const uint8_t *data,
size_t n) {
103 return mem_dif_write(dev, data, n);
112 LOG_INFO(
"Running USBDEV Mem Test");
121 for (
unsigned use_dif = 0u; use_dif <= 1u; use_dif++) {
123 uint8_t lfsr = 0x13u;
124 for (
unsigned idx = 0u; idx <
sizeof(testpatt); idx++) {
125 testpatt[idx] = lfsr;
126 lfsr = LFSR_ADVANCE(lfsr);
130 CHECK_STATUS_OK(mem_write(&usbdev, use_dif, testpatt,
sizeof(testpatt)));
133 memset(testcopy, 0xffu,
sizeof(testcopy));
137 mem_read(&usbdev, use_dif, testcopy, USBDEV_PACKET_MEM_SIZE));
140 CHECK_ARRAYS_EQ(testcopy, testpatt,
sizeof(testcopy));
142 for (
unsigned idx = 0u; idx <
sizeof(testpatt); idx++) {
144 testcopy[idx] = ~testcopy[idx];
148 CHECK_STATUS_OK(mem_write(&usbdev, use_dif, testcopy,
sizeof(testcopy)));
151 memset(testpatt, 0xffu,
sizeof(testpatt));
154 CHECK_STATUS_OK(mem_read(&usbdev, use_dif, testpatt,
sizeof(testpatt)));
157 CHECK_ARRAYS_EQ(testpatt, testcopy, USBDEV_PACKET_MEM_SIZE);