1    /*
     2     *  Copyright (c) 2011 by Texas Instruments and others.
     3     *  All rights reserved. This program and the accompanying materials
     4     *  are made available under the terms of the Eclipse Public License v1.0
     5     *  which accompanies this distribution, and is available at
     6     *  http://www.eclipse.org/legal/epl-v10.html
     7     *
     8     *  Contributors:
     9     *      Texas Instruments - initial implementation
    10     *
    11     * */
    12    
    13    /*
    14     *  ======== Boot.xdc ========
    15     *
    16     */
    17    
    18    package ti.catalog.arm.cortexm3.lm3init;
    19    
    20    import xdc.rov.ViewInfo;
    21    
    22    /*!
    23     *  ======== Boot ========
    24     *  Stellaris M3 Boot Support.
    25     *
    26     *  The Boot module supports boot initialization for the Stellaris M3 devices.
    27     *  A special boot init function is created based on the configuration
    28     *  settings for this module.  This function is hooked into the
    29     *  xdc.runtime.Reset.fxns[] array and called very early at boot time (prior
    30     *  to cinit processing).
    31     * 
    32     *  The code to support the boot module is placed in a separate section
    33     *  named `".text:.bootCodeSection"` to allow placement of this section in
    34     *  the linker .cmd file if necessary. This section is a subsection of the
    35     *  `".text"` section so this code will be placed into the .text section unless
    36     *  explicitly placed, either through
    37     *  `{@link xdc.cfg.Program#sectMap Program.sectMap}` or through a linker
    38     *  command file.
    39     */
    40    @Template("./Boot.xdt")
    41    @NoRuntime
    42    module Boot
    43    {
    44        metaonly struct ModuleView {
    45            Bool    configureClock;
    46            Bool    sysClockDivEnable;
    47            String  sysClockDiv;
    48            Bool    pwmClockDivEnable;
    49            String  pwmClockDiv;
    50            String  xtal;
    51            String  oscSrc;
    52            Bool    pllBypass;
    53            Bool    pllOutEnable;
    54            Bool    ioscDisable;
    55            Bool    moscDisable;
    56            Bool    configureLdo;
    57            String  ldoOut;
    58        }
    59    
    60        @Facet
    61        metaonly config ViewInfo.Instance rovViewInfo = 
    62            ViewInfo.create({
    63                viewMap: [
    64                [
    65                    'Module',
    66                    {
    67                        type: ViewInfo.MODULE,
    68                        viewInitFxn: 'viewInitModule',
    69                        structName: 'ModuleView'
    70                    }
    71                ],
    72                ]
    73            });
    74        
    75    
    76        enum SysDiv {
    77            SYSDIV_1     = 0x07800000,  /*! CPU clock is osc/pll / 1 */
    78            SYSDIV_2     = 0x00C00000,  /*! CPU clock is osc/pll / 2 */
    79            SYSDIV_3     = 0x01400000,  /*! CPU clock is osc/pll / 3 */
    80            SYSDIV_4     = 0x01C00000,  /*! CPU clock is osc/pll / 4 */
    81            SYSDIV_5     = 0x02400000,  /*! CPU clock is osc/pll / 5 */
    82            SYSDIV_6     = 0x02C00000,  /*! CPU clock is osc/pll / 6 */
    83            SYSDIV_7     = 0x03400000,  /*! CPU clock is osc/pll / 7 */
    84            SYSDIV_8     = 0x03C00000,  /*! CPU clock is osc/pll / 8 */
    85            SYSDIV_9     = 0x04400000,  /*! CPU clock is osc/pll / 9 */
    86            SYSDIV_10    = 0x04C00000,  /*! CPU clock is osc/pll / 10 */
    87            SYSDIV_11    = 0x05400000,  /*! CPU clock is osc/pll / 11 */
    88            SYSDIV_12    = 0x05C00000,  /*! CPU clock is osc/pll / 12 */
    89            SYSDIV_13    = 0x06400000,  /*! CPU clock is osc/pll / 13 */
    90            SYSDIV_14    = 0x06C00000,  /*! CPU clock is osc/pll / 14 */
    91            SYSDIV_15    = 0x07400000,  /*! CPU clock is osc/pll / 15 */
    92            SYSDIV_16    = 0x07C00000,  /*! CPU clock is osc/pll / 16 */
    93            SYSDIV_17    = 0x88400000,  /*! CPU clock is osc/pll / 17 */
    94            SYSDIV_18    = 0x88C00000,  /*! CPU clock is osc/pll / 18 */
    95            SYSDIV_19    = 0x89400000,  /*! CPU clock is osc/pll / 19 */
    96            SYSDIV_20    = 0x89C00000,  /*! CPU clock is osc/pll / 20 */
    97            SYSDIV_21    = 0x8A400000,  /*! CPU clock is osc/pll / 21 */
    98            SYSDIV_22    = 0x8AC00000,  /*! CPU clock is osc/pll / 22 */
    99            SYSDIV_23    = 0x8B400000,  /*! CPU clock is osc/pll / 23 */
   100            SYSDIV_24    = 0x8BC00000,  /*! CPU clock is osc/pll / 24 */
   101            SYSDIV_25    = 0x8C400000,  /*! CPU clock is osc/pll / 25 */
   102            SYSDIV_26    = 0x8CC00000,  /*! CPU clock is osc/pll / 26 */
   103            SYSDIV_27    = 0x8D400000,  /*! CPU clock is osc/pll / 27 */
   104            SYSDIV_28    = 0x8DC00000,  /*! CPU clock is osc/pll / 28 */
   105            SYSDIV_29    = 0x8E400000,  /*! CPU clock is osc/pll / 29 */
   106            SYSDIV_30    = 0x8EC00000,  /*! CPU clock is osc/pll / 30 */
   107            SYSDIV_31    = 0x8F400000,  /*! CPU clock is osc/pll / 31 */
   108            SYSDIV_32    = 0x8FC00000,  /*! CPU clock is osc/pll / 32 */
   109            SYSDIV_33    = 0x90400000,  /*! CPU clock is osc/pll / 33 */
   110            SYSDIV_34    = 0x90C00000,  /*! CPU clock is osc/pll / 34 */
   111            SYSDIV_35    = 0x91400000,  /*! CPU clock is osc/pll / 35 */
   112            SYSDIV_36    = 0x91C00000,  /*! CPU clock is osc/pll / 36 */
   113            SYSDIV_37    = 0x92400000,  /*! CPU clock is osc/pll / 37 */
   114            SYSDIV_38    = 0x92C00000,  /*! CPU clock is osc/pll / 38 */
   115            SYSDIV_39    = 0x93400000,  /*! CPU clock is osc/pll / 39 */
   116            SYSDIV_40    = 0x93C00000,  /*! CPU clock is osc/pll / 40 */
   117            SYSDIV_41    = 0x94400000,  /*! CPU clock is osc/pll / 41 */
   118            SYSDIV_42    = 0x94C00000,  /*! CPU clock is osc/pll / 42 */
   119            SYSDIV_43    = 0x95400000,  /*! CPU clock is osc/pll / 43 */
   120            SYSDIV_44    = 0x95C00000,  /*! CPU clock is osc/pll / 44 */
   121            SYSDIV_45    = 0x96400000,  /*! CPU clock is osc/pll / 45 */
   122            SYSDIV_46    = 0x96C00000,  /*! CPU clock is osc/pll / 46 */
   123            SYSDIV_47    = 0x97400000,  /*! CPU clock is osc/pll / 47 */
   124            SYSDIV_48    = 0x97C00000,  /*! CPU clock is osc/pll / 48 */
   125            SYSDIV_49    = 0x98400000,  /*! CPU clock is osc/pll / 49 */
   126            SYSDIV_50    = 0x98C00000,  /*! CPU clock is osc/pll / 50 */
   127            SYSDIV_51    = 0x99400000,  /*! CPU clock is osc/pll / 51 */
   128            SYSDIV_52    = 0x99C00000,  /*! CPU clock is osc/pll / 52 */
   129            SYSDIV_53    = 0x9A400000,  /*! CPU clock is osc/pll / 53 */
   130            SYSDIV_54    = 0x9AC00000,  /*! CPU clock is osc/pll / 54 */
   131            SYSDIV_55    = 0x9B400000,  /*! CPU clock is osc/pll / 55 */
   132            SYSDIV_56    = 0x9BC00000,  /*! CPU clock is osc/pll / 56 */
   133            SYSDIV_57    = 0x9C400000,  /*! CPU clock is osc/pll / 57 */
   134            SYSDIV_58    = 0x9CC00000,  /*! CPU clock is osc/pll / 58 */
   135            SYSDIV_59    = 0x9D400000,  /*! CPU clock is osc/pll / 59 */
   136            SYSDIV_60    = 0x9DC00000,  /*! CPU clock is osc/pll / 60 */
   137            SYSDIV_61    = 0x9E400000,  /*! CPU clock is osc/pll / 61 */
   138            SYSDIV_62    = 0x9EC00000,  /*! CPU clock is osc/pll / 62 */
   139            SYSDIV_63    = 0x9F400000,  /*! CPU clock is osc/pll / 63 */
   140            SYSDIV_64    = 0x9FC00000,  /*! CPU clock is osc/pll / 64 */
   141            SYSDIV_2_5   = 0xC1000000,  /*! CPU clock is osc/pll / 2.5 */
   142            SYSDIV_3_5   = 0xC1800000,  /*! CPU clock is osc/pll / 3.5 */
   143            SYSDIV_4_5   = 0xC2000000,  /*! CPU clock is osc/pll / 4.5 */
   144            SYSDIV_5_5   = 0xC2800000,  /*! CPU clock is osc/pll / 5.5 */
   145            SYSDIV_6_5   = 0xC3000000,  /*! CPU clock is osc/pll / 6.5 */
   146            SYSDIV_7_5   = 0xC3800000,  /*! CPU clock is osc/pll / 7.5 */
   147            SYSDIV_8_5   = 0xC4000000,  /*! CPU clock is osc/pll / 8.5 */
   148            SYSDIV_9_5   = 0xC4800000,  /*! CPU clock is osc/pll / 9.5 */
   149            SYSDIV_10_5  = 0xC5000000,  /*! CPU clock is osc/pll / 10.5 */
   150            SYSDIV_11_5  = 0xC5800000,  /*! CPU clock is osc/pll / 11.5 */
   151            SYSDIV_12_5  = 0xC6000000,  /*! CPU clock is osc/pll / 12.5 */
   152            SYSDIV_13_5  = 0xC6800000,  /*! CPU clock is osc/pll / 13.5 */
   153            SYSDIV_14_5  = 0xC7000000,  /*! CPU clock is osc/pll / 14.5 */
   154            SYSDIV_15_5  = 0xC7800000,  /*! CPU clock is osc/pll / 15.5 */
   155            SYSDIV_16_5  = 0xC8000000,  /*! CPU clock is osc/pll / 16.5 */
   156            SYSDIV_17_5  = 0xC8800000,  /*! CPU clock is osc/pll / 17.5 */
   157            SYSDIV_18_5  = 0xC9000000,  /*! CPU clock is osc/pll / 18.5 */
   158            SYSDIV_19_5  = 0xC9800000,  /*! CPU clock is osc/pll / 19.5 */
   159            SYSDIV_20_5  = 0xCA000000,  /*! CPU clock is osc/pll / 20.5 */
   160            SYSDIV_21_5  = 0xCA800000,  /*! CPU clock is osc/pll / 21.5 */
   161            SYSDIV_22_5  = 0xCB000000,  /*! CPU clock is osc/pll / 22.5 */
   162            SYSDIV_23_5  = 0xCB800000,  /*! CPU clock is osc/pll / 23.5 */
   163            SYSDIV_24_5  = 0xCC000000,  /*! CPU clock is osc/pll / 24.5 */
   164            SYSDIV_25_5  = 0xCC800000,  /*! CPU clock is osc/pll / 25.5 */
   165            SYSDIV_26_5  = 0xCD000000,  /*! CPU clock is osc/pll / 26.5 */
   166            SYSDIV_27_5  = 0xCD800000,  /*! CPU clock is osc/pll / 27.5 */
   167            SYSDIV_28_5  = 0xCE000000,  /*! CPU clock is osc/pll / 28.5 */
   168            SYSDIV_29_5  = 0xCE800000,  /*! CPU clock is osc/pll / 29.5 */
   169            SYSDIV_30_5  = 0xCF000000,  /*! CPU clock is osc/pll / 30.5 */
   170            SYSDIV_31_5  = 0xCF800000,  /*! CPU clock is osc/pll / 31.5 */
   171            SYSDIV_32_5  = 0xD0000000,  /*! CPU clock is osc/pll / 32.5 */
   172            SYSDIV_33_5  = 0xD0800000,  /*! CPU clock is osc/pll / 33.5 */
   173            SYSDIV_34_5  = 0xD1000000,  /*! CPU clock is osc/pll / 34.5 */
   174            SYSDIV_35_5  = 0xD1800000,  /*! CPU clock is osc/pll / 35.5 */
   175            SYSDIV_36_5  = 0xD2000000,  /*! CPU clock is osc/pll / 36.5 */
   176            SYSDIV_37_5  = 0xD2800000,  /*! CPU clock is osc/pll / 37.5 */
   177            SYSDIV_38_5  = 0xD3000000,  /*! CPU clock is osc/pll / 38.5 */
   178            SYSDIV_39_5  = 0xD3800000,  /*! CPU clock is osc/pll / 39.5 */
   179            SYSDIV_40_5  = 0xD4000000,  /*! CPU clock is osc/pll / 40.5 */
   180            SYSDIV_41_5  = 0xD4800000,  /*! CPU clock is osc/pll / 41.5 */
   181            SYSDIV_42_5  = 0xD5000000,  /*! CPU clock is osc/pll / 42.5 */
   182            SYSDIV_43_5  = 0xD5800000,  /*! CPU clock is osc/pll / 43.5 */
   183            SYSDIV_44_5  = 0xD6000000,  /*! CPU clock is osc/pll / 44.5 */
   184            SYSDIV_45_5  = 0xD6800000,  /*! CPU clock is osc/pll / 45.5 */
   185            SYSDIV_46_5  = 0xD7000000,  /*! CPU clock is osc/pll / 46.5 */
   186            SYSDIV_47_5  = 0xD7800000,  /*! CPU clock is osc/pll / 47.5 */
   187            SYSDIV_48_5  = 0xD8000000,  /*! CPU clock is osc/pll / 48.5 */
   188            SYSDIV_49_5  = 0xD8800000,  /*! CPU clock is osc/pll / 49.5 */
   189            SYSDIV_50_5  = 0xD9000000,  /*! CPU clock is osc/pll / 50.5 */
   190            SYSDIV_51_5  = 0xD9800000,  /*! CPU clock is osc/pll / 51.5 */
   191            SYSDIV_52_5  = 0xDA000000,  /*! CPU clock is osc/pll / 52.5 */
   192            SYSDIV_53_5  = 0xDA800000,  /*! CPU clock is osc/pll / 53.5 */
   193            SYSDIV_54_5  = 0xDB000000,  /*! CPU clock is osc/pll / 54.5 */
   194            SYSDIV_55_5  = 0xDB800000,  /*! CPU clock is osc/pll / 55.5 */
   195            SYSDIV_56_5  = 0xDC000000,  /*! CPU clock is osc/pll / 56.5 */
   196            SYSDIV_57_5  = 0xDC800000,  /*! CPU clock is osc/pll / 57.5 */
   197            SYSDIV_58_5  = 0xDD000000,  /*! CPU clock is osc/pll / 58.5 */
   198            SYSDIV_59_5  = 0xDD800000,  /*! CPU clock is osc/pll / 59.5 */
   199            SYSDIV_60_5  = 0xDE000000,  /*! CPU clock is osc/pll / 60.5 */
   200            SYSDIV_61_5  = 0xDE800000,  /*! CPU clock is osc/pll / 61.5 */
   201            SYSDIV_62_5  = 0xDF000000,  /*! CPU clock is osc/pll / 62.5 */
   202            SYSDIV_63_5  = 0xDF800000   /*! CPU clock is osc/pll / 63.5 */
   203        }
   204    
   205        enum PwmDiv {
   206            PWMDIV_1     = 0x00000000,  /*! PWM clock /1 */
   207            PWMDIV_2     = 0x00100000,  /*! PWM clock /2 */
   208            PWMDIV_4     = 0x00120000,  /*! PWM clock /4 */
   209            PWMDIV_8     = 0x00140000,  /*! PWM clock /8 */
   210            PWMDIV_16    = 0x00160000,  /*! PWM clock /16 */
   211            PWMDIV_32    = 0x00180000,  /*! PWM clock /32 */
   212            PWMDIV_64    = 0x001A0000   /*! PWM clock /64 */
   213        }
   214    
   215        enum XtalFreq {
   216            XTAL_1MHZ    = 0x00000000,  /*! Using a 1MHz crystal */
   217            XTAL_1_84MHZ = 0x00000040,  /*! Using a 1.8432MHz crystal */
   218            XTAL_2MHZ    = 0x00000080,  /*! Using a 2MHz crystal */
   219            XTAL_2_45MHZ = 0x000000C0,  /*! Using a 2.4576MHz crystal */
   220            XTAL_3_57MHZ = 0x00000100,  /*! Using a 3.579545MHz crystal */
   221            XTAL_3_68MHZ = 0x00000140,  /*! Using a 3.6864MHz crystal */
   222            XTAL_4MHZ    = 0x00000180,  /*! Using a 4MHz crystal */
   223            XTAL_4_09MHZ = 0x000001C0,  /*! Using a 4.096MHz crystal */
   224            XTAL_4_91MHZ = 0x00000200,  /*! Using a 4.9152MHz crystal */
   225            XTAL_5MHZ    = 0x00000240,  /*! Using a 5MHz crystal */
   226            XTAL_5_12MHZ = 0x00000280,  /*! Using a 5.12MHz crystal */
   227            XTAL_6MHZ    = 0x000002C0,  /*! Using a 6MHz crystal */
   228            XTAL_6_14MHZ = 0x00000300,  /*! Using a 6.144MHz crystal */
   229            XTAL_7_37MHZ = 0x00000340,  /*! Using a 7.3728MHz crystal */
   230            XTAL_8MHZ    = 0x00000380,  /*! Using a 8MHz crystal */
   231            XTAL_8_19MHZ = 0x000003C0,  /*! Using a 8.192MHz crystal */
   232            XTAL_10MHZ   = 0x00000400,  /*! 10.0 MHz (USB) */
   233            XTAL_12MHZ   = 0x00000440,  /*! 12.0 MHz (USB) */
   234            XTAL_12_2MHZ = 0x00000480,  /*! 12.288 MHz */
   235            XTAL_13_5MHZ = 0x000004C0,  /*! 13.56 MHz */
   236            XTAL_14_3MHZ = 0x00000500,  /*! 14.31818 MHz */
   237            XTAL_16MHZ   = 0x00000540,  /*! 16.0 MHz (USB) */
   238            XTAL_16_3MHZ = 0x00000580   /*! 16.384 MHz */
   239        }
   240    
   241        enum OscSrc {
   242            OSCSRC_MAIN  = 0x00000000,  /*! Use the main oscillator */
   243            OSCSRC_INT   = 0x00000010,  /*! Use the internal oscillator */
   244            OSCSRC_INT4  = 0x00000020,  /*! Use the internal oscillator / 4 */
   245            OSCSRC_30    = 0x00000030   /*! 30 KHz internal oscillator */
   246        }
   247    
   248        enum LdoOut {
   249            LDOPCTL_2_55V    = 0x0000001F,  /*! LDO output of 2.55V */
   250            LDOPCTL_2_60V    = 0x0000001E,  /*! LDO output of 2.60V */
   251            LDOPCTL_2_65V    = 0x0000001D,  /*! LDO output of 2.65V */
   252            LDOPCTL_2_70V    = 0x0000001C,  /*! LDO output of 2.70V */
   253            LDOPCTL_2_75V    = 0x0000001B,  /*! LDO output of 2.75V */
   254            LDOPCTL_2_25V    = 0x00000005,  /*! LDO output of 2.25V */
   255            LDOPCTL_2_30V    = 0x00000004,  /*! LDO output of 2.30V */
   256            LDOPCTL_2_35V    = 0x00000003,  /*! LDO output of 2.35V */
   257            LDOPCTL_2_40V    = 0x00000002,  /*! LDO output of 2.40V */
   258            LDOPCTL_2_45V    = 0x00000001,  /*! LDO output of 2.45V */
   259            LDOPCTL_2_50V    = 0x00000000   /*! LDO output of 2.50V */
   260        }
   261    
   262        /*! 
   263         *  Clock configuration flag, default is false.
   264         *
   265         *  Set to true to automatically configure the Clock.
   266         */
   267        config Bool configureClock = false;
   268    
   269        /*! SYS Clock Divisor */
   270        config SysDiv sysClockDiv = SYSDIV_1;
   271    
   272        /*! PWM Clock Divisor */
   273        config PwmDiv pwmClockDiv = PWMDIV_1;
   274    
   275        /*! Crystal Value */
   276        config XtalFreq xtal = XTAL_1MHZ;
   277    
   278        /*! Oscillator Source */
   279        config OscSrc oscSrc = OSCSRC_MAIN;
   280    
   281        /*! PLL Bypass flag */
   282        config Bool pllBypass = false;
   283    
   284        /*! PLL Output Enable flag */
   285        config Bool pllOutEnable = false;
   286    
   287        /*! Internal Oscillator Disable flag */
   288        config Bool ioscDisable = false;
   289    
   290        /*! Main Oscillator Disable flag */
   291        config Bool moscDisable = false;
   292    
   293        /*! 
   294         *  LDO configuration flag, default is false.
   295         *
   296         *  Set to true to automatically configure the LDO.
   297         */
   298        config Bool configureLdo = false;
   299    
   300        /*! 
   301         *  LDO VADJ setting, default is 2.5V
   302         */
   303        config LdoOut ldoOut = LDOPCTL_2_50V;
   304    
   305        /*! 
   306         *  @_nodoc
   307         *  computed RCC value based on settings
   308         */
   309        config UInt ulConfig;
   310        
   311        /*!
   312         *  @_nodoc
   313         *  ======== getFrequency ========
   314         *  Gets the resulting output frequency (in Hz) given the Clock 
   315         *  configuration parameters. 
   316         *
   317         *  Currently un-implemented.
   318         */
   319        UInt32 getFrequency();
   320        
   321        /*!
   322         *  @_nodoc    
   323         *  ======== registerFreqListener ========
   324         *  Register a module to be notified whenever the frequency changes.
   325         *
   326         *  The registered module must have a function named 'fireFrequencyUpdate'
   327         *  which takes the new frequency as an argument.
   328         */
   329        function registerFreqListener();
   330       
   331    internal:
   332    
   333        /*! 
   334         *  @_nodoc
   335         *  computed cpu frequency based on clock settings
   336         */
   337        config UInt cpuFreq;
   338    
   339    };
   340    /*
   341     *  @(#) ti.catalog.arm.cortexm3.lm3init; 1, 0, 0,128; 9-20-2011 21:29:31; /db/ztree/library/trees/platform/platform-m30x/src/
   342     */
   343