Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 6 | lvd | 1 | #include <avr/io.h> |
| 2 | #include <avr/interrupt.h> |
||
| 3 | #include <avr/pgmspace.h> |
||
| 4 | |||
| 5 | #include <util/delay.h> |
||
| 6 | |||
| 7 | #include "mytypes.h" |
||
| 8 | #include "depacker_dirty.h" |
||
| 9 | #include "getfaraddress.h" |
||
| 10 | #include "pins.h" |
||
| 126 | chrv | 11 | #include "main.h" |
| 6 | lvd | 12 | #include "ps2.h" |
| 13 | #include "zx.h" |
||
| 14 | #include "spi.h" |
||
| 60 | chrv | 15 | #include "rs232.h" |
| 73 | chrv | 16 | #include "rtc.h" |
| 75 | chrv | 17 | #include "atx.h" |
| 112 | chrv | 18 | #include "joystick.h" |
| 6 | lvd | 19 | |
| 186 | chrv | 20 | /** FPGA data pointer [far address] (linker symbol). */ |
| 21 | extern ULONG fpga PROGMEM; |
||
| 6 | lvd | 22 | |
| 186 | chrv | 23 | // FPGA data index.. |
| 24 | volatile ULONG curFpga; |
||
| 25 | |||
| 26 | // Common flag register. |
||
| 126 | chrv | 27 | volatile UBYTE flags_register; |
| 28 | |||
| 29 | // Common modes register. |
||
| 30 | volatile UBYTE modes_register; |
||
| 31 | |||
| 186 | chrv | 32 | // Buffer for depacking FPGA configuration. |
| 33 | // You can USED for other purposed after setup FPGA. |
||
| 6 | lvd | 34 | UBYTE dbuf[DBSIZE]; |
| 35 | |||
| 104 | chrv | 36 | void put_buffer(UWORD size) |
| 37 | { |
||
| 38 | // writes specified length of buffer to the output |
||
| 39 | UBYTE * ptr = dbuf; |
||
| 6 | lvd | 40 | |
| 104 | chrv | 41 | do |
| 42 | { |
||
| 43 | spi_send( *(ptr++) ); |
||
| 44 | |||
| 45 | } while(--size); |
||
| 46 | } |
||
| 47 | |||
| 48 | void hardware_init(void) |
||
| 49 | { |
||
| 50 | //Initialized AVR pins |
||
| 51 | |||
| 52 | cli(); // disable interrupts |
||
| 53 | |||
| 54 | // configure pins |
||
| 55 | |||
| 56 | PORTG = 0b11111111; |
||
| 57 | DDRG = 0b00000000; |
||
| 58 | |||
| 59 | // PORTF = 0b11110000; // ATX off (zero output), fpga config/etc inputs |
||
| 60 | DDRF = 0b00001000; |
||
| 61 | |||
| 62 | PORTE = 0b11111111; |
||
| 63 | DDRE = 0b00000000; // inputs pulled up |
||
| 64 | |||
| 65 | PORTD = 0b11111111; |
||
| 66 | DDRD = 0b00000000; // same |
||
| 67 | |||
| 68 | PORTC = 0b11011111; |
||
| 69 | DDRC = 0b00000000; // PWRGOOD input, other pulled up |
||
| 70 | |||
| 71 | PORTB = 0b11110001; |
||
| 72 | DDRB = 0b10000111; // LED off, spi outs inactive |
||
| 73 | |||
| 74 | PORTA = 0b11111111; |
||
| 75 | DDRA = 0b00000000; // pulled up |
||
| 76 | |||
| 77 | ACSR = 0x80; // DISABLE analog comparator |
||
| 78 | } |
||
| 79 | |||
| 6 | lvd | 80 | int main() |
| 81 | { |
||
| 75 | chrv | 82 | start: |
| 6 | lvd | 83 | |
| 104 | chrv | 84 | hardware_init(); |
| 6 | lvd | 85 | |
| 60 | chrv | 86 | #ifdef LOGENABLE |
| 87 | rs232_init(); |
||
| 179 | chrv | 88 | to_log("VER:"); |
| 89 | { |
||
| 90 | UBYTE b,i; |
||
| 91 | ULONG version = 0x1DFF0; |
||
| 92 | char VER[]=".."; |
||
| 93 | for( i=0; i<12; i++) |
||
| 94 | { |
||
| 95 | dbuf[i] = pgm_read_byte_far(version+i); |
||
| 96 | } |
||
| 97 | dbuf[i]=0; |
||
| 98 | to_log((char*)dbuf); |
||
| 99 | to_log(" "); |
||
| 180 | chrv | 100 | UBYTE b1 = pgm_read_byte_far(version+12); |
| 101 | UBYTE b2 = pgm_read_byte_far(version+13); |
||
| 179 | chrv | 102 | UBYTE day = b1&0x1F; |
| 103 | UBYTE mon = ((b2<<3)+(b1>>5))&0x0F; |
||
| 104 | UBYTE year = (b2>>1)&0x3F; |
||
| 105 | VER[0] = '0'+(day/10); |
||
| 106 | VER[1] = '0'+(day%10); |
||
| 107 | to_log(VER); |
||
| 108 | to_log("."); |
||
| 109 | VER[0] = '0'+(mon/10); |
||
| 110 | VER[1] = '0'+(mon%10); |
||
| 111 | to_log(VER); |
||
| 112 | to_log("."); |
||
| 113 | VER[0] = '0'+(year/10); |
||
| 114 | VER[1] = '0'+(year%10); |
||
| 115 | to_log(VER); |
||
| 116 | to_log("\r\n"); |
||
| 117 | // |
||
| 118 | for( i=0; i<16; i++) |
||
| 119 | { |
||
| 120 | b = pgm_read_byte_far(version+i); |
||
| 121 | VER[0] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10; |
||
| 122 | VER[1] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10; |
||
| 123 | to_log(VER); |
||
| 124 | } |
||
| 125 | to_log("\r\n"); |
||
| 126 | } |
||
| 60 | chrv | 127 | #endif |
| 6 | lvd | 128 | |
| 75 | chrv | 129 | wait_for_atx_power(); |
| 6 | lvd | 130 | |
| 131 | spi_init(); |
||
| 132 | |||
| 133 | DDRF |= (1<<nCONFIG); // pull low for a time |
||
| 134 | _delay_us(40); |
||
| 135 | DDRF &= ~(1<<nCONFIG); |
||
| 136 | while( !(PINF & (1<<nSTATUS)) ); // wait ready |
||
| 186 | chrv | 137 | |
| 138 | curFpga = GET_FAR_ADDRESS(fpga); // prepare for data fetching |
||
| 139 | #ifdef LOGENABLE |
||
| 140 | { |
||
| 141 | char log_fpga[]="F........\r\n"; |
||
| 142 | UBYTE b = (UBYTE)((curFpga>>24)&0xFF); |
||
| 143 | log_fpga[1] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10; |
||
| 144 | log_fpga[2] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10; |
||
| 145 | b = (UBYTE)((curFpga>>16)&0xFF); |
||
| 146 | log_fpga[3] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10; |
||
| 147 | log_fpga[4] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10; |
||
| 148 | b = (UBYTE)((curFpga>>8)&0xFF); |
||
| 149 | log_fpga[5] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10; |
||
| 150 | log_fpga[6] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10; |
||
| 151 | b = (UBYTE)(curFpga&0xFF); |
||
| 152 | log_fpga[7] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10; |
||
| 153 | log_fpga[8] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10; |
||
| 154 | to_log(log_fpga); |
||
| 155 | } |
||
| 156 | #endif |
||
| 6 | lvd | 157 | depacker_dirty(); |
| 158 | |||
| 172 | chrv | 159 | //power led OFF |
| 160 | LED_PORT |= 1<<LED; |
||
| 6 | lvd | 161 | |
| 162 | // start timer (led dimming and timeouts for ps/2) |
||
| 163 | TCCR2 = 0b01110011; // FOC2=0, {WGM21,WGM20}=01, {COM21,COM20}=11, {CS22,CS21,CS20}=011 |
||
| 164 | // clk/64 clocking, |
||
| 165 | // 1/512 overflow rate, total 11.059/32768 = 337.5 Hz interrupt rate |
||
| 166 | TIFR = (1<<TOV2); |
||
| 167 | TIMSK = (1<<TOIE2); |
||
| 168 | |||
| 169 | |||
| 126 | chrv | 170 | //init some counters and registers |
| 149 | chrv | 171 | ps2keyboard_count = 12; |
| 172 | ps2keyboard_cmd_count = 0; |
||
| 173 | ps2keyboard_cmd = 0; |
||
| 60 | chrv | 174 | ps2mouse_count = 12; |
| 175 | ps2mouse_initstep = 0; |
||
| 176 | ps2mouse_resp_count = 0; |
||
| 126 | chrv | 177 | flags_register = 0; |
| 178 | modes_register = 0; |
||
| 6 | lvd | 179 | |
| 75 | chrv | 180 | //enable mouse |
| 181 | zx_mouse_reset(1); |
||
| 6 | lvd | 182 | |
| 60 | chrv | 183 | //set external interrupt |
| 184 | //INT4 - PS2 Keyboard (falling edge) |
||
| 185 | //INT5 - PS2 Mouse (falling edge) |
||
| 94 | chrv | 186 | //INT6 - SPI (falling edge) |
| 187 | //INT7 - RTC (falling edge) |
||
| 188 | EICRB = (1<<ISC41)+(0<<ISC40) + (1<<ISC51)+(0<<ISC50) + (1<<ISC61)+(0<<ISC60) + (1<<ISC71)+(0<<ISC70); // set condition for interrupt |
||
| 189 | EIFR = (1<<INTF4)|(1<<INTF5)|(1<<INTF6)|(1<<INTF7); // clear spurious ints there |
||
| 190 | EIMSK |= (1<<INT4)|(1<<INT5)|(1<<INT6)|(1<<INT7); // enable |
||
| 60 | chrv | 191 | |
| 186 | chrv | 192 | zx_init(); |
| 73 | chrv | 193 | rtc_init(); |
| 6 | lvd | 194 | |
| 151 | chrv | 195 | |
| 60 | chrv | 196 | #ifdef LOGENABLE |
| 197 | to_log("zx_init OK\r\n"); |
||
| 198 | #endif |
||
| 6 | lvd | 199 | |
| 200 | |||
| 60 | chrv | 201 | sei(); // globally go interrupting |
| 6 | lvd | 202 | |
| 151 | chrv | 203 | //set led on keyboard |
| 204 | ps2keyboard_send_cmd(PS2KEYBOARD_CMD_SETLED); |
||
| 205 | |||
| 60 | chrv | 206 | //main loop |
| 75 | chrv | 207 | do |
| 60 | chrv | 208 | { |
| 151 | chrv | 209 | ps2mouse_task(); |
| 60 | chrv | 210 | ps2keyboard_task(); |
| 211 | zx_task(ZX_TASK_WORK); |
||
| 71 | chrv | 212 | zx_mouse_task(); |
| 112 | chrv | 213 | joystick_task(); |
| 94 | chrv | 214 | |
| 112 | chrv | 215 | // |
| 126 | chrv | 216 | if ( flags_register&FLAG_SPI_INT ) |
| 94 | chrv | 217 | { |
| 218 | //get status byte |
||
| 219 | UBYTE status; |
||
| 104 | chrv | 220 | nSPICS_PORT &= ~(1<<nSPICS); |
| 94 | chrv | 221 | nSPICS_PORT |= (1<<nSPICS); |
| 222 | status = spi_send(0); |
||
| 223 | zx_wait_task( status ); |
||
| 224 | } |
||
| 60 | chrv | 225 | } |
| 75 | chrv | 226 | while( atx_power_task() ); |
| 6 | lvd | 227 | |
| 75 | chrv | 228 | goto start; |
| 6 | lvd | 229 | } |