detect.h

Go to the documentation of this file.
00001 
00036 #ifndef CPU_DETECT_H
00037 #define CPU_DETECT_H
00038 
00039 #if defined(__ARM_ARCH_4T__) /* GCC */ \
00040     || (defined(__ICCARM__) && (__CORE__== __ARM4TM__)) /* IAR: defined for all cores == 4tm */
00041     #define CPU_ARM 1
00042     #define CPU_ID  arm
00043     #define CPU_CORE_NAME        "ARM7TDMI"
00044 
00045     // AT91SAM7S products serie
00046     #if defined(__ARM_AT91SAM7S32__)
00047         #define CPU_ARM_AT91         1
00048         #define CPU_ARM_AT91SAM7S32  1
00049         #define CPU_NAME             "AT91SAM7S32"
00050     #else
00051         #define CPU_ARM_AT91SAM7S32  0
00052     #endif
00053 
00054     #if defined(__ARM_AT91SAM7S64__)
00055         #define CPU_ARM_AT91         1
00056         #define CPU_ARM_SAM7S_LARGE  1
00057         #define CPU_ARM_AT91SAM7S64  1
00058         #define CPU_NAME             "AT91SAM7S64"
00059     #else
00060         #define CPU_ARM_AT91SAM7S64  0
00061     #endif
00062 
00063     #if defined(__ARM_AT91SAM7S128__)
00064         #define CPU_ARM_AT91         1
00065         #define CPU_ARM_SAM7S_LARGE  1
00066         #define CPU_ARM_AT91SAM7S128 1
00067         #define CPU_NAME             "AT91SAM7S128"
00068     #else
00069         #define CPU_ARM_AT91SAM7S128 0
00070     #endif
00071 
00072     #if defined(__ARM_AT91SAM7S256__)
00073         #define CPU_ARM_AT91         1
00074         #define CPU_ARM_SAM7S_LARGE  1
00075         #define CPU_ARM_AT91SAM7S256 1
00076         #define CPU_NAME             "AT91SAM7S256"
00077     #else
00078         #define CPU_ARM_AT91SAM7S256 0
00079     #endif
00080 
00081     #if defined(__ARM_AT91SAM7S512__)
00082         #define CPU_ARM_AT91         1
00083         #define CPU_ARM_SAM7S_LARGE  1
00084         #define CPU_ARM_AT91SAM7S512 1
00085         #define CPU_NAME             "AT91SAM7S512"
00086     #else
00087         #define CPU_ARM_AT91SAM7S512 0
00088     #endif
00089 
00090     // AT91SAM7X products serie
00091     #if defined(__ARM_AT91SAM7X128__)
00092         #define CPU_ARM_AT91         1
00093         #define CPU_ARM_SAM7X        1
00094         #define CPU_ARM_AT91SAM7X128 1
00095         #define CPU_NAME             "AT91SAM7X128"
00096     #else
00097         #define CPU_ARM_AT91SAM7X128 0
00098     #endif
00099 
00100     #if defined(__ARM_AT91SAM7X256__)
00101         #define CPU_ARM_AT91         1
00102         #define CPU_ARM_SAM7X        1
00103         #define CPU_ARM_AT91SAM7X256 1
00104         #define CPU_NAME             "AT91SAM7X256"
00105     #else
00106         #define CPU_ARM_AT91SAM7X256 0
00107     #endif
00108 
00109 
00110     #if defined(__ARM_AT91SAM7X512__)
00111         #define CPU_ARM_AT91         1
00112         #define CPU_ARM_SAM7X        1
00113         #define CPU_ARM_AT91SAM7X512 1
00114         #define CPU_NAME             "AT91SAM7X512"
00115     #else
00116         #define CPU_ARM_AT91SAM7X512 0
00117     #endif
00118 
00119     #if defined(__ARM_LPC2378__)
00120         #define CPU_ARM_LPC2        1
00121         #define CPU_ARM_LPC2378     1
00122         #define CPU_NAME             "LPC2378"
00123     #else
00124         #define CPU_ARM_LPC2378     0
00125     #endif
00126 
00127     #if !defined(CPU_ARM_SAM7S_LARGE)
00128         #define CPU_ARM_SAM7S_LARGE 0
00129     #endif
00130 
00131     #if !defined(CPU_ARM_SAM7X)
00132         #define CPU_ARM_SAM7X 0
00133     #endif
00134 
00135 
00136     #if defined(CPU_ARM_AT91)
00137         #if CPU_ARM_AT91SAM7S32 + CPU_ARM_AT91SAM7S64 \
00138         + CPU_ARM_AT91SAM7S128 + CPU_ARM_AT91SAM7S256 \
00139         + CPU_ARM_AT91SAM7S512 \
00140         + CPU_ARM_AT91SAM7X128 + CPU_ARM_AT91SAM7X256 \
00141         + CPU_ARM_AT91SAM7X512 != 1
00142             #error ARM CPU configuration error
00143         #endif
00144         #define CPU_ARM_LPC2        0
00145 
00146     #elif defined (CPU_ARM_LPC2)
00147 
00148         #if CPU_ARM_LPC2378 + 0 != 1
00149             #error NXP LPC2xxx ARM CPU configuration error
00150         #endif
00151         #define CPU_ARM_AT91        0
00152     /* #elif Add other ARM families here */
00153     #else
00154         #define CPU_ARM_AT91        0
00155         #define CPU_ARM_LPC2        0
00156     #endif
00157 
00158 
00159     #if CPU_ARM_AT91 + CPU_ARM_LPC2 + 0 /* Add other ARM families here */ != 1
00160         #error ARM CPU configuration error
00161     #endif
00162 #else
00163     #define CPU_ARM                 0
00164 
00165     /* ARM Families */
00166     #define CPU_ARM_AT91            0
00167     #define CPU_ARM_LPC2            0
00168 
00169     /* SAM7 sub-families */
00170     #define CPU_ARM_SAM7S_LARGE     0
00171     #define CPU_ARM_SAM7X           0
00172 
00173     /* ARM CPUs */
00174     #define CPU_ARM_AT91SAM7S32     0
00175     #define CPU_ARM_AT91SAM7S64     0
00176     #define CPU_ARM_AT91SAM7S128    0
00177     #define CPU_ARM_AT91SAM7S256    0
00178     #define CPU_ARM_AT91SAM7S512    0
00179     #define CPU_ARM_AT91SAM7X128    0
00180     #define CPU_ARM_AT91SAM7X256    0
00181     #define CPU_ARM_AT91SAM7X512    0
00182 
00183     #define CPU_ARM_LPC2378         0
00184 #endif
00185 
00186 #if defined(__ARM_ARCH_7M__) /* GCC */ \
00187     || (defined(__ICCARM__) && (__CORE__== __ARM7M__)) /* IAR: defined for all cores v7M */
00188     /* Cortex-M3 */
00189     #define CPU_CM3 1
00190     #define CPU_ID  cm3
00191     #define CPU_CORE_NAME "Cortex-M3"
00192 
00193     #if defined (__ARM_LM3S1968__)
00194         #define CPU_CM3_LM3S        1
00195         #define CPU_CM3_LM3S1968    1
00196         #define CPU_NAME            "LM3S1968"
00197     #else
00198         #define CPU_CM3_LM3S1968    0
00199     #endif
00200 
00201     #if defined (__ARM_LM3S8962__)
00202         #define CPU_CM3_LM3S        1
00203         #define CPU_CM3_LM3S8962    1
00204         #define CPU_NAME            "LM3S8962"
00205     #else
00206         #define CPU_CM3_LM3S8962    0
00207     #endif
00208 
00209     #if defined (__ARM_STM32F100RB__)
00210         #define CPU_CM3_STM32       1
00211         #define CPU_CM3_STM32F100RB 1
00212         #define CPU_NAME            "STM32F100RB"
00213     #else
00214         #define CPU_CM3_STM32F100RB 0
00215     #endif
00216 
00217     #if defined (__ARM_STM32F101C4__)
00218         #define CPU_CM3_STM32       1
00219         #define CPU_CM3_STM32F101C4 1
00220         #define CPU_NAME            "STM32F101C4"
00221     #else
00222         #define CPU_CM3_STM32F101C4 0
00223     #endif
00224 
00225     #if defined (__ARM_STM32F103RB__)
00226         #define CPU_CM3_STM32       1
00227         #define CPU_CM3_STM32F103RB 1
00228         #define CPU_NAME            "STM32F103RB"
00229     #else
00230         #define CPU_CM3_STM32F103RB 0
00231     #endif
00232 
00233     #if defined (__ARM_STM32F103RE__)
00234         #define CPU_CM3_STM32       1
00235         #define CPU_CM3_STM32F103RE 1
00236         #define CPU_NAME            "STM32F103RE"
00237     #else
00238         #define CPU_CM3_STM32F103RE 0
00239     #endif
00240 
00241     // AT91SAM3N products serie
00242     #if defined (__ARM_SAM3N4__)
00243         #define CPU_CM3_SAM3    1
00244         #define CPU_CM3_SAM3N   1
00245         #define CPU_CM3_SAM3N4  1
00246         #define CPU_NAME        "SAM3N4"
00247 
00248         #define CPU_CM3_SAM3S   0
00249         #define CPU_CM3_SAM3U   0
00250         #define CPU_CM3_SAM3N2  0
00251         #define CPU_CM3_SAM3N1  0
00252         #define CPU_CM3_SAM3X   0
00253     #else
00254         #define CPU_CM3_SAM3N4  0
00255     #endif
00256 
00257     // AT91SAM3S products serie
00258     #if defined (__ARM_SAM3S4__)
00259         #define CPU_CM3_SAM3    1
00260         #define CPU_CM3_SAM3S   1
00261         #define CPU_CM3_SAM3S4  1
00262         #define CPU_NAME        "SAM3S4"
00263 
00264         #define CPU_CM3_SAM3N   0
00265         #define CPU_CM3_SAM3U   0
00266         #define CPU_CM3_SAM3X   0
00267     #else
00268         #define CPU_CM3_SAM3S4  0
00269     #endif
00270 
00271     // AT91SAM3U products serie
00272     #if defined (__ARM_SAM3U4__)
00273         #define CPU_CM3_SAM3    1
00274         #define CPU_CM3_SAM3U   1
00275         #define CPU_CM3_SAM3U4  1
00276         #define CPU_NAME        "SAM3U4"
00277 
00278         #define CPU_CM3_SAM3N   0
00279         #define CPU_CM3_SAM3S   0
00280         #define CPU_CM3_SAM3X   0
00281     #else
00282         #define CPU_CM3_SAM3U4  0
00283     #endif
00284 
00285     // AT91SAM3X products serie
00286     #if defined (__ARM_SAM3X8__)
00287         #define CPU_CM3_SAM3    1
00288         #define CPU_CM3_SAM3X   1
00289         #define CPU_CM3_SAM3X8  1
00290         #define CPU_NAME        "SAM3X8"
00291 
00292         #define CPU_CM3_SAM3N   0
00293         #define CPU_CM3_SAM3S   0
00294         #define CPU_CM3_SAM3U   0
00295     #else
00296         #define CPU_CM3_SAM3X8  0
00297     #endif
00298 
00299     #if defined (CPU_CM3_LM3S)
00300         #if CPU_CM3_LM3S1968 + CPU_CM3_LM3S8962 + 0 != 1
00301             #error Luminary Cortex-M3 CPU configuration error
00302         #endif
00303         #define CPU_CM3_STM32       0
00304         #define CPU_CM3_SAM3        0
00305     #elif defined (CPU_CM3_STM32)
00306         #if CPU_CM3_STM32F100RB + CPU_CM3_STM32F101C4 + CPU_CM3_STM32F103RB + CPU_CM3_STM32F103RE + 0 != 1
00307             #error STM32 Cortex-M3 CPU configuration error
00308         #endif
00309         #define CPU_CM3_LM3S        0
00310         #define CPU_CM3_SAM3        0
00311     #elif defined (CPU_CM3_SAM3)
00312         #if CPU_CM3_SAM3N + CPU_CM3_SAM3U + CPU_CM3_SAM3S + CPU_CM3_SAM3X + 0 != 1
00313             #error SAM3 Cortex-M3 CPU configuration error
00314         #endif
00315         #if CPU_CM3_SAM3N4 + CPU_CM3_SAM3S4 + CPU_CM3_SAM3U4 + CPU_CM3_SAM3X8 + 0 != 1
00316             #error SAM3 Cortex-M3 CPU configuration error
00317         #endif
00318         #define CPU_CM3_LM3S        0
00319         #define CPU_CM3_STM32       0
00320     /* #elif Add other Cortex-M3 families here */
00321     #else
00322         #define CPU_CM3_LM3S        0
00323         #define CPU_CM3_STM32       0
00324         #define CPU_CM3_SAM3        0
00325     #endif
00326 
00327 
00328     #if CPU_CM3_LM3S + CPU_CM3_STM32 + CPU_CM3_SAM3 + 0 /* Add other Cortex-M3 families here */ != 1
00329         #error Cortex-M3 CPU configuration error
00330     #endif
00331 
00332 #else
00333     #define CPU_CM3 0
00334     #define CPU_CM3_LM3S 0
00335     #define CPU_CM3_LM3S1968 0
00336     #define CPU_CM3_LM3S8962 0
00337 
00338     #define CPU_CM3_STM32 0
00339     #define CPU_CM3_STM32F100RB 0
00340     #define CPU_CM3_STM32F103RB 0
00341     #define CPU_CM3_STM32F101C4 0
00342     #define CPU_CM3_STM32F103RE 0
00343 
00344     #define CPU_CM3_SAM3 0
00345     #define CPU_CM3_SAM3N 0
00346     #define CPU_CM3_SAM3N4 0
00347     #define CPU_CM3_SAM3X 0
00348     #define CPU_CM3_SAM3X8 0
00349 #endif
00350 
00351 #if (defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)) \
00352     && !defined(__ICCARM__) /* IAR: if not ARM assume I196 */
00353     #warning Assuming CPU is I196
00354     #define CPU_I196        1
00355     #define CPU_ID                  i196
00356 #else
00357     #define CPU_I196                0
00358 #endif
00359 
00360 #if defined(__i386__) /* GCC */ \
00361     || (defined(_M_IX86) && !defined(_WIN64)) /* MSVC */
00362     #define CPU_X86                 1
00363     #define CPU_X86_32              1
00364     #define CPU_X86_64              0
00365     #define CPU_ID                  x86
00366     #define CPU_CORE_NAME           "x86"
00367     #define CPU_NAME                "generic"
00368 #elif defined(__x86_64__) /* GCC */ \
00369     || (defined(_M_IX86) && defined(_WIN64)) /* MSVC */
00370     #define CPU_X86                 1
00371     #define CPU_X86_32              0
00372     #define CPU_X86_64              1
00373     #define CPU_ID                  x86
00374     #define CPU_CORE_NAME           "x86_64"
00375     #define CPU_NAME                "generic"
00376 #else
00377     #define CPU_X86                 0
00378     #define CPU_I386                0
00379     #define CPU_X86_64              0
00380 #endif
00381 
00382 #if defined (_ARCH_PPC) || defined(_ARCH_PPC64)
00383     #define CPU_PPC                 1
00384     #define CPU_ID                  ppc
00385     #if defined(_ARCH_PPC)
00386         #define CPU_PPC32       1
00387     #else
00388             #define CPU_PPC32       0
00389     #endif
00390     #if defined(_ARCH_PPC64)
00391         #define CPU_PPC64       1
00392     #else
00393             #define CPU_PPC64       0
00394     #endif
00395 #else
00396     #define CPU_PPC                 0
00397     #define CPU_PPC32               0
00398     #define CPU_PPC64               0
00399 #endif
00400 
00401 #if defined(__m56800E__) || defined(__m56800__)
00402     #define CPU_DSP56K              1
00403     #define CPU_ID                  dsp56k
00404 #else
00405     #define CPU_DSP56K              0
00406 #endif
00407 
00408 #if defined (__AVR__)
00409     #define CPU_AVR                 1
00410     #define CPU_ID                  avr
00411     #define CPU_CORE_NAME           "AVR"
00412 
00413     #if defined(__AVR_ATmega32__)
00414         #define CPU_AVR_MEGA        1
00415         #define CPU_AVR_ATMEGA32    1
00416         #define CPU_NAME            "ATmega32"
00417     #else
00418         #define CPU_AVR_ATMEGA32    0
00419     #endif
00420 
00421     #if defined(__AVR_ATmega64__)
00422         #define CPU_AVR_MEGA        1
00423         #define CPU_AVR_ATMEGA64    1
00424         #define CPU_NAME            "ATmega64"
00425     #else
00426         #define CPU_AVR_ATMEGA64    0
00427     #endif
00428 
00429     #if defined(__AVR_ATmega103__)
00430         #define CPU_AVR_MEGA        1
00431         #define CPU_AVR_ATMEGA103   1
00432         #define CPU_NAME            "ATmega103"
00433     #else
00434         #define CPU_AVR_ATMEGA103   0
00435     #endif
00436 
00437     #if defined(__AVR_ATmega128__)
00438         #define CPU_AVR_MEGA        1
00439         #define CPU_AVR_ATMEGA128   1
00440         #define CPU_NAME            "ATmega128"
00441     #else
00442         #define CPU_AVR_ATMEGA128   0
00443     #endif
00444 
00445     #if defined(__AVR_ATmega8__)
00446         #define CPU_AVR_MEGA        1
00447         #define CPU_AVR_ATMEGA8     1
00448         #define CPU_NAME            "ATmega8"
00449     #else
00450         #define CPU_AVR_ATMEGA8     0
00451     #endif
00452 
00453     #if defined(__AVR_ATmega168__)
00454         #define CPU_AVR_MEGA        1
00455         #define CPU_AVR_ATMEGA168   1
00456         #define CPU_NAME            "ATmega168"
00457     #else
00458         #define CPU_AVR_ATMEGA168   0
00459     #endif
00460 
00461     #if defined(__AVR_ATmega328P__)
00462         #define CPU_AVR_MEGA        1
00463         #define CPU_AVR_ATMEGA328P   1
00464         #define CPU_NAME            "ATmega328P"
00465     #else
00466         #define CPU_AVR_ATMEGA328P   0
00467     #endif
00468 
00469     #if defined(__AVR_ATmega1281__)
00470         #define CPU_AVR_MEGA        1
00471         #define CPU_AVR_ATMEGA1281  1
00472         #define CPU_NAME            "ATmega1281"
00473     #else
00474         #define CPU_AVR_ATMEGA1281  0
00475     #endif
00476 
00477     #if defined(__AVR_ATmega1280__)
00478         #define CPU_AVR_MEGA        1
00479         #define CPU_AVR_ATMEGA1280  1
00480         #define CPU_NAME            "ATmega1280"
00481     #else
00482         #define CPU_AVR_ATMEGA1280  0
00483     #endif
00484 
00485     #if defined(__AVR_ATmega2560__)
00486         #define CPU_AVR_MEGA        1
00487         #define CPU_AVR_ATMEGA2560  1
00488         #define CPU_NAME            "ATmega2560"
00489     #else
00490         #define CPU_AVR_ATMEGA2560  0
00491     #endif
00492 
00493     #if defined(__AVR_ATxmega32D4__)
00494         #define CPU_AVR_XMEGA       1
00495         #define CPU_AVR_XMEGA_D     1
00496         #define CPU_AVR_ATXMEGA32D4 1
00497         #define CPU_NAME            "ATxmega32d4"
00498     #else
00499         #define CPU_AVR_ATXMEGA32D4 0
00500     #endif
00501 
00502     #if CPU_AVR_ATMEGA32 + CPU_AVR_ATMEGA64 + CPU_AVR_ATMEGA103 + CPU_AVR_ATMEGA128 \
00503       + CPU_AVR_ATMEGA8 + CPU_AVR_ATMEGA168 + CPU_AVR_ATMEGA328P + CPU_AVR_ATMEGA1281 \
00504       + CPU_AVR_ATMEGA1280 + CPU_AVR_ATMEGA2560 + CPU_AVR_ATXMEGA32D4 != 1
00505         #error AVR CPU configuration error
00506     #endif
00507 
00508     #if defined(CPU_AVR_XMEGA) && defined(CPU_AVR_MEGA)
00509         #error CPU cannot be MEGA and XMEGA
00510     #elif defined(CPU_AVR_MEGA)
00511         #define CPU_AVR_XMEGA       0
00512         #define CPU_AVR_XMEGA_D     0
00513     #elif defined(CPU_AVR_XMEGA)
00514         #define CPU_AVR_MEGA        0
00515     #endif
00516 
00517     #if CPU_AVR_MEGA + CPU_AVR_XMEGA != 1
00518         #error AVR CPU configuration error
00519     #endif
00520 
00521 #else
00522     #define CPU_AVR                 0
00523     #define CPU_AVR_MEGA            0
00524     #define CPU_AVR_ATMEGA8         0
00525     #define CPU_AVR_ATMEGA168       0
00526     #define CPU_AVR_ATMEGA328P      0
00527     #define CPU_AVR_ATMEGA32        0
00528     #define CPU_AVR_ATMEGA64        0
00529     #define CPU_AVR_ATMEGA103       0
00530     #define CPU_AVR_ATMEGA128       0
00531     #define CPU_AVR_ATMEGA1281      0
00532     #define CPU_AVR_ATMEGA1280      0
00533     #define CPU_AVR_ATMEGA2560      0
00534     #define CPU_AVR_XMEGA           0
00535     #define CPU_AVR_XMEGA_D         0
00536 #endif
00537 
00538 #if defined (__MSP430__)
00539     #define CPU_MSP430              1
00540     #define CPU_ID                  msp430
00541     #define CPU_CORE_NAME           "MSP430"
00542 
00543     #if defined(__MSP430F2274__)
00544         #define CPU_MSP430F2274     1
00545         #define CPU_NAME            "MSP430F2274"
00546     #else
00547         #define CPU_MSP430F2274     0
00548     #endif
00549 
00550     #if defined(__MSP430G2231__)
00551         #define CPU_MSP430G2231     1
00552         #define CPU_NAME            "MSP430G2231"
00553     #else
00554         #define CPU_MSP430G2231     0
00555     #endif
00556 
00557     #if CPU_MSP430F2274 + CPU_MSP430G2231 != 1
00558         #error MSP430 CPU configuration error
00559     #endif
00560 #else
00561     #define CPU_MSP430                  0
00562     #define CPU_MSP430F2274             0
00563     #define CPU_MSP430G2231             0
00564 #endif
00565 
00566 
00567 /* Self-check for the detection: only one CPU must be detected */
00568 #if CPU_ARM + CPU_CM3 + CPU_I196 + CPU_X86 + CPU_PPC + CPU_DSP56K + CPU_AVR + CPU_MSP430 == 0
00569     #error Unknown CPU
00570 #elif !defined(CPU_ID)
00571     #error CPU_ID not defined
00572 #elif CPU_ARM + CPU_CM3 + CPU_I196 + CPU_X86 + CPU_PPC + CPU_DSP56K + CPU_AVR + CPU_MSP430 != 1
00573     #error Internal CPU configuration error
00574 #endif
00575 
00576 
00577 #endif /* CPU_DETECT_H */