1# support for the Analog Devices toolchain for their DSPs
2# Raphael Cotty" <raphael.cotty (AT) googlemail.com>
3#
4# it supports three architectures:
5# Blackfin
6# TS (TigerShark)
7# 21k (Sharc 21xxx)
8
9if(NOT ADSP)
10
11  set(ADSP TRUE)
12
13  set(CMAKE_STATIC_LIBRARY_SUFFIX ".dlb")
14  set(CMAKE_SHARED_LIBRARY_SUFFIX "")
15  set(CMAKE_EXECUTABLE_SUFFIX ".dxe")
16
17  # if ADSP_PROCESSOR has not been set, but CMAKE_SYSTEM_PROCESSOR has,
18  # assume that this is the processor name to use for the compiler
19  if(CMAKE_SYSTEM_PROCESSOR AND NOT ADSP_PROCESSOR)
20    set(ADSP_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR})
21  endif()
22
23  # if ADSP_PROCESSOR_SILICIUM_REVISION has not been set, use "none"
24  if(NOT ADSP_PROCESSOR_SILICIUM_REVISION)
25    set(ADSP_PROCESSOR_SILICIUM_REVISION "none")
26  endif()
27
28  # this file is included from the C and CXX files, so handle both here
29
30  get_filename_component(_ADSP_DIR "${CMAKE_C_COMPILER}" PATH)
31  if(NOT _ADSP_DIR)
32    get_filename_component(_ADSP_DIR "${CMAKE_CXX_COMPILER}" PATH)
33  endif()
34  if(NOT _ADSP_DIR)
35    get_filename_component(_ADSP_DIR "${CMAKE_ASM_COMPILER}" PATH)
36  endif()
37
38  # detect architecture
39
40  if(CMAKE_C_COMPILER MATCHES ccblkfn OR CMAKE_CXX_COMPILER MATCHES ccblkfn OR CMAKE_ASM_COMPILER MATCHES easmBLKFN)
41    if(NOT ADSP_PROCESSOR)
42      set(ADSP_PROCESSOR "ADSP-BF561")
43    endif()
44    set(ADSP_BLACKFIN TRUE)
45    set(_ADSP_FAMILY_DIR "${_ADSP_DIR}/Blackfin")
46  endif()
47
48  if(CMAKE_C_COMPILER MATCHES ccts OR CMAKE_CXX_COMPILER MATCHES ccts OR CMAKE_ASM_COMPILER MATCHES easmTS)
49    if(NOT ADSP_PROCESSOR)
50      set(ADSP_PROCESSOR "ADSP-TS101")
51    endif()
52    set(ADSP_TS TRUE)
53    set(_ADSP_FAMILY_DIR "${_ADSP_DIR}/TS")
54  endif()
55
56  if(CMAKE_C_COMPILER MATCHES cc21k OR CMAKE_CXX_COMPILER MATCHES cc21k OR CMAKE_ASM_COMPILER MATCHES easm21k)
57    if(NOT ADSP_PROCESSOR)
58      set(ADSP_PROCESSOR "ADSP-21060")
59    endif()
60    set(ADSP_21K TRUE)
61
62    set(_ADSP_FAMILY_DIR "${_ADSP_DIR}/21k")  # default if nothing matches
63    if   (ADSP_PROCESSOR MATCHES "210..$")
64      set(_ADSP_FAMILY_DIR "${_ADSP_DIR}/21k")
65    endif()
66
67    if   (ADSP_PROCESSOR MATCHES "211..$")
68      set(_ADSP_FAMILY_DIR "${_ADSP_DIR}/211k")
69    endif()
70
71    if   (ADSP_PROCESSOR MATCHES "212..$")
72      set(_ADSP_FAMILY_DIR "${_ADSP_DIR}/212k")
73    endif()
74
75    if   (ADSP_PROCESSOR MATCHES "213..$")
76      set(_ADSP_FAMILY_DIR "${_ADSP_DIR}/213k")
77    endif()
78
79    set(_ADSP_FAMILY_DIR "${_ADSP_DIR}/21k")
80  endif()
81
82
83  link_directories("${_ADSP_FAMILY_DIR}/lib")
84
85  # vdk support
86  find_program( ADSP_VDKGEN_EXECUTABLE vdkgen "${_ADSP_FAMILY_DIR}/vdk" )
87
88  macro(ADSP_GENERATE_VDK VDK_GENERATED_HEADER VDK_GENERATED_SOURCE VDK_KERNEL_SUPPORT_FILE)
89    add_custom_command(
90      OUTPUT ${VDK_GENERATED_HEADER} ${VDK_GENERATED_SOURCE}
91      COMMAND ${ADSP_VDKGEN_EXECUTABLE} ${VDK_KERNEL_SUPPORT_FILE} -proc ${ADSP_PROCESSOR} -si-revision ${ADSP_PROCESSOR_SILICIUM_REVISION} -MM
92      DEPENDS ${VDK_KERNEL_SUPPORT_FILE}
93      )
94  endmacro()
95
96  # loader support
97  find_program( ADSP_ELFLOADER_EXECUTABLE elfloader "${_ADSP_FAMILY_DIR}" )
98
99  # BOOT_MODE: prom, flash, spi, spislave, UART, TWI, FIFO
100  # FORMAT: hex, ASCII, binary, include
101  # WIDTH: 8, 16
102  macro(ADSP_CREATE_LOADER_FILE TARGET_NAME BOOT_MODE FORMAT WIDTH)
103    add_custom_command(
104      TARGET ${TARGET_NAME}
105      POST_BUILD
106      COMMAND ${ADSP_ELFLOADER_EXECUTABLE} ${EXECUTABLE_OUTPUT_PATH}/${TARGET_NAME}.dxe -proc ${ADSP_PROCESSOR} -si-revision ${ADSP_PROCESSOR_SILICIUM_REVISION} -b ${BOOT_MODE} -f ${FORMAT} -width ${WIDTH} -o ${EXECUTABLE_OUTPUT_PATH}/${TARGET_NAME}.ldr
107      COMMENT "Building the loader file"
108      )
109  endmacro()
110
111  macro(ADSP_CREATE_LOADER_FILE_INIT TARGET_NAME BOOT_MODE FORMAT WIDTH INITIALIZATION_FILE)
112    add_custom_command(
113      TARGET ${TARGET_NAME}
114      POST_BUILD
115      COMMAND ${ADSP_ELFLOADER_EXECUTABLE} ${EXECUTABLE_OUTPUT_PATH}/${TARGET_NAME}.dxe -proc ${ADSP_PROCESSOR} -si-revision ${ADSP_PROCESSOR_SILICIUM_REVISION} -b ${BOOT_MODE} -f ${FORMAT} -width ${WIDTH} -o ${EXECUTABLE_OUTPUT_PATH}/${TARGET_NAME}.ldr -init ${INITIALIZATION_FILE}
116      COMMENT "Building the loader file"
117      )
118  endmacro()
119
120endif()
121