8d837e780cb5e2e5b2ca63ada07df815ab70b55e
[my-code/arm.git] / betty / fwflash.c
1 /*
2  * fwflash.c - handling the betty flashes
3  *
4  * author: hackbard@hackdaworld.org
5  *
6  */
7
8 /*
9  * include files
10  */
11
12 #include "lpc2xxx.h"
13
14 /*
15  * defines
16  */
17
18 /* band 0/2 addr */
19 #define BANK0                   0x80000000
20 #define BANK2                   0x82000000
21
22 /* commands */
23 #define CMD_READ                'R'
24 #define CMD_CHIP_ERASE          'E'
25
26 #define BUFSIZE                 16
27
28 /*
29  * type definitions
30  */
31
32 typedef unsigned char u8;
33 typedef unsigned short u16;
34 typedef unsigned int u32;
35
36 /*
37  * define macros
38  */
39
40 #define TX_BYTE(x)              while(!(UART0_LSR&(1<<5))) continue; \
41                                 UART0_THR=x;
42
43 #define SEND_OK                 TX_BYTE('o'); TX_BYTE('k'); TX_BYTE('\n'); \
44                                 TX_BYTE('\r');
45
46 /*
47  * function prototypes
48  */
49
50 void mmap_init(u8 memtype);
51 void uart0_init(void);
52 void uart0_send_string(char *txbuf);
53 void uart0_send_char(char send);
54
55 /*
56  * main function
57  */
58
59 int main(void) {
60
61         /* variables */
62
63         u32 i,addrlen,datalen;
64         u8 buf[BUFSIZE];
65         u32 addr;
66         u16 *dptr;
67         u8 cmd;
68         u8 txrx;
69
70         /* memory mapping of interrupt vectors to static ram */
71
72         //mmap_init(MMAP_RAM);
73
74         /* uart initialization */
75
76         //uart0_init();
77
78         PINSEL0=0x05;                   // pin select -> tx, rx
79         UART0_FCR=0x07;                 // enable fifo
80         UART0_LCR=0x83;                 // set dlab + word length
81         UART0_DLL=0x10;                 // br: 9600 @ 10/4 mhz
82         UART0_DLM=0x00;
83         UART0_LCR=0x03;                 // unset dlab
84
85         /* external memory init */
86
87         BCFG0=0x1000FBEF;               // no boot[1:0] influence? (thnx colibri)
88                                         // BCFG2 should be fine as is
89
90         /* begin the main loop */
91         while(1) {
92
93         /* receive cmd */
94         while(1) {
95
96                 while(!(UART0_LSR&(1<<0)))
97                         continue;
98                 cmd=UART0_RBR;
99
100                 if(cmd==CMD_CHIP_ERASE) {
101 SEND_OK
102                         addrlen=0;
103                         datalen=1;
104                         break;
105                 }
106
107                 if(cmd==CMD_READ) {
108                         addrlen=4;
109                         datalen=1;
110                         break;
111                 }
112         }
113
114         /* receive (only if there is) more data from uart0 */
115
116         addr=0;
117         for(i=0;i<addrlen;i++) {
118                 while(!(UART0_LSR&(1<<0)))
119                         continue;
120                 txrx=UART0_RBR;
121                 addr|=(txrx<<(i*4));
122         }
123 SEND_OK
124
125         for(i=0;i<datalen;i++) {
126                 while(!(UART0_LSR&(1<<0)))
127                         continue;
128                 buf[i++]=UART0_RBR;
129         }
130 SEND_OK
131
132         /* process the cmd */
133
134         switch(cmd) {
135                 case CMD_READ:
136                         dptr=(u16 *)addr;
137                         for(i=0;i<buf[0];i++) {
138                                 TX_BYTE(*dptr);
139                                 dptr++;
140                         }
141                         break;  
142                 case CMD_CHIP_ERASE:
143                         if(buf[0]=='0')
144                                 addr=BANK0;
145                         else if(buf[0]=='2')
146                                 addr=BANK2;
147                         else
148                                 break;
149                         // cycle 1
150                         dptr=(u16 *)(addr|0x555);
151                         *dptr=0xaa;
152                         // cycle 2
153                         dptr=(u16 *)(addr|0x2aa);
154                         *dptr=0x55;
155                         // cycle 3+4
156                         dptr=(u16 *)(addr|0x555);
157                         *dptr=0x80;
158                         *dptr=0xaa;
159                         // cycle 5
160                         dptr=(u16 *)(addr|0x2aa);
161                         *dptr=0x55;
162                         // cycle 6
163                         dptr=(u16 *)(addr|0x555);
164                         *dptr=0x10;
165 SEND_OK
166                         break;
167                 default:
168                         break;
169         }
170
171         /* send an ack, the cmd! */
172         TX_BYTE(cmd);
173                 
174         }
175
176         return 0;
177 }
178
179 /*
180  * functions
181  */
182
183 void mmap_init(u8 memtype) {
184
185         MEMMAP=memtype;
186 }
187
188 void uart0_init(void) {
189
190         PINSEL0=0x05;                   // pin select -> tx, rx
191         UART0_FCR=0x07;                 // enable fifo
192         UART0_LCR=0x83;                 // set dlab + word length
193         UART0_DLL=0x10;                 // br: 9600 @ 10/4 mhz
194         UART0_DLM=0x00;
195         UART0_LCR=0x03;                 // unset dlab
196 }
197
198 void uart0_send_string(char *txbuf) {
199
200         int i;
201
202         i=0;
203
204         while(txbuf[i])
205                 UART0_THR=txbuf[i++];
206         UART0_THR='\n';
207         UART0_THR='\r';
208
209         while(!(UART0_LSR&(1<<6))) {}
210 }
211
212 void uart0_send_char(char send) {
213
214         while(!(UART0_LSR&(1<<5)))
215                 continue;
216
217         UART0_THR=send;
218 }
219