1cmake_minimum_required(VERSION 3.13 FATAL_ERROR)
2cmake_policy(SET CMP0054 NEW)
3cmake_policy(SET CMP0057 NEW)
4cmake_policy(SET CMP0077 NEW)
5
6project(usbx_test LANGUAGES C)
7
8# Use customized ux_user.h
9set(UX_USER_FILE ${CMAKE_CURRENT_SOURCE_DIR}/ux_user.h)
10
11# Copy files instead of using symlink
12# libs/ -> ../libs/
13file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/libs)
14configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../libs/CMakeLists.txt
15               ${CMAKE_CURRENT_SOURCE_DIR}/libs/CMakeLists.txt COPYONLY)
16configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../libs/nx_user.h
17               ${CMAKE_CURRENT_SOURCE_DIR}/libs/nx_user.h COPYONLY)
18
19# Set build configurations
20# TODO: add when available : standalone_otg_build
21set(BUILD_CONFIGURATIONS
22  default_build_coverage
23  error_check_build_full_coverage
24  tracex_enable_build
25  device_buffer_owner_build
26  device_zero_copy_build
27  nofx_build_coverage
28  optimized_build
29  standalone_device_build_coverage
30  standalone_device_buffer_owner_build
31  standalone_device_zero_copy_build
32  standalone_host_build_coverage
33  standalone_build_coverage
34  generic_build
35  otg_support_build
36  memory_management_build_coverage
37  msrc_rtos_build
38  msrc_standalone_build
39  )
40
41set(CMAKE_CONFIGURATION_TYPES
42    ${BUILD_CONFIGURATIONS}
43    CACHE STRING "list of supported configuration types" FORCE)
44set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
45                                             ${CMAKE_CONFIGURATION_TYPES})
46list(GET CMAKE_CONFIGURATION_TYPES 0 BUILD_TYPE)
47if((NOT CMAKE_BUILD_TYPE) OR (NOT ("${CMAKE_BUILD_TYPE}" IN_LIST
48                                   CMAKE_CONFIGURATION_TYPES)))
49  set(CMAKE_BUILD_TYPE
50      "${BUILD_TYPE}"
51      CACHE STRING "Build Type of the project" FORCE)
52endif()
53
54message(STATUS "Build for usbx")
55message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
56message(STATUS "Using toolchain file: ${CMAKE_TOOLCHAIN_FILE}.")
57
58set(default_build_coverage
59  -DNX_PHYSICAL_HEADER=20
60#  -DUX_SLAVE_REQUEST_CONTROL_MAX_LENGTH=512
61#  -DUX_DEVICE_BIDIRECTIONAL_ENDPOINT_SUPPORT
62#  -DUX_HOST_DEVICE_CLASS_CODE_VALIDATION_ENABLE
63# -DUX_DEVICE_CLASS_HID_INTERRUPT_OUT_SUPPORT
64# -DUX_HOST_CLASS_HID_INTERRUPT_OUT_SUPPORT
65  -DUX_DISABLE_ASSERT
66##############################################FeedBack Test Start
67#  -DUX_DEVICE_CLASS_AUDIO_FEEDBACK_SUPPORT
68#  -DUX_MAX_DEVICE_ENDPOINTS=6
69#  -DUX_DEVICE_BIDIRECTIONAL_ENDPOINT_SUPPORT
70#  -DUX_SLAVE_REQUEST_CONTROL_MAX_LENGTH=512
71##############################################FeedBack Test end
72  # -DUX_HOST_CLASS_AUDIO_2_SUPPORT
73  # -DUX_HOST_CLASS_AUDIO_FEEDBACK_SUPPORT
74  # -DUX_HOST_CLASS_AUDIO_DISABLE_CONTROLS
75  # -DUX_HOST_CLASS_AUDIO_INTERRUPT_SUPPORT
76  # -DUX_DEVICE_CLASS_PRINTER_WRITE_AUTO_ZLP
77  # -DUX_DEVICE_CLASS_CDC_ACM_WRITE_AUTO_ZLP
78  # -DUX_DEVICE_CLASS_AUDIO_INTERRUPT_SUPPORT
79  -DUX_HOST_STACK_CONFIGURATION_INSTANCE_CREATE_CONTROL=0
80  -DUX_DEVICE_ENABLE_GET_STRING_WITH_ZERO_LANGUAGE_ID
81)
82
83set(error_check_build_full_coverage
84  ${default_build_coverage}
85  -DUX_ENABLE_ASSERT
86  -DUX_ENABLE_ERROR_CHECKING
87  -DUX_PIMA_WITH_MTP_SUPPORT
88)
89
90set(msrc_rtos_build
91  ${error_check_build_full_coverage}
92  -DUX_SLAVE_REQUEST_CONTROL_MAX_LENGTH=512
93  -DUX_HOST_CLASS_AUDIO_2_SUPPORT
94  -DUX_HOST_CLASS_AUDIO_INTERRUPT_SUPPORT
95)
96set(msrc_standalone_build
97  ${msrc_rtos_build}
98  -DUX_STANDALONE
99)
100
101set(tracex_enable_build
102  -DNX_PHYSICAL_HEADER=20
103  -DTX_ENABLE_EVENT_TRACE
104  -DUX_TRACE_INSERT_MACROS
105)
106
107set(device_buffer_owner_build
108  -DNX_PHYSICAL_HEADER=20
109# -DUX_ENABLE_ASSERT
110  -DTX_ENABLE_EVENT_TRACE
111  -DUX_TRACE_INSERT_MACROS
112  -DUX_SLAVE_REQUEST_CONTROL_MAX_LENGTH=512
113  -DUX_DEVICE_ENDPOINT_BUFFER_OWNER=1
114  # -DUX_DEVICE_CLASS_CDC_ACM_TRANSMISSION_DISABLE
115  -DUX_DEVICE_CLASS_HID_INTERRUPT_OUT_SUPPORT
116  -DUX_DEVICE_CLASS_AUDIO_FEEDBACK_SUPPORT
117  -DUX_DEVICE_CLASS_AUDIO_INTERRUPT_SUPPORT
118)
119set(device_zero_copy_build
120  ${device_buffer_owner_build}
121  -DUX_DEVICE_CLASS_CDC_ACM_ZERO_COPY
122  -DUX_DEVICE_CLASS_CDC_ACM_WRITE_AUTO_ZLP
123  -DUX_DEVICE_CLASS_HID_ZERO_COPY
124  -DUX_DEVICE_CLASS_CDC_ECM_ZERO_COPY
125  -DUX_DEVICE_CLASS_RNDIS_ZERO_COPY
126  -DUX_DEVICE_CLASS_PRINTER_ZERO_COPY
127)
128
129set(nofx_build_coverage
130  -DNX_PHYSICAL_HEADER=20
131  -DUX_HOST_CLASS_STORAGE_NO_FILEX
132)
133set(standalone_build_coverage
134  -DNX_PHYSICAL_HEADER=20
135  -DUX_STANDALONE
136  # -DTX_ENABLE_EVENT_TRACE
137)
138set(standalone_device_build_coverage
139  -DUX_DEVICE_STANDALONE
140  # -DUX_DEVICE_CLASS_HID_INTERRUPT_OUT_SUPPORT
141  -DUX_SLAVE_REQUEST_CONTROL_MAX_LENGTH=512
142##############################################FeedBack Test Start
143#  -DUX_DEVICE_CLASS_AUDIO_FEEDBACK_SUPPORT
144#  -DUX_MAX_DEVICE_ENDPOINTS=6
145#  -DUX_DEVICE_BIDIRECTIONAL_ENDPOINT_SUPPORT
146##############################################FeedBack Test End
147#  -DUX_DEVICE_CLASS_AUDIO_INTERRUPT_SUPPORT
148  -DUX_ENABLE_ERROR_CHECKING
149)
150set(standalone_device_buffer_owner_build
151  ${device_buffer_owner_build}
152  ${standalone_device_build_coverage}
153)
154set(standalone_device_zero_copy_build
155  ${device_zero_copy_build}
156  ${standalone_device_build_coverage}
157)
158set(standalone_host_build_coverage
159  -DUX_HOST_STANDALONE
160  # -DUX_HOST_CLASS_HID_INTERRUPT_OUT_SUPPORT
161  -DUX_ENABLE_ERROR_CHECKING
162)
163set(standalone_otg_build
164  -DUX_OTG_STANDALONE
165)
166set(optimized_build
167  -DNX_PHYSICAL_HEADER=20
168  -DUX_NAME_REFERENCED_BY_POINTER
169  -DUX_MAX_HCD=1
170  -DUX_MAX_ISO_TD=0
171  -DUX_MAX_TD=20
172  -DUX_MAX_CLASS_DRIVER=1
173  -DUX_MAX_DEVICES=1
174  -DUX_HOST_CLASS_STORAGE_MEMORY_BUFFER_SIZE=512
175  -DUX_HOST_CLASS_STORAGE_MAX_TRANSFER_SIZE=512
176  -DUX_HOST_CLASS_STORAGE_MAX_MEDIA=1
177  -DUX_DEVICE_INITIALIZE_FRAMEWORK_SCAN_DISABLE
178  -DUX_MAX_DEVICE_ENDPOINTS=2
179  -DUX_MAX_DEVICE_INTERFACES=1
180  -DUX_MAX_SLAVE_INTERFACES=1
181  -DUX_MAX_SLAVE_CLASS_DRIVER=1
182  -DUX_MAX_SLAVE_LUN=1
183  -DUX_SLAVE_REQUEST_DATA_MAX_LENGTH=512
184  -DUX_DEVICE_ALTERNATE_SETTING_SUPPORT_DISABLE
185)
186set(generic_build
187  -DUX_HCD_EHCI_SPLIT_TRANSFER_ENABLE
188  -DUX_HOST_CLASS_STORAGE_INCLUDE_LEGACY_PROTOCOL_SUPPORT
189  -DUX_SLAVE_CLASS_STORAGE_INCLUDE_MMC
190  ############################################## warning check: CDC ACM
191  -DUX_DEVICE_CLASS_CDC_ACM_TRANSMISSION_DISABLE
192  ############################################## warning check: DFU
193  # -DUX_DEVICE_CLASS_DFU_UPLOAD_DISABLE
194  # -DUX_DEVICE_CLASS_DFU_ERROR_GET_ENABLE
195  -DUX_DEVICE_CLASS_DFU_STATUS_MODE=1 #0/1
196  -DUX_DEVICE_CLASS_DFU_STATUS_POLLTIMEOUT=0
197  # -DUX_DEVICE_CLASS_DFU_CUSTOM_REQUEST_ENABLE
198  -DUX_HOST_STACK_CONFIGURATION_INSTANCE_CREATE_CONTROL=1
199)
200set(otg_support_build
201  -DNX_PHYSICAL_HEADER=20
202  -DUX_OTG_SUPPORT=
203)
204set(memory_management_build_coverage
205  ${default_build_coverage}
206  -DUX_ENFORCE_SAFE_ALIGNMENT
207  -DUX_ENABLE_MEMORY_STATISTICS
208  -DUX_ENABLE_MEMORY_POOL_SANITY_CHECK
209)
210# Control if USBX is static or shared
211if($ENV{USBX_STATIC})
212  message(STATUS "Building STATIC usbx")
213  set(BUILD_SHARED_LIBS OFF)
214else()
215  message(STATUS "Building usbx BUILD_SHARED_LIBS: ${BUILD_SHARED_LIBS}")
216endif()
217if(NOT BUILD_SHARED_LIBS)
218  if(CMAKE_BUILD_TYPE MATCHES ".*_coverage")
219    add_link_options(-fprofile-arcs)
220    add_link_options(-lgcov)
221  endif()
222endif()
223
224# Control if it's for 64 bit or 32 bit
225if($ENV{ENABLE_64})
226  message(STATUS "Building for 64bit")
227else()
228  add_compile_options(-m32)
229  add_link_options(-m32)
230  message(STATUS "Building for 32bit")
231endif()
232add_compile_options(
233  -std=c99
234  -ggdb
235  -g3
236  -gdwarf-2
237  -fdiagnostics-color
238  -DUX_USE_IO_INSTRUCTIONS
239  #-DUX_DEVICE_CLASS_DFU_CUSTOM_REQUEST_ENABLE
240  #-DUX_DEVICE_CLASS_DFU_STATUS_MODE=1
241  ${${CMAKE_BUILD_TYPE}})
242
243enable_testing()
244
245add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/../../../ usbx)
246if(CMAKE_BUILD_TYPE STREQUAL "generic_build")
247  add_test(fake_test true)
248else()
249  add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/regression regression)
250endif()
251
252# TODO: Unmask after adding sample for STANDALONE
253if(NOT (CMAKE_BUILD_TYPE MATCHES "standalone.*"))
254  add_subdirectory(../usbx/samples samples)
255endif()
256
257# Coverage
258if(CMAKE_BUILD_TYPE MATCHES ".*_coverage")
259  target_compile_options(usbx PRIVATE -fprofile-arcs -ftest-coverage)
260  target_link_options(usbx PRIVATE -fprofile-arcs -ftest-coverage)
261endif()
262
263# Build ThreadX library once
264execute_process(COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/run.sh build_libs)
265add_custom_target(build_libs ALL COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/run.sh
266                                         build_libs)
267
268add_dependencies(usbx build_libs)
269target_include_directories(usbx PUBLIC ${CMAKE_BINARY_DIR}/../libs/inc)
270
271add_library(threadx SHARED IMPORTED GLOBAL)
272add_library("azrtos::threadx" ALIAS threadx)
273set_target_properties(
274  threadx PROPERTIES IMPORTED_LOCATION
275                     ${CMAKE_BINARY_DIR}/../libs/threadx/libthreadx.so)
276
277add_library(netxduo SHARED IMPORTED GLOBAL)
278add_library("azrtos::netxduo" ALIAS netxduo)
279set_target_properties(
280  netxduo PROPERTIES IMPORTED_LOCATION
281                     ${CMAKE_BINARY_DIR}/../libs/netxduo/libnetxduo.so)
282
283add_library(filex SHARED IMPORTED GLOBAL)
284add_library("azrtos::filex" ALIAS filex)
285set_target_properties(
286  filex PROPERTIES IMPORTED_LOCATION
287                   ${CMAKE_BINARY_DIR}/../libs/filex/libfilex.so)
288
289target_compile_options(
290  usbx
291  PRIVATE -Werror
292          -Wall
293          -Wextra
294          -pedantic
295          -fmessage-length=0
296          -fsigned-char
297          -ffunction-sections
298          -fdata-sections
299          -Wunused
300          -Wuninitialized
301          -Wmissing-declarations
302          -Wconversion
303          -Wpointer-arith
304          -Wshadow
305          -Wlogical-op
306          -Waggregate-return
307          -Wfloat-equal)
308
309# Remove includes and files not needed from usbx build
310set(UX_STANDALONE_HOST_EXCLUDES
311  # ux_host_class_asix
312  # ux_host_class_audio
313  # ux_host_class_cdc_acm
314  # ux_host_class_cdc_ecm
315  # ux_host_class_gser
316  # ux_host_class_hid
317  # ux_host_class_hub
318  # ux_host_class_pima
319  # ux_host_class_printer
320  # ux_host_class_prolific
321  # ux_host_class_storage
322  # ux_host_class_swar
323  # ux_host_class_video
324  # ux_hcd_ehci
325  # ux_hcd_ohci
326)
327set(UX_STANDALONE_DEVICE_EXCLUDES
328  # ux_device_class_audio
329  # ux_device_class_cdc_acm
330  # ux_device_class_cdc_ecm
331  # ux_device_class_dfu
332  # ux_device_class_hid
333  # ux_device_class_pima
334  # ux_device_class_rndis
335  # ux_device_class_ccid
336  # ux_device_class_printer
337  # ux_device_class_video
338)
339set(UX_STANDALONE_UTILITY_EXCLUDES
340  # ux_utility_event
341  # ux_utility_delay
342  # ux_utility_mutex
343  # ux_utility_semaphore
344  # ux_utility_thread
345  # ux_utility_timer
346)
347set(UX_STANDALONE_PICTBRIDGE_EXCLUDES
348  # ux_pictbridge
349)
350set(UX_STANDALONE_NX_EXCLUDES
351  # ux_network_driver
352)
353set(UX_STANDALONE_FX_EXCLUDES
354  # ux_host_class_storage_driver_entry
355  usbx_ux_host_class_storage_fx_driver
356)
357if(CMAKE_BUILD_TYPE MATCHES "standalone.*")
358  get_target_property(test_utility_SOURCES_LIST test_utility SOURCES)
359  get_target_property(SOURCES_LIST usbx SOURCES)
360  get_target_property(INCLUDES_LIST usbx INCLUDE_DIRECTORIES)
361
362  if("${CMAKE_BUILD_TYPE}" STREQUAL "standalone_build_coverage")
363    # TODO: enable when STANDALONE implement is done
364    # Remove files not support STANDALONE yet
365    foreach(EXCLUDE_VAL ${UX_STANDALONE_HOST_EXCLUDES}
366                        ${UX_STANDALONE_DEVICE_EXCLUDES}
367                        ${UX_STANDALONE_UTILITY_EXCLUDES}
368                        ${UX_STANDALONE_PICTBRIDGE_EXCLUDES}
369                        ${UX_STANDALONE_NX_EXCLUDES}
370                        ${UX_STANDALONE_FX_EXCLUDES})
371      list(FILTER test_utility_SOURCES_LIST EXCLUDE REGEX ".*${EXCLUDE_VAL}.*")
372      list(FILTER SOURCES_LIST EXCLUDE REGEX ".*${EXCLUDE_VAL}.*")
373    endforeach()
374    # Update includes to remove TX,FX,NX libs
375    list(FILTER INCLUDES_LIST EXCLUDE REGEX ".*externals.*")
376    list(FILTER INCLUDES_LIST EXCLUDE REGEX ".*/libs/inc.*")
377    # Update library links to remove TX,FX,NX libs
378    set_target_properties(usbx PROPERTIES LINK_LIBRARIES "")
379    set_target_properties(usbx PROPERTIES INTERFACE_LINK_LIBRARIES "")
380
381  elseif("${CMAKE_BUILD_TYPE}" STREQUAL "standalone_device_build_coverage")
382    # Only device part linked with STANDALONE
383    # Remove files not support STANDALONE yet
384    foreach(EXCLUDE_VAL ${UX_STANDALONE_DEVICE_EXCLUDES})
385      list(FILTER SOURCES_LIST EXCLUDE REGEX ".*${EXCLUDE_VAL}.*")
386      list(FILTER test_utility_SOURCES_LIST EXCLUDE REGEX ".*${EXCLUDE_VAL}.*")
387    endforeach()
388
389  elseif("${CMAKE_BUILD_TYPE}" STREQUAL "standalone_host_build_coverage")
390    # Only host part linked with STANDALONE
391    # Remove files not support STANDALONE yet
392    foreach(EXCLUDE_VAL ${UX_STANDALONE_HOST_EXCLUDES})
393      list(FILTER SOURCES_LIST EXCLUDE REGEX ".*${EXCLUDE_VAL}.*")
394      list(FILTER test_utility_SOURCES_LIST EXCLUDE REGEX ".*${EXCLUDE_VAL}.*")
395    endforeach()
396
397  elseif("${CMAKE_BUILD_TYPE}" STREQUAL "standalone_otg_build")
398    # Only some stack file linked with STANDALONE
399    # No file list change for now
400  endif()
401
402  # Commit sources and includes changes
403  set_target_properties(test_utility PROPERTIES SOURCES "${test_utility_SOURCES_LIST}")
404  set_target_properties(usbx PROPERTIES SOURCES "${SOURCES_LIST}")
405  set_target_properties(usbx PROPERTIES INCLUDE_DIRECTORIES "${INCLUDES_LIST}")
406endif()
407
408# Remove files not compatible with optimized build
409set(UX_OPTIMIZED_EXCLUDES
410  ux_device_class_rndis # buffer smaller than message size
411)
412if(CMAKE_BUILD_TYPE STREQUAL "optimized_build")
413  get_target_property(test_utility_SOURCES_LIST test_utility SOURCES)
414  get_target_property(SOURCES_LIST usbx SOURCES)
415
416  # Remove files not support STANDALONE yet
417  foreach(EXCLUDE_VAL ${UX_OPTIMIZED_EXCLUDES})
418    list(FILTER test_utility_SOURCES_LIST EXCLUDE REGEX ".*${EXCLUDE_VAL}.*")
419    list(FILTER SOURCES_LIST EXCLUDE REGEX ".*${EXCLUDE_VAL}.*")
420  endforeach()
421
422  # Commit sources and includes changes
423  set_target_properties(test_utility PROPERTIES SOURCES "${test_utility_SOURCES_LIST}")
424  set_target_properties(usbx PROPERTIES SOURCES "${SOURCES_LIST}")
425endif()
426
427# Use generic port file for generic build.
428if(CMAKE_BUILD_TYPE STREQUAL "generic_build")
429  get_target_property(INCLUDES_LIST usbx INCLUDE_DIRECTORIES)
430  set(NEW_INCLUDES_LIST "")
431  foreach(INCLUDE_LIST ${INCLUDES_LIST})
432    string(REPLACE "ports/linux/gnu" "ports/generic" INCLUDE_LIST ${INCLUDE_LIST})
433    list(APPEND NEW_INCLUDES_LIST "${INCLUDE_LIST}")
434  endforeach()
435  set_target_properties(usbx PROPERTIES INCLUDE_DIRECTORIES "${NEW_INCLUDES_LIST}")
436endif()