summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHa Thach <[email protected]>2024-04-04 14:35:29 +0700
committerGitHub <[email protected]>2024-04-04 14:35:29 +0700
commit177b388be0f430ef09ad2caf61cd70acd574c0d5 (patch)
tree4126a61278ccaeed3f0bacc724e0aaf8c51054a5
parent66cdf6d097d76f8d21ed4314651ac730d4023f99 (diff)
parentebe692350047b7b2a5b46de7894352934c4200aa (diff)
Merge pull request #2571 from hathach/fix-max3421-rp2040-build
fix build with rp2040 + max3421
-rw-r--r--examples/build_system/make/make.mk1
-rw-r--r--examples/host/cdc_msc_hid_freertos/skip.txt1
-rw-r--r--hw/bsp/family_support.cmake43
-rw-r--r--hw/bsp/rp2040/boards/feather_rp2040_max3421/board.cmake4
-rw-r--r--src/portable/analog/max3421/hcd_max3421.c15
-rw-r--r--tools/build_utils.py21
6 files changed, 40 insertions, 45 deletions
diff --git a/examples/build_system/make/make.mk b/examples/build_system/make/make.mk
index e1113aa52..772befca4 100644
--- a/examples/build_system/make/make.mk
+++ b/examples/build_system/make/make.mk
@@ -113,6 +113,7 @@ CFLAGS += -DBOARD_$(BOARD_UPPER)
ifeq (${MAX3421_HOST},1)
SRC_C += src/portable/analog/max3421/hcd_max3421.c
CFLAGS += -DCFG_TUH_MAX3421=1
+ CMAKE_DEFSYM += -DMAX3421_HOST=1
endif
# Log level is mapped to TUSB DEBUG option
diff --git a/examples/host/cdc_msc_hid_freertos/skip.txt b/examples/host/cdc_msc_hid_freertos/skip.txt
new file mode 100644
index 000000000..2ba4438fd
--- /dev/null
+++ b/examples/host/cdc_msc_hid_freertos/skip.txt
@@ -0,0 +1 @@
+mcu:RP2040
diff --git a/hw/bsp/family_support.cmake b/hw/bsp/family_support.cmake
index d84077ed8..4ccd6e4f2 100644
--- a/hw/bsp/family_support.cmake
+++ b/hw/bsp/family_support.cmake
@@ -79,48 +79,37 @@ set(WARNING_FLAGS_IAR "")
function(family_filter RESULT DIR)
get_filename_component(DIR ${DIR} ABSOLUTE BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
- if (EXISTS "${DIR}/only.txt")
- file(READ "${DIR}/only.txt" ONLYS)
- # Replace newlines with semicolon so that it is treated as a list by CMake
- string(REPLACE "\n" ";" ONLYS_LINES ${ONLYS})
-
- # For each mcu
+ if (EXISTS "${DIR}/skip.txt")
+ file(STRINGS "${DIR}/skip.txt" SKIPS_LINES)
foreach(MCU IN LISTS FAMILY_MCUS)
# For each line in only.txt
- foreach(_line ${ONLYS_LINES})
- # If mcu:xxx exists for this mcu or board:xxx then include
- if (${_line} STREQUAL "mcu:${MCU}" OR ${_line} STREQUAL "board:${BOARD}")
- set(${RESULT} 1 PARENT_SCOPE)
+ foreach(_line ${SKIPS_LINES})
+ # If mcu:xxx exists for this mcu then skip
+ if (${_line} STREQUAL "mcu:${MCU}" OR ${_line} STREQUAL "board:${BOARD}" OR ${_line} STREQUAL "family:${FAMILY}")
+ set(${RESULT} 0 PARENT_SCOPE)
return()
endif()
endforeach()
endforeach()
+ endif ()
- # Didn't find it in only file so don't build
- set(${RESULT} 0 PARENT_SCOPE)
-
- elseif (EXISTS "${DIR}/skip.txt")
- file(READ "${DIR}/skip.txt" SKIPS)
- # Replace newlines with semicolon so that it is treated as a list by CMake
- string(REPLACE "\n" ";" SKIPS_LINES ${SKIPS})
-
- # For each mcu
+ if (EXISTS "${DIR}/only.txt")
+ file(STRINGS "${DIR}/only.txt" ONLYS_LINES)
foreach(MCU IN LISTS FAMILY_MCUS)
# For each line in only.txt
- foreach(_line ${SKIPS_LINES})
- # If mcu:xxx exists for this mcu then skip
- if (${_line} STREQUAL "mcu:${MCU}")
- set(${RESULT} 0 PARENT_SCOPE)
+ foreach(_line ${ONLYS_LINES})
+ # If mcu:xxx exists for this mcu or board:xxx then include
+ if (${_line} STREQUAL "mcu:${MCU}" OR ${_line} STREQUAL "board:${BOARD}" OR ${_line} STREQUAL "family:${FAMILY}")
+ set(${RESULT} 1 PARENT_SCOPE)
return()
endif()
endforeach()
endforeach()
- # Didn't find in skip file so build
- set(${RESULT} 1 PARENT_SCOPE)
+ # Didn't find it in only file so don't build
+ set(${RESULT} 0 PARENT_SCOPE)
else()
-
- # Didn't find skip or only file so build
+ # only.txt not exist so build
set(${RESULT} 1 PARENT_SCOPE)
endif()
endfunction()
diff --git a/hw/bsp/rp2040/boards/feather_rp2040_max3421/board.cmake b/hw/bsp/rp2040/boards/feather_rp2040_max3421/board.cmake
new file mode 100644
index 000000000..b8e5890f3
--- /dev/null
+++ b/hw/bsp/rp2040/boards/feather_rp2040_max3421/board.cmake
@@ -0,0 +1,4 @@
+set(PICO_BOARD adafruit_feather_rp2040)
+
+# Enable MAX3421E USB Host
+set(MAX3421_HOST 1)
diff --git a/src/portable/analog/max3421/hcd_max3421.c b/src/portable/analog/max3421/hcd_max3421.c
index 242c65501..059f674cd 100644
--- a/src/portable/analog/max3421/hcd_max3421.c
+++ b/src/portable/analog/max3421/hcd_max3421.c
@@ -654,7 +654,7 @@ static void xact_generic(uint8_t rhport, max3421_ep_t *ep, bool switch_ep, bool
// status
if (ep->buf == NULL || ep->total_len == 0) {
- uint8_t const hxfr = HXFR_HS | (ep->hxfr_bm.is_out ? HXFR_OUT_NIN : 0);
+ uint8_t const hxfr = (uint8_t) (HXFR_HS | (ep->hxfr & HXFR_OUT_NIN));
peraddr_write(rhport, ep->daddr, in_isr);
hxfr_write(rhport, hxfr, in_isr);
return;
@@ -676,19 +676,18 @@ bool hcd_edpt_xfer(uint8_t rhport, uint8_t daddr, uint8_t ep_addr, uint8_t * buf
max3421_ep_t* ep = find_opened_ep(daddr, ep_num, ep_dir);
TU_VERIFY(ep);
- // control transfer can switch direction
- ep->hxfr_bm.is_out = ep_dir ? 0u : 1u;
+ if (ep_num == 0) {
+ // control transfer can switch direction
+ ep->hxfr_bm.is_out = ep_dir ? 0 : 1;
+ ep->hxfr_bm.is_setup = 0;
+ ep->data_toggle = 1;
+ }
ep->buf = buffer;
ep->total_len = buflen;
ep->xferred_len = 0;
ep->state = EP_STATE_ATTEMPT_1;
- if (ep_num == 0) {
- ep->hxfr_bm.is_setup = 0;
- ep->data_toggle = 1;
- }
-
// carry out transfer if not busy
if (!atomic_flag_test_and_set(&_hcd_data.busy)) {
xact_generic(rhport, ep, true, false);
diff --git a/tools/build_utils.py b/tools/build_utils.py
index 5d735bc17..b66b64b97 100644
--- a/tools/build_utils.py
+++ b/tools/build_utils.py
@@ -64,18 +64,19 @@ def skip_example(example, board):
skip_file = ex_dir / "skip.txt"
only_file = ex_dir / "only.txt"
- if skip_file.exists() and only_file.exists():
- raise RuntimeError("Only have a skip or only file. Not both.")
- elif skip_file.exists():
+ if skip_file.exists():
skips = skip_file.read_text().split()
- return ("mcu:" + mcu in skips or
- "board:" + board in skips or
- "family:" + family in skips)
- elif only_file.exists():
+ if ("mcu:" + mcu in skips or
+ "board:" + board in skips or
+ "family:" + family in skips):
+ return True
+
+ if only_file.exists():
onlys = only_file.read_text().split()
- return not ("mcu:" + mcu in onlys or
- "board:" + board in onlys or
- "family:" + family in onlys)
+ if not ("mcu:" + mcu in onlys or
+ "board:" + board in onlys or
+ "family:" + family in onlys):
+ return True
return False