Obsolete unused backup project such as OK6410
guowenxue
2018-02-04 00cb813bffdc9876ae03ff0b967be3b1912f2454
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/********************************************************************************************
 *        File:  bootstrap.c
 *     Version:  1.0.0
 *   Copyright:  2013 (c) Guo Wenxue <guowenxue@gmail.com>
 * Description:  This C code is the first stage bootloader(named bootstrap) 
 *                main code, test on OK6410 board.
 *   ChangeLog:  1, Release initial version on "Mon Feb 25 23:02:41 CST 2013"
 *
 *******************************************************************************************/
 
#include "s3c6410.h"
#include "common.h"
  
inline void delay(unsigned long loops)
{
    __asm__ volatile ("1:\n" "subs %0, %1, #1\n" "bne 1b":"=r" (loops):"0"(loops));
}
 
 
/*  OK6410 LED1~LED4 use GPIO: GPM0~GPM3 */
static void led_init(void)
{
    unsigned int regv; 
    
    /* Set GPM0~GPM3 as GPIO output mode*/
    regv = s3c_readl(GPMCON);
    regv = (regv & ~0xffffU) | 0x1111U;
    s3c_writel(regv, GPMCON);
                    
    /* Disable GPM0~GPM3 pull-up/down */
    regv = s3c_readl(GPMPUD);
    regv  = (regv & ~0xffU) | 0x00U;
    s3c_writel(regv, GPMPUD);
 
 
    /* Set GPM0~GPM3 as high level to turn LED1~LED3 off */
    regv = s3c_readl(GPMDAT);
    regv  = (regv & ~0xffU) | 0xfU;
    s3c_writel(regv, GPMDAT);
}
 
static void led_display(unsigned int data)
{
    unsigned int regv;
 
 
    regv = s3c_readl(GPMDAT);
    regv = (regv & 0xf) & ((~data) & 0xf);
    s3c_writel(regv, GPMDAT);
}
  
static int ddr_test(void)
{
    int i;
    unsigned int val; 
    
    for (i=0; i<0x1000; i++)
    { 
        s3c_writel(0x55aaaa55, (MEMORY_BASE_ADDRESS + i*0x100));
        val = s3c_readl(MEMORY_BASE_ADDRESS + i*0x100);
        
        if (val != 0x55aaaa55)
            return -1; 
        
        s3c_writel(0xaa5555aa, (MEMORY_BASE_ADDRESS + i*0x100));
        val = s3c_readl(MEMORY_BASE_ADDRESS + i*0x100);
        if (val != 0xaa5555aa)
            return -1;
    } 
    
    return i;
}
 
int main()  
{  
    int        rv = 0;
    char *addr = (char *)MEMORY_BASE_ADDRESS;
 
    led_init();
    led_display(0x0f);
 
    serial_init(CONFIG_BAUDRATE);
    serial_puts("Bootstrap already running...\n");
 
    rv = ddr_test();
    if (rv < 0)
    {
        serial_puts("ddr test faild.\n");
    }   
    else
        serial_puts("1. ddr init/test successful.\n");
 
    serial_puts("Xmodem Receive now!\n");
    xmodem_recv(addr);
 
    return 0;  
}