1 | |
---|
2 | |
---|
3 | #define READ_UINT8( _register_, _value_ ) \ |
---|
4 | ((_value_) = *((volatile unsigned char *)(_register_))) |
---|
5 | |
---|
6 | #define WRITE_UINT8( _register_, _value_ ) \ |
---|
7 | (*((volatile unsigned char *)(_register_)) = (_value_)) |
---|
8 | |
---|
9 | /* - Board specific addresses for serial chip */ |
---|
10 | #define DIAG_BASE 0xfffff300 |
---|
11 | #define DIAG_SLCR (DIAG_BASE+0x00) |
---|
12 | #define DIAG_SLSR (DIAG_BASE+0x04) |
---|
13 | #define DIAG_SLDICR (DIAG_BASE+0x08) |
---|
14 | #define DIAG_SLDISR (DIAG_BASE+0x0C) |
---|
15 | #define DIAG_SFCR (DIAG_BASE+0x10) |
---|
16 | #define DIAG_SBRG (DIAG_BASE+0x14) |
---|
17 | #define DIAG_TFIFO (DIAG_BASE+0x20) |
---|
18 | #define DIAG_RFIFO (DIAG_BASE+0x30) |
---|
19 | |
---|
20 | #define BRG_T0 0x0000 |
---|
21 | #define BRG_T2 0x0100 |
---|
22 | #define BRG_T4 0x0200 |
---|
23 | #define BRG_T5 0x0300 |
---|
24 | |
---|
25 | |
---|
26 | #define READ_UINT16( _register_, _value_ ) \ |
---|
27 | ((_value_) = *((volatile unsigned short *)(_register_))) |
---|
28 | |
---|
29 | #define WRITE_UINT16( _register_, _value_ ) \ |
---|
30 | (*((volatile unsigned short *)(_register_)) = (_value_)) |
---|
31 | |
---|
32 | unsigned char |
---|
33 | inbyte (void) |
---|
34 | { |
---|
35 | unsigned char c; |
---|
36 | unsigned short disr; |
---|
37 | |
---|
38 | for (;;) |
---|
39 | { |
---|
40 | READ_UINT16 (DIAG_SLDISR, disr); |
---|
41 | if (disr & 0x0001) |
---|
42 | break; |
---|
43 | } |
---|
44 | disr = disr & ~0x0001; |
---|
45 | READ_UINT8 (DIAG_RFIFO, c); |
---|
46 | WRITE_UINT16 (DIAG_SLDISR, disr); |
---|
47 | return c; |
---|
48 | } |
---|
49 | |
---|
50 | void |
---|
51 | outbyte (unsigned char c) |
---|
52 | { |
---|
53 | unsigned short disr; |
---|
54 | |
---|
55 | for (;;) |
---|
56 | { |
---|
57 | READ_UINT16 (DIAG_SLDISR, disr); |
---|
58 | if (disr & 0x0002) |
---|
59 | break; |
---|
60 | } |
---|
61 | disr = disr & ~0x0002; |
---|
62 | WRITE_UINT8 (DIAG_TFIFO, c); |
---|
63 | WRITE_UINT16 (DIAG_SLDISR, disr); |
---|
64 | } |
---|
65 | |
---|
66 | /* Stuff required to setup IO on this board */ |
---|
67 | void board_serial_init (void) |
---|
68 | { |
---|
69 | WRITE_UINT16 (DIAG_SLCR, 0x0020); |
---|
70 | WRITE_UINT16 (DIAG_SLDICR, 0x0000); |
---|
71 | WRITE_UINT16 (DIAG_SFCR, 0x0000); |
---|
72 | WRITE_UINT16 (DIAG_SBRG, BRG_T2 | 5); |
---|
73 | } |
---|
74 | |
---|
75 | /* If you want this to be initialized as part of the stuff which gets called |
---|
76 | by crt0, it should be named 'hardware_init_hook'. |
---|
77 | Local implementations may want to move or add to this function OR |
---|
78 | do the initializations after main() is entered. |
---|
79 | */ |
---|
80 | void hardware_init_hook(void) |
---|
81 | { |
---|
82 | board_serial_init() ; |
---|
83 | } |
---|
84 | |
---|
85 | /* Structure filled in by get_mem_info. Only the size field is |
---|
86 | actually used (by sbrk), so the others aren't even filled in. */ |
---|
87 | |
---|
88 | struct s_mem |
---|
89 | { |
---|
90 | unsigned int size; |
---|
91 | unsigned int icsize; |
---|
92 | unsigned int dcsize; |
---|
93 | }; |
---|
94 | |
---|
95 | /* mem_size is provided in the linker script so that we don't have to |
---|
96 | define it here. */ |
---|
97 | extern char _mem_size[]; |
---|
98 | |
---|
99 | void |
---|
100 | get_mem_info (mem) |
---|
101 | struct s_mem *mem; |
---|
102 | { |
---|
103 | mem->size = (unsigned int)_mem_size; |
---|
104 | } |
---|