added bootloader dump support, fwdump controls which memory to dump
[my-code/arm.git] / betty / fwbc.c
1 /*
2  * fwbc.c - broadcast the betty tv original firmware via uart0
3  *          use fwdump to write it onto your computers harddisk
4  *
5  * author: hackbard@hackdaworld.org
6  *
7  */
8
9 /*
10  * include files
11  */
12
13 #include "lpc2xxx.h"
14
15 /*
16  * defines
17  */
18
19 /* misc */
20 #define OSC_CLOCK               10000000
21 #define BAUDRATE                9600
22 #define P_DIV                   4
23 #define P_CLOCK                 (OSC_CLOCK/P_DIV)
24
25 /* memory mapping */
26 #define MMAP_BL                 0x00
27 #define MMAP_RAM                0x02
28 #define MMAP_EXT                0x03
29
30 /* band 0/2 & bootloader addr */
31 #define BANK0                   0x80000000
32 #define BANK2                   0x82000000
33 #define BOOTLOADER              0x7fffe000
34
35 /*
36  * type definitions
37  */
38
39 typedef unsigned char u8;
40 typedef unsigned short u16;
41 typedef unsigned int u32;
42
43 /*
44  * function prototypes
45  */
46
47 void mmap_init(u8 memtype);
48 void uart0_init(void);
49 void uart0_send_string(char *txbuf);
50 void uart0_send_char(char send);
51
52 /*
53  * main function
54  */
55
56 int main(void) {
57
58         /* variables */
59
60         u16 *mem;
61         u32 *bl;
62         u32 i,len;
63         u8 start;
64
65         /* memory mapping of interrupt vectors to static ram */
66
67         //mmap_init(MMAP_RAM);
68
69         /* uart initialization */
70
71         //uart0_init();
72
73         PINSEL0=0x05;                   // pin select -> tx, rx
74         UART0_FCR=0x07;                 // enable fifo
75         UART0_LCR=0x83;                 // set dlab + word length
76         UART0_DLL=0x10;                 // br: 9600 @ 10/4 mhz
77         UART0_DLM=0x00;
78         UART0_LCR=0x03;                 // unset dlab
79
80         /* external memory init */
81
82         BCFG0=0x1000FBEF;               // no boot[1:0] influence? (thnx colibri)
83                                         // BCFG2 should be fine as is
84
85         /* wait for fwdump to send transmit start character */
86         start=0x23;
87         while(1) {
88                 while(!(UART0_LSR&(1<<0)))
89                         continue;
90                 start=UART0_RBR;
91                 if(start=='0') {
92                         mem=(u16 *)BANK0;
93                         len=0x80000;
94                         break;
95                 }
96                 if(start=='2') {
97                         mem=(u16 *)BANK2;
98                         len=0x80000;
99                         break;
100                 }
101                 if(start=='b') {
102                         BCFG0=0x1000FBEF;       // 32 bit width
103                         bl=(u32 *)BOOTLOADER;
104                         len=0x800;
105                         break;
106                 }
107         }
108
109         /* transmit 1 mb of data */
110         for(i=0;i<len;i++) {                    // care for endianness
111
112                 while(!(UART0_LSR&(1<<5)))
113                         continue;
114                 if(start=='b')
115                         UART0_THR=(*bl&0xff);
116                 else
117                         UART0_THR=(*mem&0xff);
118
119                 while(!(UART0_LSR&(1<<5)))
120                         continue;
121                 if(start=='b')
122                         UART0_THR=((*bl&0xff00)>>8);
123                 else {
124                         UART0_THR=((*mem&0xff00)>>8);
125                         mem++;
126                 }
127
128                 if(start=='b') {
129                         while(!(UART0_LSR&(1<<5)))
130                                 continue;
131                         UART0_THR=((*bl&0xff0000)>>16);
132                         while(!(UART0_LSR&(1<<5)))
133                                 continue;
134                         UART0_THR=((*bl&0xff000000)>>24);
135                         bl++;
136                 }
137         }
138
139         return 0;
140 }
141
142 /*
143  * functions
144  */
145
146 void mmap_init(u8 memtype) {
147
148         MEMMAP=memtype;
149 }
150
151 void uart0_init(void) {
152
153         PINSEL0=0x05;                   // pin select -> tx, rx
154         UART0_FCR=0x07;                 // enable fifo
155         UART0_LCR=0x83;                 // set dlab + word length
156         UART0_DLL=0x10;                 // br: 9600 @ 10/4 mhz
157         UART0_DLM=0x00;
158         UART0_LCR=0x03;                 // unset dlab
159 }
160
161 void uart0_send_string(char *txbuf) {
162
163         int i;
164
165         i=0;
166
167         while(txbuf[i])
168                 UART0_THR=txbuf[i++];
169         UART0_THR='\n';
170         UART0_THR='\r';
171
172         while(!(UART0_LSR&(1<<6))) {}
173 }
174
175 void uart0_send_char(char send) {
176
177         while(!(UART0_LSR&(1<<5)))
178                 continue;
179
180         UART0_THR=send;
181 }
182