Hardware Design: SIE
Sign in or create your account | Project List | Help
Hardware Design: SIE Git Source Tree
Root/
Source at commit 43de1a582cae639ee5d44fafba2bccd110b9460f created 13 years 5 months ago. By Carlos Camargo, Fixing cai9n loader for lm32 errors | |
---|---|
1 | /** |
2 | * Primitive first stage bootloader |
3 | * |
4 | * |
5 | */ |
6 | #include "soc-hw.h" |
7 | |
8 | /* prototypes */ |
9 | uint32_t read_uint32() |
10 | { |
11 | uint32_t val = 0, i; |
12 | |
13 | for (i = 0; i < 4; i++) { |
14 | val <<= 8; |
15 | val += (uint8_t)uart_getchar(); |
16 | } |
17 | |
18 | return val; |
19 | } |
20 | |
21 | void hexprint(unsigned int hexval) |
22 | { |
23 | int digit[8], pos; |
24 | uart_putstr("0x"); |
25 | for(pos = 0; pos < 8; pos++) |
26 | { |
27 | digit[pos] = (hexval & 0xF); /* last hexit */ |
28 | hexval = hexval >> 4; |
29 | } |
30 | for(pos = 7; pos > -1; pos--) |
31 | { |
32 | if(digit[pos] < 0xA) |
33 | uart_putstr((char *)digit[pos] + '0'); |
34 | else |
35 | uart_putstr((char *)digit[pos] + 'A' - 10); |
36 | } |
37 | uart_putchar(' '); |
38 | } |
39 | |
40 | |
41 | int main(int argc, char **argv) |
42 | { |
43 | int8_t *p; |
44 | uint8_t c; |
45 | int key, len, autoboot = 1, dispmenu = 1; |
46 | |
47 | // Initialize UART |
48 | uart_init(); |
49 | |
50 | |
51 | |
52 | |
53 | while(1){ /* loop forever until u-boot gets booted or the board is reset */ |
54 | if(dispmenu){ |
55 | uart_putstr("\n1: Upload program to RAM\r\n"); |
56 | // uart_putstr("2: Upload u-boot to Dataflash\r\n"); |
57 | // uart_putstr("3: Upload Kernel to Dataflash\r\n"); |
58 | // uart_putstr("4: Start u-boot\r\n"); |
59 | // uart_putstr("5: Upload Filesystem image\r\n"); |
60 | // uart_putstr("6: Memory test\r\n"); |
61 | dispmenu = 0; |
62 | } |
63 | |
64 | key = uart_getchar(); |
65 | autoboot = 0; |
66 | |
67 | if(key == '1'){ |
68 | len = rxmodem((unsigned char *)0x2000); |
69 | uart_putstr("Received "); |
70 | hexprint(len); |
71 | uart_putstr(" bytes\r\n"); |
72 | // jump(0x1000); |
73 | dispmenu = 1; |
74 | } |
75 | else{ |
76 | uart_putstr("Invalid input\r\n"); |
77 | dispmenu = 1; |
78 | } |
79 | |
80 | |
81 | |
82 | } |
83 | |
84 | |
85 | |
86 | c = '*'; // print msg on first iteration |
87 | for(;;) { |
88 | uint32_t start, size; |
89 | |
90 | switch (c) { |
91 | case 'u': // upload |
92 | start = read_uint32(); |
93 | size = read_uint32(); |
94 | for (p = (int8_t *) start; p < (int8_t *) (start+size); p++) |
95 | *p = uart_getchar(); |
96 | break; |
97 | case 'd': // download |
98 | start = read_uint32(); |
99 | size = read_uint32(); |
100 | for (p = (int8_t *) start; p < (int8_t *) (start+size); p++) |
101 | uart_putchar( *p ); |
102 | break; |
103 | case 'g': // goto |
104 | start = read_uint32(); |
105 | jump(start); |
106 | break; |
107 | default: |
108 | uart_putstr("**SAKC/bootloader** > \r\n"); |
109 | break; |
110 | }; |
111 | c = uart_getchar(); |
112 | } |
113 | } |
114 | |
115 |
Branches:
master