/bertos/cpu/detect.h

https://github.com/batt/StratoSpera · C Header · 559 lines · 440 code · 71 blank · 48 comment · 21 complexity · 2239e30a423756e2270ff77c428e00fe MD5 · raw file

  1. /**
  2. * \file
  3. * <!--
  4. * This file is part of BeRTOS.
  5. *
  6. * Bertos is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  19. *
  20. * As a special exception, you may use this file as part of a free software
  21. * library without restriction. Specifically, if other files instantiate
  22. * templates or use macros or inline functions from this file, or you compile
  23. * this file and link it with other files to produce an executable, this
  24. * file does not by itself cause the resulting executable to be covered by
  25. * the GNU General Public License. This exception does not however
  26. * invalidate any other reasons why the executable file might be covered by
  27. * the GNU General Public License.
  28. *
  29. * Copyright 2004, 2005, 2006, 2007 Develer S.r.l. (http://www.develer.com/)
  30. * Copyright 2004 Giovanni Bajo
  31. *
  32. * -->
  33. *
  34. * \brief CPU detection through special preprocessor macros
  35. */
  36. #ifndef CPU_DETECT_H
  37. #define CPU_DETECT_H
  38. #if defined(__ARM_ARCH_4T__) /* GCC */ \
  39. || defined(__ARM4TM__) /* IAR: defined for all cores >= 4tm */
  40. #define CPU_ARM 1
  41. #define CPU_ID arm
  42. #define CPU_CORE_NAME "ARM7TDMI"
  43. // AT91SAM7S core family
  44. #if defined(__ARM_AT91SAM7S32__)
  45. #define CPU_ARM_AT91 1
  46. #define CPU_ARM_AT91SAM7S32 1
  47. #define CPU_NAME "AT91SAM7S32"
  48. #else
  49. #define CPU_ARM_AT91SAM7S32 0
  50. #endif
  51. #if defined(__ARM_AT91SAM7S64__)
  52. #define CPU_ARM_AT91 1
  53. #define CPU_ARM_SAM7S_LARGE 1
  54. #define CPU_ARM_AT91SAM7S64 1
  55. #define CPU_NAME "AT91SAM7S64"
  56. #else
  57. #define CPU_ARM_AT91SAM7S64 0
  58. #endif
  59. #if defined(__ARM_AT91SAM7S128__)
  60. #define CPU_ARM_AT91 1
  61. #define CPU_ARM_SAM7S_LARGE 1
  62. #define CPU_ARM_AT91SAM7S128 1
  63. #define CPU_NAME "AT91SAM7S128"
  64. #else
  65. #define CPU_ARM_AT91SAM7S128 0
  66. #endif
  67. #if defined(__ARM_AT91SAM7S256__)
  68. #define CPU_ARM_AT91 1
  69. #define CPU_ARM_SAM7S_LARGE 1
  70. #define CPU_ARM_AT91SAM7S256 1
  71. #define CPU_NAME "AT91SAM7S256"
  72. #else
  73. #define CPU_ARM_AT91SAM7S256 0
  74. #endif
  75. #if defined(__ARM_AT91SAM7S512__)
  76. #define CPU_ARM_AT91 1
  77. #define CPU_ARM_SAM7S_LARGE 1
  78. #define CPU_ARM_AT91SAM7S512 1
  79. #define CPU_NAME "AT91SAM7S512"
  80. #else
  81. #define CPU_ARM_AT91SAM7S512 0
  82. #endif
  83. // AT91SAM7X core family
  84. #if defined(__ARM_AT91SAM7X128__)
  85. #define CPU_ARM_AT91 1
  86. #define CPU_ARM_SAM7X 1
  87. #define CPU_ARM_AT91SAM7X128 1
  88. #define CPU_NAME "AT91SAM7X128"
  89. #else
  90. #define CPU_ARM_AT91SAM7X128 0
  91. #endif
  92. #if defined(__ARM_AT91SAM7X256__)
  93. #define CPU_ARM_AT91 1
  94. #define CPU_ARM_SAM7X 1
  95. #define CPU_ARM_AT91SAM7X256 1
  96. #define CPU_NAME "AT91SAM7X256"
  97. #else
  98. #define CPU_ARM_AT91SAM7X256 0
  99. #endif
  100. #if defined(__ARM_AT91SAM7X512__)
  101. #define CPU_ARM_AT91 1
  102. #define CPU_ARM_SAM7X 1
  103. #define CPU_ARM_AT91SAM7X512 1
  104. #define CPU_NAME "AT91SAM7X512"
  105. #else
  106. #define CPU_ARM_AT91SAM7X512 0
  107. #endif
  108. #if defined(__ARM_LPC2378__)
  109. #define CPU_ARM_LPC2 1
  110. #define CPU_ARM_LPC2378 1
  111. #define CPU_NAME "LPC2378"
  112. #else
  113. #define CPU_ARM_LPC2378 0
  114. #endif
  115. #if !defined(CPU_ARM_SAM7S_LARGE)
  116. #define CPU_ARM_SAM7S_LARGE 0
  117. #endif
  118. #if !defined(CPU_ARM_SAM7X)
  119. #define CPU_ARM_SAM7X 0
  120. #endif
  121. #if defined(CPU_ARM_AT91)
  122. #if CPU_ARM_AT91SAM7S32 + CPU_ARM_AT91SAM7S64 \
  123. + CPU_ARM_AT91SAM7S128 + CPU_ARM_AT91SAM7S256 \
  124. + CPU_ARM_AT91SAM7S512 \
  125. + CPU_ARM_AT91SAM7X128 + CPU_ARM_AT91SAM7X256 \
  126. + CPU_ARM_AT91SAM7X512 != 1
  127. #error ARM CPU configuration error
  128. #endif
  129. #define CPU_ARM_LPC2 0
  130. #elif defined (CPU_ARM_LPC2)
  131. #if CPU_ARM_LPC2378 + 0 != 1
  132. #error NXP LPC2xxx ARM CPU configuration error
  133. #endif
  134. #define CPU_ARM_AT91 0
  135. /* #elif Add other ARM families here */
  136. #else
  137. #define CPU_ARM_AT91 0
  138. #define CPU_ARM_LPC2 0
  139. #endif
  140. #if CPU_ARM_AT91 + CPU_ARM_LPC2 + 0 /* Add other ARM families here */ != 1
  141. #error ARM CPU configuration error
  142. #endif
  143. #else
  144. #define CPU_ARM 0
  145. /* ARM Families */
  146. #define CPU_ARM_AT91 0
  147. #define CPU_ARM_LPC2 0
  148. /* SAM7 sub-families */
  149. #define CPU_ARM_SAM7S_LARGE 0
  150. #define CPU_ARM_SAM7X 0
  151. /* ARM CPUs */
  152. #define CPU_ARM_AT91SAM7S32 0
  153. #define CPU_ARM_AT91SAM7S64 0
  154. #define CPU_ARM_AT91SAM7S128 0
  155. #define CPU_ARM_AT91SAM7S256 0
  156. #define CPU_ARM_AT91SAM7S512 0
  157. #define CPU_ARM_AT91SAM7X128 0
  158. #define CPU_ARM_AT91SAM7X256 0
  159. #define CPU_ARM_AT91SAM7X512 0
  160. #define CPU_ARM_LPC2378 0
  161. #endif
  162. #if defined(__ARM_ARCH_7M__)
  163. /* Cortex-M3 */
  164. #define CPU_CM3 1
  165. #define CPU_ID cm3
  166. #define CPU_CORE_NAME "Cortex-M3"
  167. #if defined (__ARM_LM3S1968__)
  168. #define CPU_CM3_LM3S 1
  169. #define CPU_CM3_LM3S1968 1
  170. #define CPU_NAME "LM3S1968"
  171. #else
  172. #define CPU_CM3_LM3S1968 0
  173. #endif
  174. #if defined (__ARM_LM3S8962__)
  175. #define CPU_CM3_LM3S 1
  176. #define CPU_CM3_LM3S8962 1
  177. #define CPU_NAME "LM3S8962"
  178. #else
  179. #define CPU_CM3_LM3S8962 0
  180. #endif
  181. #if defined (__ARM_STM32F100RB__)
  182. #define CPU_CM3_STM32 1
  183. #define CPU_CM3_STM32F100RB 1
  184. #define CPU_NAME "STM32F100RB"
  185. #else
  186. #define CPU_CM3_STM32F100RB 0
  187. #endif
  188. #if defined (__ARM_STM32F100C4__)
  189. #define CPU_CM3_STM32 1
  190. #define CPU_CM3_STM32F100C4 1
  191. #define CPU_NAME "STM32F100C4"
  192. #else
  193. #define CPU_CM3_STM32F100C4 0
  194. #endif
  195. #if defined (__ARM_STM32F101C4__)
  196. #define CPU_CM3_STM32 1
  197. #define CPU_CM3_STM32F101C4 1
  198. #define CPU_NAME "STM32F101C4"
  199. #else
  200. #define CPU_CM3_STM32F101C4 0
  201. #endif
  202. #if defined (__ARM_STM32F102C4__)
  203. #define CPU_CM3_STM32 1
  204. #define CPU_CM3_STM32F102C4 1
  205. #define CPU_NAME "STM32F102C4"
  206. #else
  207. #define CPU_CM3_STM32F102C4 0
  208. #endif
  209. #if defined (__ARM_STM32F103RB__)
  210. #define CPU_CM3_STM32 1
  211. #define CPU_CM3_STM32F103RB 1
  212. #define CPU_NAME "STM32F103RB"
  213. #else
  214. #define CPU_CM3_STM32F103RB 0
  215. #endif
  216. #if defined (__ARM_STM32F103RE__)
  217. #define CPU_CM3_STM32 1
  218. #define CPU_CM3_STM32F103RE 1
  219. #define CPU_NAME "STM32F103RE"
  220. #else
  221. #define CPU_CM3_STM32F103RE 0
  222. #endif
  223. // AT91SAM3N products serie
  224. #if defined (__ARM_SAM3N4__)
  225. #define CPU_CM3_SAM3 1
  226. #define CPU_CM3_SAM3N 1
  227. #define CPU_CM3_SAM3N4 1
  228. #define CPU_NAME "SAM3N4"
  229. #define CPU_CM3_SAM3S 0
  230. #define CPU_CM3_SAM3U 0
  231. #define CPU_CM3_SAM3N2 0
  232. #define CPU_CM3_SAM3N1 0
  233. #define CPU_CM3_SAM3X 0
  234. #else
  235. #define CPU_CM3_SAM3N4 0
  236. #endif
  237. // AT91SAM3S products serie
  238. #if defined (__ARM_SAM3S4__)
  239. #define CPU_CM3_SAM3 1
  240. #define CPU_CM3_SAM3S 1
  241. #define CPU_CM3_SAM3S4 1
  242. #define CPU_NAME "SAM3S4"
  243. #define CPU_CM3_SAM3N 0
  244. #define CPU_CM3_SAM3U 0
  245. #define CPU_CM3_SAM3X 0
  246. #else
  247. #define CPU_CM3_SAM3S4 0
  248. #endif
  249. // AT91SAM3U products serie
  250. #if defined (__ARM_SAM3U4__)
  251. #define CPU_CM3_SAM3 1
  252. #define CPU_CM3_SAM3U 1
  253. #define CPU_CM3_SAM3U4 1
  254. #define CPU_NAME "SAM3U4"
  255. #define CPU_CM3_SAM3N 0
  256. #define CPU_CM3_SAM3S 0
  257. #define CPU_CM3_SAM3X 0
  258. #else
  259. #define CPU_CM3_SAM3U4 0
  260. #endif
  261. // AT91SAM3X products serie
  262. #if defined (__ARM_SAM3X8__)
  263. #define CPU_CM3_SAM3 1
  264. #define CPU_CM3_SAM3X 1
  265. #define CPU_CM3_SAM3X8 1
  266. #define CPU_NAME "SAM3X8"
  267. #define CPU_CM3_SAM3N 0
  268. #define CPU_CM3_SAM3S 0
  269. #define CPU_CM3_SAM3U 0
  270. #else
  271. #define CPU_CM3_SAM3X8 0
  272. #endif
  273. #if defined (CPU_CM3_LM3S)
  274. #if CPU_CM3_LM3S1968 + CPU_CM3_LM3S8962 + 0 != 1
  275. #error Luminary Cortex-M3 CPU configuration error
  276. #endif
  277. #define CPU_CM3_STM32 0
  278. #define CPU_CM3_SAM3 0
  279. #elif defined (CPU_CM3_STM32)
  280. #if CPU_CM3_STM32F100RB + CPU_CM3_STM32F100C4 + CPU_CM3_STM32F101C4 + CPU_CM3_STM32F103RB + CPU_CM3_STM32F103RE + \
  281. CPU_CM3_STM32F102C4 + 0 != 1
  282. #error STM32 Cortex-M3 CPU configuration error
  283. #endif
  284. #define CPU_CM3_LM3S 0
  285. #define CPU_CM3_SAM3 0
  286. #elif defined (CPU_CM3_SAM3)
  287. #if CPU_CM3_SAM3N + CPU_CM3_SAM3U + CPU_CM3_SAM3S + CPU_CM3_SAM3X + 0 != 1
  288. #error SAM3 Cortex-M3 CPU configuration error
  289. #endif
  290. #if CPU_CM3_SAM3N4 + CPU_CM3_SAM3S4 + CPU_CM3_SAM3U4 + CPU_CM3_SAM3X8 + 0 != 1
  291. #error SAM3 Cortex-M3 CPU configuration error
  292. #endif
  293. #define CPU_CM3_LM3S 0
  294. #define CPU_CM3_STM32 0
  295. /* #elif Add other Cortex-M3 families here */
  296. #else
  297. #define CPU_CM3_LM3S 0
  298. #define CPU_CM3_STM32 0
  299. #define CPU_CM3_SAM3 0
  300. #endif
  301. #if CPU_CM3_LM3S + CPU_CM3_STM32 + CPU_CM3_SAM3 + 0 /* Add other Cortex-M3 families here */ != 1
  302. #error Cortex-M3 CPU configuration error
  303. #endif
  304. #else
  305. #define CPU_CM3 0
  306. #define CPU_CM3_LM3S 0
  307. #define CPU_CM3_LM3S1968 0
  308. #define CPU_CM3_LM3S8962 0
  309. #define CPU_CM3_STM32 0
  310. #define CPU_CM3_STM32F100RB 0
  311. #define CPU_CM3_STM32F100C4 0
  312. #define CPU_CM3_STM32F103RB 0
  313. #define CPU_CM3_STM32F101C4 0
  314. #define CPU_CM3_STM32F103RE 0
  315. #define CPU_CM3_SAM3 0
  316. #define CPU_CM3_SAM3N 0
  317. #define CPU_CM3_SAM3N4 0
  318. #define CPU_CM3_SAM3X 0
  319. #define CPU_CM3_SAM3X8 0
  320. #endif
  321. #if (defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)) \
  322. && !defined(__ARM4TM__) /* IAR: if not ARM assume I196 */
  323. #warning Assuming CPU is I196
  324. #define CPU_I196 1
  325. #define CPU_ID i196
  326. #else
  327. #define CPU_I196 0
  328. #endif
  329. #if defined(__i386__) /* GCC */ \
  330. || (defined(_M_IX86) && !defined(_WIN64)) /* MSVC */
  331. #define CPU_X86 1
  332. #define CPU_X86_32 1
  333. #define CPU_X86_64 0
  334. #define CPU_ID x86
  335. #define CPU_CORE_NAME "x86"
  336. #define CPU_NAME "generic"
  337. #elif defined(__x86_64__) /* GCC */ \
  338. || (defined(_M_IX86) && defined(_WIN64)) /* MSVC */
  339. #define CPU_X86 1
  340. #define CPU_X86_32 0
  341. #define CPU_X86_64 1
  342. #define CPU_ID x86
  343. #define CPU_CORE_NAME "x86_64"
  344. #define CPU_NAME "generic"
  345. #else
  346. #define CPU_X86 0
  347. #define CPU_I386 0
  348. #define CPU_X86_64 0
  349. #endif
  350. #if defined (_ARCH_PPC) || defined(_ARCH_PPC64)
  351. #define CPU_PPC 1
  352. #define CPU_ID ppc
  353. #if defined(_ARCH_PPC)
  354. #define CPU_PPC32 1
  355. #else
  356. #define CPU_PPC32 0
  357. #endif
  358. #if defined(_ARCH_PPC64)
  359. #define CPU_PPC64 1
  360. #else
  361. #define CPU_PPC64 0
  362. #endif
  363. #else
  364. #define CPU_PPC 0
  365. #define CPU_PPC32 0
  366. #define CPU_PPC64 0
  367. #endif
  368. #if defined(__m56800E__) || defined(__m56800__)
  369. #define CPU_DSP56K 1
  370. #define CPU_ID dsp56k
  371. #else
  372. #define CPU_DSP56K 0
  373. #endif
  374. #if defined (__AVR__)
  375. #define CPU_AVR 1
  376. #define CPU_ID avr
  377. #define CPU_CORE_NAME "AVR"
  378. #if defined(__AVR_ATmega32__)
  379. #define CPU_AVR_ATMEGA32 1
  380. #define CPU_NAME "ATmega32"
  381. #else
  382. #define CPU_AVR_ATMEGA32 0
  383. #endif
  384. #if defined(__AVR_ATmega64__)
  385. #define CPU_AVR_ATMEGA64 1
  386. #define CPU_NAME "ATmega64"
  387. #else
  388. #define CPU_AVR_ATMEGA64 0
  389. #endif
  390. #if defined(__AVR_ATmega103__)
  391. #define CPU_AVR_ATMEGA103 1
  392. #define CPU_NAME "ATmega103"
  393. #else
  394. #define CPU_AVR_ATMEGA103 0
  395. #endif
  396. #if defined(__AVR_ATmega128__)
  397. #define CPU_AVR_ATMEGA128 1
  398. #define CPU_NAME "ATmega128"
  399. #else
  400. #define CPU_AVR_ATMEGA128 0
  401. #endif
  402. #if defined(__AVR_ATmega8__)
  403. #define CPU_AVR_ATMEGA8 1
  404. #define CPU_NAME "ATmega8"
  405. #else
  406. #define CPU_AVR_ATMEGA8 0
  407. #endif
  408. #if defined(__AVR_ATmega168__)
  409. #define CPU_AVR_ATMEGA168 1
  410. #define CPU_NAME "ATmega168"
  411. #else
  412. #define CPU_AVR_ATMEGA168 0
  413. #endif
  414. #if defined(__AVR_ATmega328P__)
  415. #define CPU_AVR_ATMEGA328P 1
  416. #define CPU_NAME "ATmega328P"
  417. #else
  418. #define CPU_AVR_ATMEGA328P 0
  419. #endif
  420. #if defined(__AVR_ATmega1281__)
  421. #define CPU_AVR_ATMEGA1281 1
  422. #define CPU_NAME "ATmega1281"
  423. #else
  424. #define CPU_AVR_ATMEGA1281 0
  425. #endif
  426. #if defined(__AVR_ATmega1280__)
  427. #define CPU_AVR_ATMEGA1280 1
  428. #define CPU_NAME "ATmega1280"
  429. #else
  430. #define CPU_AVR_ATMEGA1280 0
  431. #endif
  432. #if defined(__AVR_ATmega2560__)
  433. #define CPU_AVR_ATMEGA2560 1
  434. #define CPU_NAME "ATmega2560"
  435. #else
  436. #define CPU_AVR_ATMEGA2560 0
  437. #endif
  438. #if CPU_AVR_ATMEGA32 + CPU_AVR_ATMEGA64 + CPU_AVR_ATMEGA103 + CPU_AVR_ATMEGA128 \
  439. + CPU_AVR_ATMEGA8 + CPU_AVR_ATMEGA168 + CPU_AVR_ATMEGA328P + CPU_AVR_ATMEGA1281 \
  440. + CPU_AVR_ATMEGA1280 + CPU_AVR_ATMEGA2560 != 1
  441. #error AVR CPU configuration error
  442. #endif
  443. #else
  444. #define CPU_AVR 0
  445. #define CPU_AVR_ATMEGA8 0
  446. #define CPU_AVR_ATMEGA168 0
  447. #define CPU_AVR_ATMEGA328P 0
  448. #define CPU_AVR_ATMEGA32 0
  449. #define CPU_AVR_ATMEGA64 0
  450. #define CPU_AVR_ATMEGA103 0
  451. #define CPU_AVR_ATMEGA128 0
  452. #define CPU_AVR_ATMEGA1281 0
  453. #define CPU_AVR_ATMEGA1280 0
  454. #define CPU_AVR_ATMEGA2560 0
  455. #endif
  456. #if defined (__MSP430__)
  457. #define CPU_MSP430 1
  458. #define CPU_ID msp430
  459. #define CPU_CORE_NAME "MSP430"
  460. #if defined(__MSP430F2274__)
  461. #define CPU_MSP430F2274 1
  462. #define CPU_NAME "MSP430F2274"
  463. #else
  464. #define CPU_MSP430F2274 0
  465. #endif
  466. #if defined(__MSP430G2231__)
  467. #define CPU_MSP430G2231 1
  468. #define CPU_NAME "MSP430G2231"
  469. #else
  470. #define CPU_MSP430G2231 0
  471. #endif
  472. #if CPU_MSP430F2274 + CPU_MSP430G2231 != 1
  473. #error MSP430 CPU configuration error
  474. #endif
  475. #else
  476. #define CPU_MSP430 0
  477. #define CPU_MSP430F2274 0
  478. #define CPU_MSP430G2231 0
  479. #endif
  480. /* Self-check for the detection: only one CPU must be detected */
  481. #if CPU_ARM + CPU_CM3 + CPU_I196 + CPU_X86 + CPU_PPC + CPU_DSP56K + CPU_AVR + CPU_MSP430 == 0
  482. #error Unknown CPU
  483. #elif !defined(CPU_ID)
  484. #error CPU_ID not defined
  485. #elif CPU_ARM + CPU_CM3 + CPU_I196 + CPU_X86 + CPU_PPC + CPU_DSP56K + CPU_AVR + CPU_MSP430 != 1
  486. #error Internal CPU configuration error
  487. #endif
  488. #endif /* CPU_DETECT_H */