Foo
[wikipediardware.git] / bootloader / rs232.c
blobd4737c256b81ff1b47bb9e2f3e46224e0196814e
1 /*
2 e07 bootloader suite
3 Copyright (c) 2008 Daniel Mack <daniel@caiaq.de>
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #include "regs.h"
20 #include "types.h"
21 #include "wikireader.h"
23 enum {
24 SPI_WRITE = 0,
25 SPI_READ = 1,
26 SPI_CS_HI = 2,
27 SPI_CS_LO = 3
30 int main(void)
32 u8 cmd, dat, len;
34 init_pins();
35 init_rs232_ch0();
36 SDCARD_CS_HI();
37 EEPROM_CS_HI();
39 /* EEPROM WP: off */
40 EEPROM_WP_HI();
42 /* enable SPI: master mode, no DMA, 8 bit transfers */
43 REG_SPI_CTL1 = 0x73 | (7 << 10) | (7 << 4);
45 for (;;) {
46 do {} while (!(REG_EFSIF0_STATUS & 0x1));
47 cmd = REG_EFSIF0_RXD;
49 switch (cmd) {
50 case SPI_CS_HI:
51 EEPROM_CS_HI();
52 break;
53 case SPI_CS_LO:
54 EEPROM_CS_LO();
55 break;
56 case SPI_WRITE:
57 do {} while (!(REG_EFSIF0_STATUS & 0x1));
58 len = REG_EFSIF0_RXD;
60 while (len--) {
61 do {} while (!(REG_EFSIF0_STATUS & 0x1));
62 dat = REG_EFSIF0_RXD;
63 REG_SPI_TXD = dat;
64 do {} while (REG_SPI_STAT & (1 << 6));
66 break;
67 case SPI_READ:
68 do {} while (!(REG_EFSIF0_STATUS & 0x1));
69 len = REG_EFSIF0_RXD;
71 while (len--) {
72 REG_SPI_TXD = 0x00;
73 do {} while (REG_SPI_STAT & (1 << 6));
74 dat = REG_SPI_RXD;
75 REG_EFSIF0_TXD = dat;
76 do {} while (REG_EFSIF0_STATUS & (1 << 5));
78 break;