12#include "usbdev_regs.h"
19 "Mismatch in number of endpoints");
24#define USBDEV_BUFFER_ENTRY_SIZE_BYTES USBDEV_MAX_PACKET_SIZE
29#define BUFFER_POOL_FULL (USBDEV_NUM_BUFFERS - 1)
30#define BUFFER_POOL_EMPTY -1
36 uint32_t config_in_reg_offset;
46#define ENDPOINT_HW_INFO_ENTRY(N) \
47 [N] = {.config_in_reg_offset = USBDEV_CONFIGIN_##N##_REG_OFFSET, \
48 .bit_index = USBDEV_IN_SENT_SENT_##N##_BIT}
51 ENDPOINT_HW_INFO_ENTRY(0), ENDPOINT_HW_INFO_ENTRY(1),
52 ENDPOINT_HW_INFO_ENTRY(2), ENDPOINT_HW_INFO_ENTRY(3),
53 ENDPOINT_HW_INFO_ENTRY(4), ENDPOINT_HW_INFO_ENTRY(5),
54 ENDPOINT_HW_INFO_ENTRY(6), ENDPOINT_HW_INFO_ENTRY(7),
55 ENDPOINT_HW_INFO_ENTRY(8), ENDPOINT_HW_INFO_ENTRY(9),
56 ENDPOINT_HW_INFO_ENTRY(10), ENDPOINT_HW_INFO_ENTRY(11),
59#undef ENDPOINT_HW_INFO_ENTRY
75 return pool->top == BUFFER_POOL_FULL;
86 return pool->top == BUFFER_POOL_EMPTY;
98static bool buffer_pool_is_valid_buffer_id(uint8_t buffer_id) {
99 return buffer_id < USBDEV_NUM_BUFFERS;
111 if (buffer_pool_is_full(pool) || !buffer_pool_is_valid_buffer_id(buffer_id)) {
116 pool->buffers[pool->top] = buffer_id;
130 uint8_t *buffer_id) {
131 if (buffer_pool_is_empty(pool) || buffer_id == NULL) {
135 *buffer_id = pool->buffers[pool->top];
156 for (uint8_t i = 0; i < USBDEV_NUM_BUFFERS; ++i) {
157 if (!buffer_pool_add(pool, i)) {
173static bool is_valid_endpoint(uint8_t endpoint_number) {
186 if (usbdev == NULL || !is_valid_endpoint(endpoint) ||
187 !dif_is_valid_toggle(new_state)) {
192 mmio_region_read32(usbdev->
base_addr, (ptrdiff_t)reg_offset);
193 reg_val = bitfield_bit32_write(reg_val, kEndpointHwInfos[endpoint].bit_index,
194 dif_toggle_to_bool(new_state));
195 mmio_region_write32(usbdev->
base_addr, (ptrdiff_t)reg_offset, reg_val);
204static uint32_t get_buffer_addr(uint8_t buffer_id,
size_t offset) {
205 return USBDEV_BUFFER_REG_OFFSET +
206 (buffer_id * USBDEV_BUFFER_ENTRY_SIZE_BYTES) + offset;
216 if (usbdev == NULL || buffer_pool == NULL) {
221 if (!buffer_pool_init(buffer_pool)) {
228 !dif_is_valid_toggle(config.single_bit_eop) ||
229 !dif_is_valid_toggle(config.
pin_flip) ||
235 uint32_t phy_config_val = 0;
236 phy_config_val = bitfield_bit32_write(
237 phy_config_val, USBDEV_PHY_CONFIG_USE_DIFF_RCVR_BIT,
240 bitfield_bit32_write(phy_config_val, USBDEV_PHY_CONFIG_TX_USE_D_SE0_BIT,
243 bitfield_bit32_write(phy_config_val, USBDEV_PHY_CONFIG_EOP_SINGLE_BIT_BIT,
244 dif_toggle_to_bool(config.single_bit_eop));
246 bitfield_bit32_write(phy_config_val, USBDEV_PHY_CONFIG_PINFLIP_BIT,
247 dif_toggle_to_bool(config.
pin_flip));
248 phy_config_val = bitfield_bit32_write(
249 phy_config_val, USBDEV_PHY_CONFIG_USB_REF_DISABLE_BIT,
253 mmio_region_write32(usbdev->
base_addr, USBDEV_PHY_CONFIG_REG_OFFSET,
261 if (usbdev == NULL || buffer_pool == NULL) {
266 while (!buffer_pool_is_empty(buffer_pool)) {
268 mmio_region_read32(usbdev->
base_addr, USBDEV_USBSTAT_REG_OFFSET);
270 uint32_t av_setup_depth =
271 bitfield_field32_read(
status, USBDEV_USBSTAT_AV_SETUP_DEPTH_FIELD);
272 if (av_setup_depth >= 2) {
275 bitfield_bit32_read(
status, USBDEV_USBSTAT_AV_OUT_FULL_BIT);
281 if (!buffer_pool_remove(buffer_pool, &buffer_id)) {
284 if (av_setup_depth >= 2) {
287 bitfield_field32_write(0, USBDEV_AVOUTBUFFER_BUFFER_FIELD, buffer_id);
288 mmio_region_write32(usbdev->
base_addr, USBDEV_AVOUTBUFFER_REG_OFFSET,
292 uint32_t reg_val = bitfield_field32_write(
293 0, USBDEV_AVSETUPBUFFER_BUFFER_FIELD, buffer_id);
294 mmio_region_write32(usbdev->
base_addr, USBDEV_AVSETUPBUFFER_REG_OFFSET,
305 return endpoint_functionality_enable(usbdev, USBDEV_RXENABLE_SETUP_REG_OFFSET,
306 endpoint, new_state);
312 return endpoint_functionality_enable(usbdev, USBDEV_RXENABLE_OUT_REG_OFFSET,
313 endpoint, new_state);
319 return endpoint_functionality_enable(usbdev, USBDEV_SET_NAK_OUT_REG_OFFSET,
320 endpoint, new_state);
324 dif_usbdev_endpoint_id_t endpoint,
326 if (endpoint.
direction == USBDEV_ENDPOINT_DIR_IN) {
327 return endpoint_functionality_enable(usbdev, USBDEV_IN_STALL_REG_OFFSET,
328 endpoint.
number, new_state);
330 return endpoint_functionality_enable(usbdev, USBDEV_OUT_STALL_REG_OFFSET,
331 endpoint.
number, new_state);
336 dif_usbdev_endpoint_id_t endpoint,
338 if (usbdev == NULL || state == NULL || !is_valid_endpoint(endpoint.
number)) {
342 ptrdiff_t reg_offset = endpoint.
direction == USBDEV_ENDPOINT_DIR_IN
343 ? USBDEV_IN_STALL_REG_OFFSET
344 : USBDEV_OUT_STALL_REG_OFFSET;
345 uint32_t reg_val = mmio_region_read32(usbdev->
base_addr, reg_offset);
347 bitfield_bit32_read(reg_val, kEndpointHwInfos[endpoint.
number].bit_index);
353 dif_usbdev_endpoint_id_t endpoint,
355 if (endpoint.
direction == USBDEV_ENDPOINT_DIR_IN) {
356 return endpoint_functionality_enable(usbdev, USBDEV_IN_ISO_REG_OFFSET,
357 endpoint.
number, new_state);
359 return endpoint_functionality_enable(usbdev, USBDEV_OUT_ISO_REG_OFFSET,
360 endpoint.
number, new_state);
365 dif_usbdev_endpoint_id_t endpoint,
367 if (endpoint.
direction == USBDEV_ENDPOINT_DIR_IN) {
368 return endpoint_functionality_enable(usbdev, USBDEV_EP_IN_ENABLE_REG_OFFSET,
369 endpoint.
number, new_state);
371 return endpoint_functionality_enable(
372 usbdev, USBDEV_EP_OUT_ENABLE_REG_OFFSET, endpoint.
number, new_state);
379 if (usbdev == NULL || !dif_is_valid_toggle(new_state)) {
384 mmio_region_read32(usbdev->
base_addr, USBDEV_USBCTRL_REG_OFFSET);
385 reg_val = bitfield_bit32_write(reg_val, USBDEV_USBCTRL_ENABLE_BIT,
386 dif_toggle_to_bool(new_state));
387 mmio_region_write32(usbdev->
base_addr, USBDEV_USBCTRL_REG_OFFSET, reg_val);
395 if (usbdev == NULL || info == NULL || buffer == NULL) {
400 uint32_t fifo_status =
401 mmio_region_read32(usbdev->
base_addr, USBDEV_USBSTAT_REG_OFFSET);
402 if (bitfield_bit32_read(fifo_status, USBDEV_USBSTAT_RX_EMPTY_BIT)) {
407 const uint32_t fifo_entry =
408 mmio_region_read32(usbdev->
base_addr, USBDEV_RXFIFO_REG_OFFSET);
412 (uint8_t)bitfield_field32_read(fifo_entry, USBDEV_RXFIFO_EP_FIELD),
413 .is_setup = bitfield_bit32_read(fifo_entry, USBDEV_RXFIFO_SETUP_BIT),
415 (uint8_t)bitfield_field32_read(fifo_entry, USBDEV_RXFIFO_SIZE_FIELD),
419 .id = (uint8_t)bitfield_field32_read(fifo_entry,
420 USBDEV_RXFIFO_BUFFER_FIELD),
422 .remaining_bytes = info->
length,
432 if (usbdev == NULL || buffer_pool == NULL || buffer == NULL) {
436 if (buffer_pool_is_empty(buffer_pool)) {
441 if (!buffer_pool_remove(buffer_pool, &buffer_id)) {
448 .remaining_bytes = USBDEV_BUFFER_ENTRY_SIZE_BYTES,
458 if (usbdev == NULL || buffer_pool == NULL || buffer == NULL) {
462 switch (buffer->
type) {
466 if (!buffer_pool_add(buffer_pool, buffer->
id)) {
480 size_t dst_len,
size_t *bytes_written) {
481 if (usbdev == NULL || buffer_pool == NULL || buffer == NULL ||
488 if (bytes_to_copy > dst_len) {
489 bytes_to_copy = dst_len;
492 const uint32_t buffer_addr = get_buffer_addr(buffer->
id, buffer->
offset);
493 mmio_region_memcpy_from_mmio32(usbdev->
base_addr, buffer_addr, dst,
496 buffer->
offset += bytes_to_copy;
499 if (bytes_written != NULL) {
500 *bytes_written = bytes_to_copy;
509 if (!buffer_pool_add(buffer_pool, buffer->
id)) {
520 const uint8_t *src,
size_t src_len,
521 size_t *bytes_written) {
522 if (usbdev == NULL || buffer == NULL ||
529 if (bytes_to_copy > src_len) {
530 bytes_to_copy = src_len;
534 uint32_t buffer_addr = get_buffer_addr(buffer->
id, buffer->
offset);
535 mmio_region_memcpy_to_mmio32(usbdev->
base_addr, buffer_addr, src,
538 buffer->
offset += bytes_to_copy;
542 *bytes_written = bytes_to_copy;
554 if (usbdev == NULL || !is_valid_endpoint(endpoint) || buffer == NULL ||
560 const uint32_t config_in_reg_offset =
561 kEndpointHwInfos[endpoint].config_in_reg_offset;
567 uint32_t config_in_val = 0;
568 config_in_val = bitfield_field32_write(
569 config_in_val, USBDEV_CONFIGIN_0_BUFFER_0_FIELD, buffer->
id);
570 config_in_val = bitfield_field32_write(
571 config_in_val, USBDEV_CONFIGIN_0_SIZE_0_FIELD, buffer->
offset);
572 mmio_region_write32(usbdev->
base_addr, (ptrdiff_t)config_in_reg_offset,
577 bitfield_bit32_write(config_in_val, USBDEV_CONFIGIN_0_RDY_0_BIT,
true);
578 mmio_region_write32(usbdev->
base_addr, (ptrdiff_t)config_in_reg_offset,
590 if (usbdev == NULL || sent == NULL) {
593 *sent = (uint16_t)mmio_region_read32(usbdev->
base_addr,
594 USBDEV_IN_SENT_REG_OFFSET);
601 if (usbdev == NULL || buffer_pool == NULL || !is_valid_endpoint(endpoint)) {
605 uint32_t config_in_reg_offset =
606 kEndpointHwInfos[endpoint].config_in_reg_offset;
607 uint32_t config_in_reg_val =
608 mmio_region_read32(usbdev->
base_addr, (ptrdiff_t)config_in_reg_offset);
609 uint8_t buffer = (uint8_t)bitfield_field32_read(
610 config_in_reg_val, USBDEV_CONFIGIN_0_BUFFER_0_FIELD);
612 mmio_region_write32(usbdev->
base_addr, (ptrdiff_t)config_in_reg_offset,
613 1u << USBDEV_CONFIGIN_0_PEND_0_BIT);
615 mmio_region_write32(usbdev->
base_addr, USBDEV_IN_SENT_REG_OFFSET,
618 if (!buffer_pool_add(buffer_pool, buffer)) {
627 if (usbdev == NULL ||
status == NULL || !is_valid_endpoint(endpoint)) {
632 uint32_t config_in_reg_offset =
633 kEndpointHwInfos[endpoint].config_in_reg_offset;
634 uint8_t endpoint_bit_index = kEndpointHwInfos[endpoint].bit_index;
637 uint32_t config_in_val =
638 mmio_region_read32(usbdev->
base_addr, (ptrdiff_t)config_in_reg_offset);
641 if (bitfield_bit32_read(config_in_val, USBDEV_CONFIGIN_0_RDY_0_BIT)) {
644 }
else if (bitfield_bit32_read(mmio_region_read32(usbdev->
base_addr,
645 USBDEV_IN_SENT_REG_OFFSET),
646 endpoint_bit_index)) {
649 }
else if (bitfield_bit32_read(config_in_val, USBDEV_CONFIGIN_0_PEND_0_BIT)) {
661 if (usbdev == NULL) {
666 mmio_region_read32(usbdev->
base_addr, USBDEV_USBCTRL_REG_OFFSET);
667 reg_val = bitfield_field32_write(reg_val, USBDEV_USBCTRL_DEVICE_ADDRESS_FIELD,
669 mmio_region_write32(usbdev->
base_addr, USBDEV_USBCTRL_REG_OFFSET, reg_val);
675 if (usbdev == NULL || addr == NULL) {
680 mmio_region_read32(usbdev->
base_addr, USBDEV_USBCTRL_REG_OFFSET);
682 *addr = (uint8_t)bitfield_field32_read(reg_val,
683 USBDEV_USBCTRL_DEVICE_ADDRESS_FIELD);
690 if (usbdev == NULL || toggles == NULL) {
695 mmio_region_read32(usbdev->
base_addr, USBDEV_OUT_DATA_TOGGLE_REG_OFFSET);
697 *toggles = (uint16_t)reg_val;
704 if (usbdev == NULL || toggles == NULL) {
709 mmio_region_read32(usbdev->
base_addr, USBDEV_IN_DATA_TOGGLE_REG_OFFSET);
711 *toggles = (uint16_t)reg_val;
717 uint16_t mask, uint16_t state) {
718 if (usbdev == NULL) {
723 mmio_region_write32(usbdev->
base_addr, USBDEV_OUT_DATA_TOGGLE_REG_OFFSET,
724 ((uint32_t)mask << 16) | state);
730 uint16_t mask, uint16_t state) {
731 if (usbdev == NULL) {
736 mmio_region_write32(usbdev->
base_addr, USBDEV_IN_DATA_TOGGLE_REG_OFFSET,
737 ((uint32_t)mask << 16) | state);
744 if (usbdev == NULL) {
748 uint32_t reg_val = (uint32_t)1u << (endpoint + 16u);
749 mmio_region_write32(usbdev->
base_addr, USBDEV_OUT_DATA_TOGGLE_REG_OFFSET,
751 mmio_region_write32(usbdev->
base_addr, USBDEV_IN_DATA_TOGGLE_REG_OFFSET,
758 uint16_t *frame_index) {
759 if (usbdev == NULL || frame_index == NULL) {
764 mmio_region_read32(usbdev->
base_addr, USBDEV_USBSTAT_REG_OFFSET);
767 (uint8_t)bitfield_field32_read(reg_val, USBDEV_USBSTAT_FRAME_FIELD);
774 if (usbdev == NULL || host_lost == NULL) {
779 mmio_region_get_bit32(usbdev->
base_addr, USBDEV_USBSTAT_REG_OFFSET,
780 USBDEV_USBSTAT_HOST_LOST_BIT);
787 if (usbdev == NULL || link_state == NULL) {
792 mmio_region_read32(usbdev->
base_addr, USBDEV_USBSTAT_REG_OFFSET);
793 val = bitfield_field32_read(val, USBDEV_USBSTAT_LINK_STATE_FIELD);
796 case USBDEV_USBSTAT_LINK_STATE_VALUE_DISCONNECTED:
797 *link_state = kDifUsbdevLinkStateDisconnected;
799 case USBDEV_USBSTAT_LINK_STATE_VALUE_POWERED:
800 *link_state = kDifUsbdevLinkStatePowered;
802 case USBDEV_USBSTAT_LINK_STATE_VALUE_POWERED_SUSPENDED:
803 *link_state = kDifUsbdevLinkStatePoweredSuspended;
805 case USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE:
806 *link_state = kDifUsbdevLinkStateActive;
808 case USBDEV_USBSTAT_LINK_STATE_VALUE_SUSPENDED:
809 *link_state = kDifUsbdevLinkStateSuspended;
811 case USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE_NOSOF:
812 *link_state = kDifUsbdevLinkStateActiveNoSof;
814 case USBDEV_USBSTAT_LINK_STATE_VALUE_RESUMING:
815 *link_state = kDifUsbdevLinkStateResuming;
826 if (usbdev == NULL || sense == NULL) {
830 *sense = mmio_region_get_bit32(usbdev->
base_addr, USBDEV_USBSTAT_REG_OFFSET,
831 USBDEV_USBSTAT_SENSE_BIT);
837 const dif_usbdev_t *usbdev, uint8_t *setup_depth, uint8_t *out_depth) {
838 if (usbdev == NULL || setup_depth == NULL || out_depth == NULL) {
843 mmio_region_read32(usbdev->
base_addr, USBDEV_USBSTAT_REG_OFFSET);
845 *setup_depth = (uint8_t)bitfield_field32_read(
846 reg_val, USBDEV_USBSTAT_AV_SETUP_DEPTH_FIELD);
848 *out_depth = (uint8_t)bitfield_field32_read(
849 reg_val, USBDEV_USBSTAT_AV_OUT_DEPTH_FIELD);
855 const dif_usbdev_t *usbdev,
bool *setup_is_full,
bool *out_is_full) {
856 if (usbdev == NULL || setup_is_full == NULL || out_is_full == NULL) {
861 mmio_region_read32(usbdev->
base_addr, USBDEV_USBSTAT_REG_OFFSET);
863 bitfield_bit32_read(reg_val, USBDEV_USBSTAT_AV_SETUP_FULL_BIT);
864 *out_is_full = bitfield_bit32_read(reg_val, USBDEV_USBSTAT_AV_OUT_FULL_BIT);
871 if (usbdev == NULL || depth == NULL) {
876 mmio_region_read32(usbdev->
base_addr, USBDEV_USBSTAT_REG_OFFSET);
879 (uint8_t)bitfield_field32_read(reg_val, USBDEV_USBSTAT_RX_DEPTH_FIELD);
886 if (usbdev == NULL || is_empty == NULL) {
891 mmio_region_read32(usbdev->
base_addr, USBDEV_USBSTAT_REG_OFFSET);
892 *is_empty = bitfield_bit32_read(reg_val, USBDEV_USBSTAT_RX_EMPTY_BIT);
899 if (usbdev == NULL || !dif_is_valid_toggle(enable)) {
902 bool set_tx_osc_mode = dif_toggle_to_bool(enable);
904 mmio_region_read32(usbdev->
base_addr, USBDEV_PHY_CONFIG_REG_OFFSET);
905 reg_val = bitfield_bit32_write(
906 reg_val, USBDEV_PHY_CONFIG_TX_OSC_TEST_MODE_BIT, set_tx_osc_mode);
907 mmio_region_write32(usbdev->
base_addr, USBDEV_PHY_CONFIG_REG_OFFSET, reg_val);
913 if (usbdev == NULL || !dif_is_valid_toggle(enable)) {
917 if (dif_toggle_to_bool(enable)) {
919 bitfield_bit32_write(0, USBDEV_WAKE_CONTROL_SUSPEND_REQ_BIT,
true);
921 reg_val = bitfield_bit32_write(0, USBDEV_WAKE_CONTROL_WAKE_ACK_BIT,
true);
923 mmio_region_write32(usbdev->
base_addr, USBDEV_WAKE_CONTROL_REG_OFFSET,
929 dif_usbdev_wake_status_t *
status) {
930 if (usbdev == NULL ||
status == NULL) {
934 mmio_region_read32(usbdev->
base_addr, USBDEV_WAKE_EVENTS_REG_OFFSET);
936 bitfield_bit32_read(reg_val, USBDEV_WAKE_EVENTS_MODULE_ACTIVE_BIT);
938 bitfield_bit32_read(reg_val, USBDEV_WAKE_EVENTS_DISCONNECTED_BIT);
940 bitfield_bit32_read(reg_val, USBDEV_WAKE_EVENTS_BUS_RESET_BIT);
942 bitfield_bit32_read(reg_val, USBDEV_WAKE_EVENTS_BUS_NOT_IDLE_BIT);
947 if (usbdev == NULL) {
951 mmio_region_read32(usbdev->
base_addr, USBDEV_USBCTRL_REG_OFFSET);
952 reg_val = bitfield_bit32_write(reg_val, USBDEV_USBCTRL_RESUME_LINK_ACTIVE_BIT,
954 mmio_region_write32(usbdev->
base_addr, USBDEV_USBCTRL_REG_OFFSET, reg_val);
960 if (usbdev == NULL ||
status == NULL) {
964 mmio_region_read32(usbdev->
base_addr, USBDEV_PHY_PINS_SENSE_REG_OFFSET);
966 bitfield_bit32_read(reg_val, USBDEV_PHY_PINS_SENSE_RX_DP_I_BIT);
968 bitfield_bit32_read(reg_val, USBDEV_PHY_PINS_SENSE_RX_DN_I_BIT);
969 status->rx_d = bitfield_bit32_read(reg_val, USBDEV_PHY_PINS_SENSE_RX_D_I_BIT);
971 bitfield_bit32_read(reg_val, USBDEV_PHY_PINS_SENSE_TX_DP_O_BIT);
973 bitfield_bit32_read(reg_val, USBDEV_PHY_PINS_SENSE_TX_DN_O_BIT);
974 status->tx_d = bitfield_bit32_read(reg_val, USBDEV_PHY_PINS_SENSE_TX_D_O_BIT);
976 bitfield_bit32_read(reg_val, USBDEV_PHY_PINS_SENSE_TX_SE0_O_BIT);
978 bitfield_bit32_read(reg_val, USBDEV_PHY_PINS_SENSE_TX_OE_O_BIT);
980 bitfield_bit32_read(reg_val, USBDEV_PHY_PINS_SENSE_PWR_SENSE_BIT);
986 dif_usbdev_phy_pins_drive_t overrides) {
987 if (usbdev == NULL || !dif_is_valid_toggle(override_enable)) {
990 bool drive_en = dif_toggle_to_bool(override_enable);
992 bitfield_bit32_write(0, USBDEV_PHY_PINS_DRIVE_EN_BIT, drive_en);
994 reg_val = bitfield_bit32_write(reg_val, USBDEV_PHY_PINS_DRIVE_DP_O_BIT,
996 reg_val = bitfield_bit32_write(reg_val, USBDEV_PHY_PINS_DRIVE_DN_O_BIT,
998 reg_val = bitfield_bit32_write(reg_val, USBDEV_PHY_PINS_DRIVE_D_O_BIT,
1000 reg_val = bitfield_bit32_write(reg_val, USBDEV_PHY_PINS_DRIVE_SE0_O_BIT,
1002 reg_val = bitfield_bit32_write(reg_val, USBDEV_PHY_PINS_DRIVE_OE_O_BIT,
1005 bitfield_bit32_write(reg_val, USBDEV_PHY_PINS_DRIVE_RX_ENABLE_O_BIT,
1008 bitfield_bit32_write(reg_val, USBDEV_PHY_PINS_DRIVE_DP_PULLUP_EN_O_BIT,
1011 bitfield_bit32_write(reg_val, USBDEV_PHY_PINS_DRIVE_DN_PULLUP_EN_O_BIT,
1014 mmio_region_write32(usbdev->
base_addr, USBDEV_PHY_PINS_DRIVE_REG_OFFSET,
1020 const uint8_t *src,
size_t src_len) {
1021 if (usbdev == NULL || src == NULL || misalignment32_of((uintptr_t)src) ||
1022 src_len > USBDEV_BUFFER_ENTRY_SIZE_BYTES) {
1027 ptrdiff_t buffer_offset = (ptrdiff_t)get_buffer_addr(
id, 0U);
1028 const uint32_t *restrict ews = (uint32_t *)(src + (src_len & ~15u));
1029 const uint32_t *restrict ws = (uint32_t *)src;
1036 mmio_region_write32(usbdev->
base_addr, buffer_offset, ws[0]);
1037 mmio_region_write32(usbdev->
base_addr, buffer_offset + 4, ws[1]);
1038 mmio_region_write32(usbdev->
base_addr, buffer_offset + 8, ws[2]);
1039 mmio_region_write32(usbdev->
base_addr, buffer_offset + 12, ws[3]);
1040 buffer_offset += 16;
1047 ews = ws + (src_len >> 2);
1049 mmio_region_write32(usbdev->
base_addr, buffer_offset, *ws++);
1055 const uint8_t *restrict bs = (uint8_t *)ws;
1058 d |= ((uint32_t)bs[1] << 8);
1060 d |= ((uint32_t)bs[2] << 16);
1066 mmio_region_write32(usbdev->
base_addr, buffer_offset, d);
1074 uint8_t *dst,
size_t dst_len) {
1075 if (usbdev == NULL || dst == NULL || misalignment32_of((uintptr_t)dst) ||
1076 dst_len > USBDEV_BUFFER_ENTRY_SIZE_BYTES) {
1081 ptrdiff_t buffer_offset = (ptrdiff_t)get_buffer_addr(
id, 0U);
1082 const uint32_t *restrict ewd = (uint32_t *)(dst + (dst_len & ~15u));
1083 uint32_t *restrict wd = (uint32_t *)dst;
1090 wd[0] = mmio_region_read32(usbdev->
base_addr, buffer_offset);
1091 wd[1] = mmio_region_read32(usbdev->
base_addr, buffer_offset + 4);
1092 wd[2] = mmio_region_read32(usbdev->
base_addr, buffer_offset + 8);
1093 wd[3] = mmio_region_read32(usbdev->
base_addr, buffer_offset + 12);
1094 buffer_offset += 16;
1101 ewd = wd + (dst_len >> 2);
1103 *wd++ = mmio_region_read32(usbdev->
base_addr, buffer_offset);
1110 uint8_t *restrict bd = (uint8_t *)wd;
1111 uint32_t d = mmio_region_read32(usbdev->
base_addr, buffer_offset);
1114 bd[1] = (uint8_t)(d >> 8);
1116 bd[2] = (uint8_t)(d >> 16);