Changeset 12338


Ignore:
Timestamp:
06/20/09 23:35:48 (4 years ago)
Author:
BrainSlayer
Message:

show cpu clock and use cpu clock to correctly initialize uart

Location:
ar5315_microredboot/microredboot/boot/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • ar5315_microredboot/microredboot/boot/src/lib/nvram.c

    r12337 r12338  
    4747                                dst[i] = src[i]; 
    4848                        return; 
     49                }else{ 
     50                        unsigned int *dst = (unsigned int*)nvram_buf; 
     51                        for (i = 0; i < NVRAM_SPACE / 4; i++) 
     52                                dst[i] = 0;              
    4953                } 
    5054        } 
     
    5963 
    6064        if (!nvram_buf[0]) 
    61                 nvram_init(); 
     65            return; 
    6266 
    6367        /* Look for name=value and return value */ 
  • ar5315_microredboot/microredboot/boot/src/lib/uncompress-ar5312.h

    r12328 r12338  
    9898} 
    9999 
    100 static int ar531x_cpu_frequency(void) 
     100static unsigned int cpu_frequency(void) 
    101101{ 
    102102        static const int CLOCKCTL1_PREDIVIDE_TABLE[4] = { 
     
    107107        }; 
    108108 
    109         int preDivideSelect; 
    110         int preDivisor; 
    111         int multiplier; 
    112         int doublerMask; 
     109        unsigned int preDivideSelect; 
     110        unsigned int preDivisor; 
     111        unsigned int multiplier; 
     112        unsigned int doublerMask; 
    113113 
    114114        unsigned int clockCtl1 = SYS_REG_READ(AR5312_CLOCKCTL1); 
     
    159159        { 
    160160                u32 divisor; 
    161                 u32 uart_clock_rate = ar531x_cpu_frequency() / 4; 
     161                u32 uart_clock_rate = cpu_frequency() / 4; 
    162162                u32 base_baud = uart_clock_rate / 16; 
    163163 
  • ar5315_microredboot/microredboot/boot/src/lib/uncompress-ar5315.h

    r12328 r12338  
    2222                                UART16550_PARITY_NONE | \ 
    2323                                UART16550_STOP_1BIT 
     24 
    2425 
    2526#define UART                    0xB1100003 
     
    5657#define UART16550_STOP_2BIT     0x4 
    5758 
    58 #define SYS_REG_READ(p)         (*((volatile unsigned long *) (p))) 
    59 #define SYS_REG_WRITE(p,v)      (*((volatile unsigned long *) (p)) = (v)) 
    6059#define UART16550_READ(p)       (*((volatile u8*)(UART + (p)))) 
    6160#define UART16550_WRITE(p,v)    ((*((volatile u8*)(UART + (p)))) = (v)) 
     61 
     62 
     63#define AR5315_DSLBASE          0xB1000000      /* RESET CONTROL MMR */ 
     64#define AR5315_PLLC_CTL         (AR5315_DSLBASE + 0x0064) 
     65#define AR5315_CPUCLK           (AR5315_DSLBASE + 0x006c) 
     66#define AR5315_RESET            (AR5315_DSLBASE + 0x0004) 
     67#define AR5315_RESET_UART0                 0x00000100      /* warm reset UART0 */ 
     68 
     69/* PLLc Control fields */ 
     70#define PLLC_REF_DIV_M              0x00000003 
     71#define PLLC_REF_DIV_S              0 
     72#define PLLC_FDBACK_DIV_M           0x0000007C 
     73#define PLLC_FDBACK_DIV_S           2 
     74#define PLLC_ADD_FDBACK_DIV_M       0x00000080 
     75#define PLLC_ADD_FDBACK_DIV_S       7 
     76#define PLLC_CLKC_DIV_M             0x0001c000 
     77#define PLLC_CLKC_DIV_S             14 
     78#define PLLC_CLKM_DIV_M             0x00700000 
     79#define PLLC_CLKM_DIV_S             20 
     80 
     81/* CPU CLK Control fields */ 
     82#define CPUCLK_CLK_SEL_M            0x00000003 
     83#define CPUCLK_CLK_SEL_S            0 
     84#define CPUCLK_CLK_DIV_M            0x0000000c 
     85#define CPUCLK_CLK_DIV_S            2 
     86 
    6287 
    6388static void putc(int c) 
     
    78103} 
    79104 
    80 #if defined(COBRA_EMUL) 
    81 #define AR2316_AMBA_CLOCK_RATE  20000000 
    82 #define AR2316_CPU_CLOCK_RATE   40000000 
    83 #else 
    84 #if defined(DEFAULT_PLL) 
    85 #define AR2316_AMBA_CLOCK_RATE  40000000 
    86 #define AR2316_CPU_CLOCK_RATE   40000000 
    87 #else 
    88 #define AR2316_AMBA_CLOCK_RATE  92000000 
    89 #define AR2316_CPU_CLOCK_RATE   184000000 
    90 #endif                          /* ! DEFAULT_PLL */ 
    91 #endif                          /* ! COBRA_EMUL */ 
     105 
     106 
     107static const int CLOCKCTL1_PREDIVIDE_TABLE[4] = { 
     108    1, 
     109    2, 
     110    4, 
     111    5 
     112}; 
     113 
     114static const int PLLC_DIVIDE_TABLE[5] = { 
     115    2, 
     116    3, 
     117    4, 
     118    6, 
     119    3 
     120}; 
     121#define sysRegRead(phys)        \ 
     122        (*(volatile unsigned int *)(KSEG1|phys)) 
     123 
     124#define sysRegWrite(phys, val)  \ 
     125        ((*(volatile unsigned int *)(KSEG1|phys)) = (val)) 
     126 
     127static unsigned int  
     128ar5315_sys_clk(unsigned int clockCtl) 
     129{ 
     130    unsigned int pllcCtrl,cpuDiv; 
     131    unsigned int pllcOut,refdiv,fdiv,divby2; 
     132        unsigned int clkDiv; 
     133 
     134    pllcCtrl = sysRegRead(AR5315_PLLC_CTL); 
     135    refdiv = (pllcCtrl & PLLC_REF_DIV_M) >> PLLC_REF_DIV_S; 
     136    refdiv = CLOCKCTL1_PREDIVIDE_TABLE[refdiv]; 
     137    fdiv = (pllcCtrl & PLLC_FDBACK_DIV_M) >> PLLC_FDBACK_DIV_S; 
     138    divby2 = (pllcCtrl & PLLC_ADD_FDBACK_DIV_M) >> PLLC_ADD_FDBACK_DIV_S; 
     139    divby2 += 1; 
     140    pllcOut = (40000000/refdiv)*(2*divby2)*fdiv; 
     141 
     142 
     143    /* clkm input selected */ 
     144        switch(clockCtl & CPUCLK_CLK_SEL_M) { 
     145                case 0: 
     146                case 1: 
     147                        clkDiv = PLLC_DIVIDE_TABLE[(pllcCtrl & PLLC_CLKM_DIV_M) >> PLLC_CLKM_DIV_S]; 
     148                        break; 
     149                case 2: 
     150                        clkDiv = PLLC_DIVIDE_TABLE[(pllcCtrl & PLLC_CLKC_DIV_M) >> PLLC_CLKC_DIV_S]; 
     151                        break; 
     152                default: 
     153                        pllcOut = 40000000; 
     154                        clkDiv = 1; 
     155                        break; 
     156        } 
     157        cpuDiv = (clockCtl & CPUCLK_CLK_DIV_M) >> CPUCLK_CLK_DIV_S;   
     158        cpuDiv = cpuDiv * 2 ?: 1; 
     159        return (pllcOut/(clkDiv * cpuDiv)); 
     160} 
     161                 
     162static unsigned int cpu_frequency(void) 
     163{ 
     164    return ar5315_sys_clk(sysRegRead(AR5315_CPUCLK)); 
     165} 
     166 
    92167 
    93168static inline void arch_decomp_setup(void) 
    94169{ 
    95170        /* Initialise the serial port here */ 
     171 
     172        sysRegWrite(AR5315_RESET,sysRegRead(AR5315_RESET) & ~(AR5315_RESET_UART0)); 
    96173 
    97174        /* disable interrupts */ 
     
    99176        UART16550_WRITE(OFS_INTR_ENABLE, 0); 
    100177 
     178        /* set up buad rate */ 
     179        { 
     180                u32 divisor; 
     181                u32 uart_clock_rate = cpu_frequency() / 4; 
     182                u32 base_baud = uart_clock_rate / 16; 
     183 
     184                /* set DIAB bit */ 
     185                UART16550_WRITE(OFS_LINE_CONTROL, 0x80); 
     186 
     187                /* set divisor */ 
     188                divisor = base_baud / CONFIG_DEFAULT_BAUDRATE; 
     189                UART16550_WRITE(OFS_DIVISOR_LSB, divisor & 0xff); 
     190                UART16550_WRITE(OFS_DIVISOR_MSB, (divisor & 0xff00) >> 8); 
     191 
     192                /* clear DIAB bit */ 
     193                UART16550_WRITE(OFS_LINE_CONTROL, 0x0); 
     194        } 
     195 
    101196        /* set data format */ 
    102197        UART16550_WRITE(OFS_DATA_FORMAT, DEFAULT_DATA_FORMAT); 
  • ar5315_microredboot/microredboot/boot/src/misc_lzma.c

    r12336 r12338  
    232232        arch_decomp_setup(); 
    233233        printf("MicroRedBoot v1.3, (c) 2009 DD-WRT.COM (%s)\n", __DATE__); 
     234        printf("CPU Clock: %d Mhz\n",cpu_frequency()/1000000); 
    234235        nvram_init(); 
    235236        char *ddboard = nvram_get("DD_BOARD"); 
  • ar5315_microredboot/microredboot/boot/src/ramconfig.h

    r12324 r12338  
    11#define RAM_SIZE 0x2000000 
    2 #define AR5312 1 
    32#define RESETBUTTON 0x06 
Note: See TracChangeset for help on using the changeset viewer.