2 * fwflash.c - handling the betty flashes
4 * author: hackbard@hackdaworld.org
21 #define BANK0 0x80000000
22 #define BANK2 0x82000000
24 /* flash cmd addresses */
25 #define B0F555 (*((volatile unsigned long *)(BANK0|0x555)))
26 #define B0F2AA (*((volatile unsigned long *)(BANK0|0x2aa)))
27 #define B2F555 (*((volatile unsigned long *)(BANK2|0x555)))
28 #define B2F2AA (*((volatile unsigned long *)(BANK2|0x2aa)))
32 #define CMD_CHIP_ERASE 'E'
40 typedef unsigned char u8;
41 typedef unsigned short u16;
42 typedef unsigned int u32;
48 #define TX_BYTE(x) while(!(UART0_LSR&(1<<5))) continue; \
51 #define TX_NL TX_BYTE('\n'); TX_BYTE('\r')
53 #define TX_STRING(x,len) for(scnt=0;scnt<len;scnt++) { \
62 void mmap_init(u8 memtype);
63 void uart0_init(void);
64 void uart0_send_string(char *txbuf);
65 void uart0_send_char(char send);
81 u32 i,addrlen,datalen;
88 /* memory mapping of interrupt vectors to static ram */
90 //mmap_init(MMAP_RAM);
92 /* uart initialization */
96 PINSEL0=0x05; // pin select -> tx, rx
97 UART0_FCR=0x07; // enable fifo
98 UART0_LCR=0x83; // set dlab + word length
99 UART0_DLL=0x10; // br: 9600 @ 10/4 mhz
101 UART0_LCR=0x03; // unset dlab
103 /* external memory init */
105 BCFG0=0x1000FBEF; // BCFG2 should be fine as is
107 /* begin the main loop */
113 while(!(UART0_LSR&(1<<0)))
117 if(cmd==CMD_CHIP_ERASE) {
130 /* receive (only if there is) more data from uart0 */
133 for(i=0;i<addrlen;i++) {
134 //TX_STRING("got addr",8);
135 while(!(UART0_LSR&(1<<0)))
138 //addr|=(txrx<<((addrlen-i-1)*4));
142 for(i=0;i<datalen;i++) {
143 //TX_STRING("got data",8);
144 while(!(UART0_LSR&(1<<0)))
149 /* process the cmd */
154 for(i=0;i<buf[0];i++) {
168 else if(buf[0]=='2') {
181 /* send an ack, the cmd! */
193 void mmap_init(u8 memtype) {
198 void uart0_init(void) {
200 PINSEL0=0x05; // pin select -> tx, rx
201 UART0_FCR=0x07; // enable fifo
202 UART0_LCR=0x83; // set dlab + word length
203 UART0_DLL=0x10; // br: 9600 @ 10/4 mhz
205 UART0_LCR=0x03; // unset dlab
208 void uart0_send_string(char *txbuf) {
215 UART0_THR=txbuf[i++];
219 while(!(UART0_LSR&(1<<6))) {}
222 void uart0_send_char(char send) {
224 while(!(UART0_LSR&(1<<5)))