00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "atmega1284abase.h"
00024
00025 #include "irqsystem.h"
00026 #include "hwstack.h"
00027 #include "hweeprom.h"
00028 #include "hwwado.h"
00029 #include "hwsreg.h"
00030 #include "avrerror.h"
00031 #include "avrfactory.h"
00032
00033 AVR_REGISTER(atmega164A, AvrDevice_atmega164A);
00034 AVR_REGISTER(atmega324A, AvrDevice_atmega324A);
00035 AVR_REGISTER(atmega644A, AvrDevice_atmega644A);
00036 AVR_REGISTER(atmega1284A, AvrDevice_atmega1284A);
00037
00038 AvrDevice_atmega1284Abase::~AvrDevice_atmega1284Abase() {
00039 delete usart1;
00040 delete usart0;
00041 delete wado;
00042 delete spi;
00043 delete gpior2_reg;
00044 delete gpior1_reg;
00045 delete gpior0_reg;
00046 delete ad;
00047 delete timer2;
00048 delete timerIrq2;
00049 delete timer1;
00050 delete inputCapture1;
00051 delete timerIrq1;
00052 delete timer0;
00053 delete timerIrq0;
00054 delete extirqpc;
00055 delete pcmsk3_reg;
00056 delete pcmsk2_reg;
00057 delete pcmsk1_reg;
00058 delete pcmsk0_reg;
00059 delete pcifr_reg;
00060 delete pcicr_reg;
00061 delete extirq012;
00062 delete eifr_reg;
00063 delete eimsk_reg;
00064 delete eicra_reg;
00065 delete stack;
00066 delete eeprom;
00067 delete irqSystem;
00068 }
00069
00070 AvrDevice_atmega1284Abase::AvrDevice_atmega1284Abase(unsigned ram_bytes,
00071 unsigned flash_bytes,
00072 unsigned ee_bytes ):
00073 AvrDevice(256-32,
00074 ram_bytes,
00075 0,
00076 flash_bytes),
00077 aref(),
00078 porta(this, "A", true),
00079 portb(this, "B", true),
00080 portc(this, "C", true),
00081 portd(this, "D", true),
00082 assr_reg(&coreTraceGroup, "ASSR"),
00083 gtccr_reg(&coreTraceGroup, "GTCCR"),
00084 prescaler01(this, "01", >ccr_reg, 0, 7),
00085 prescaler2(this, "2", PinAtPort(&portb, 6), &assr_reg, 5, >ccr_reg, 1, 7),
00086 admux(this,
00087 &porta.GetPin(0),
00088 &porta.GetPin(1),
00089 &porta.GetPin(2),
00090 &porta.GetPin(3),
00091 &porta.GetPin(4),
00092 &porta.GetPin(5),
00093 &porta.GetPin(6),
00094 &porta.GetPin(7))
00095 {
00096 irqSystem = new HWIrqSystem(this, 4, 31);
00097
00098 eeprom = new HWEeprom(this, irqSystem, ee_bytes, 25, HWEeprom::DEVMODE_EXTENDED);
00099 stack = new HWStackSram(this, 16);
00100
00101 RegisterPin("AREF", &aref);
00102
00103 eicra_reg = new IOSpecialReg(&coreTraceGroup, "EICRA");
00104 eimsk_reg = new IOSpecialReg(&coreTraceGroup, "EIMSK");
00105 eifr_reg = new IOSpecialReg(&coreTraceGroup, "EIFR");
00106 extirq012 = new ExternalIRQHandler(this, irqSystem, eimsk_reg, eifr_reg);
00107 extirq012->registerIrq(1, 0, new ExternalIRQSingle(eicra_reg, 0, 2, GetPin("D2")));
00108 extirq012->registerIrq(2, 1, new ExternalIRQSingle(eicra_reg, 2, 2, GetPin("D3")));
00109 extirq012->registerIrq(3, 2, new ExternalIRQSingle(eicra_reg, 4, 2, GetPin("B2")));
00110
00111 pcicr_reg = new IOSpecialReg(&coreTraceGroup, "PCICR");
00112 pcifr_reg = new IOSpecialReg(&coreTraceGroup, "PCIFR");
00113 pcmsk0_reg = new IOSpecialReg(&coreTraceGroup, "PCMSK0");
00114 pcmsk1_reg = new IOSpecialReg(&coreTraceGroup, "PCMSK1");
00115 pcmsk2_reg = new IOSpecialReg(&coreTraceGroup, "PCMSK2");
00116 pcmsk3_reg = new IOSpecialReg(&coreTraceGroup, "PCMSK3");
00117 extirqpc = new ExternalIRQHandler(this, irqSystem, pcicr_reg, pcifr_reg);
00118 extirqpc->registerIrq(4, 0, new ExternalIRQPort(pcmsk0_reg, &porta));
00119 extirqpc->registerIrq(5, 1, new ExternalIRQPort(pcmsk1_reg, &portb));
00120 extirqpc->registerIrq(6, 2, new ExternalIRQPort(pcmsk2_reg, &portc));
00121 extirqpc->registerIrq(7, 3, new ExternalIRQPort(pcmsk3_reg, &portd));
00122
00123 timerIrq0 = new TimerIRQRegister(this, irqSystem, 0);
00124 timerIrq0->registerLine(0, new IRQLine("TOV0", 18));
00125 timerIrq0->registerLine(1, new IRQLine("OCF0A", 16));
00126 timerIrq0->registerLine(2, new IRQLine("OCF0B", 17));
00127
00128 timer0 = new HWTimer8_2C(this,
00129 new PrescalerMultiplexerExt(&prescaler01, PinAtPort(&portd, 4)),
00130 0,
00131 timerIrq0->getLine("TOV0"),
00132 timerIrq0->getLine("OCF0A"),
00133 new PinAtPort(&portb, 3),
00134 timerIrq0->getLine("OCF0B"),
00135 new PinAtPort(&portb, 4));
00136
00137 timerIrq1 = new TimerIRQRegister(this, irqSystem, 1);
00138 timerIrq1->registerLine(0, new IRQLine("TOV1", 15));
00139 timerIrq1->registerLine(1, new IRQLine("OCF1A", 13));
00140 timerIrq1->registerLine(2, new IRQLine("OCF1B", 14));
00141 timerIrq1->registerLine(5, new IRQLine("ICF1", 12));
00142
00143 inputCapture1 = new ICaptureSource(PinAtPort(&portb, 0));
00144 timer1 = new HWTimer16_2C3(this,
00145 new PrescalerMultiplexerExt(&prescaler01, PinAtPort(&portd, 5)),
00146 1,
00147 timerIrq1->getLine("TOV1"),
00148 timerIrq1->getLine("OCF1A"),
00149 new PinAtPort(&portd, 5),
00150 timerIrq1->getLine("OCF1B"),
00151 new PinAtPort(&portd, 4),
00152 timerIrq1->getLine("ICF1"),
00153 inputCapture1);
00154
00155 timerIrq2 = new TimerIRQRegister(this, irqSystem, 2);
00156 timerIrq2->registerLine(0, new IRQLine("TOV2", 11));
00157 timerIrq2->registerLine(1, new IRQLine("OCF2A", 9));
00158 timerIrq2->registerLine(2, new IRQLine("OCF2B", 10));
00159
00160 timer2 = new HWTimer8_2C(this,
00161 new PrescalerMultiplexer(&prescaler2),
00162 2,
00163 timerIrq2->getLine("TOV2"),
00164 timerIrq2->getLine("OCF2A"),
00165 new PinAtPort(&portd, 7),
00166 timerIrq2->getLine("OCF2B"),
00167 new PinAtPort(&portd, 6));
00168
00169 gpior0_reg = new GPIORegister(this, &coreTraceGroup, "GPIOR0");
00170 gpior1_reg = new GPIORegister(this, &coreTraceGroup, "GPIOR1");
00171 gpior2_reg = new GPIORegister(this, &coreTraceGroup, "GPIOR2");
00172
00173 ad = new HWAd(this, &admux, irqSystem, aref, 24);
00174 spi = new HWSpi(this,
00175 irqSystem,
00176 PinAtPort(&portb, 5),
00177 PinAtPort(&portb, 6),
00178 PinAtPort(&portb, 7),
00179 PinAtPort(&portb, 4),
00180 19,
00181 true);
00182
00183 wado = new HWWado(this);
00184
00185 usart0 = new HWUsart(this,
00186 irqSystem,
00187 PinAtPort(&portd, 1),
00188 PinAtPort(&portd, 0),
00189 PinAtPort(&portb, 0),
00190 20,
00191 21,
00192 22);
00193
00194 usart1 = new HWUsart(this,
00195 irqSystem,
00196 PinAtPort(&portd, 3),
00197 PinAtPort(&portd, 2),
00198 PinAtPort(&portd, 4),
00199 28,
00200 29,
00201 30,
00202 1);
00203
00204
00205
00206 rw[0xCE]= & usart1->udr_reg;
00207 rw[0xCD]= & usart1->ubrrhi_reg;
00208 rw[0xCC]= & usart1->ubrr_reg;
00209
00210 rw[0xCA]= & usart1->ucsrc_reg;
00211 rw[0xC9]= & usart1->ucsrb_reg;
00212 rw[0xC8]= & usart1->ucsra_reg;
00213
00214 rw[0xC6]= & usart0->udr_reg;
00215 rw[0xC5]= & usart0->ubrrhi_reg;
00216 rw[0xC4]= & usart0->ubrr_reg;
00217
00218 rw[0xC2]= & usart0->ucsrc_reg;
00219 rw[0xC1]= & usart0->ucsrb_reg;
00220 rw[0xC0]= & usart0->ucsra_reg;
00221
00222
00223 rw[0xBD]= new NotSimulatedRegister("TWI register TWAMR not simulated");
00224 rw[0xBC]= new NotSimulatedRegister("TWI register TWCR not simulated");
00225 rw[0xBB]= new NotSimulatedRegister("TWI register TWDR not simulated");
00226 rw[0xBA]= new NotSimulatedRegister("TWI register TWAR not simulated");
00227 rw[0xB9]= new NotSimulatedRegister("TWI register TWSR not simulated");
00228 rw[0xB8]= new NotSimulatedRegister("TWI register TWBR not simulated");
00229
00230 rw[0xb6]= & assr_reg;
00231
00232 rw[0xb4]= & timer2->ocrb_reg;
00233 rw[0xb3]= & timer2->ocra_reg;
00234 rw[0xb2]= & timer2->tcnt_reg;
00235 rw[0xb1]= & timer2->tccrb_reg;
00236 rw[0xb0]= & timer2->tccra_reg;
00237
00238 rw[0x8b]= & timer1->ocrb_h_reg;
00239 rw[0x8a]= & timer1->ocrb_l_reg;
00240 rw[0x89]= & timer1->ocra_h_reg;
00241 rw[0x88]= & timer1->ocra_l_reg;
00242 rw[0x87]= & timer1->icr_h_reg;
00243 rw[0x86]= & timer1->icr_l_reg;
00244 rw[0x85]= & timer1->tcnt_h_reg;
00245 rw[0x84]= & timer1->tcnt_l_reg;
00246
00247 rw[0x82]= & timer1->tccrc_reg;
00248 rw[0x81]= & timer1->tccrb_reg;
00249 rw[0x80]= & timer1->tccra_reg;
00250 rw[0x7F]= new NotSimulatedRegister("ADC register DIDR1 not simulated");
00251 rw[0x7E]= new NotSimulatedRegister("ADC register DIDR0 not simulated");
00252
00253 rw[0x7C]= & admux.admux_reg;
00254 rw[0x7B]= new NotSimulatedRegister("ADC register ADCSRB not simulated");
00255 rw[0x7A]= & ad->adcsr_reg;
00256 rw[0x79]= & ad->adch_reg;
00257 rw[0x78]= & ad->adcl_reg;
00258
00259 rw[0x73]= pcmsk3_reg;
00260
00261
00262 rw[0x70]= & timerIrq2->timsk_reg;
00263 rw[0x6F]= & timerIrq1->timsk_reg;
00264 rw[0x6E]= & timerIrq0->timsk_reg;
00265 rw[0x6d]= pcmsk2_reg;
00266 rw[0x6c]= pcmsk1_reg;
00267 rw[0x6b]= pcmsk0_reg;
00268
00269 rw[0x69]= eicra_reg;
00270 rw[0x68]= pcicr_reg;
00271
00272 rw[0x66]= new NotSimulatedRegister("MCU register OSCCAL not simulated");
00273
00274 rw[0x64]= new NotSimulatedRegister("MCU register PRR not simulated");
00275
00276
00277 rw[0x61]= new NotSimulatedRegister("MCU register CLKPR not simulated");
00278 rw[0x60]= new NotSimulatedRegister("MCU register WDTCSR not simulated");
00279 rw[0x5f]= statusRegister;
00280 rw[0x5e]= & ((HWStackSram *)stack)->sph_reg;
00281 rw[0x5d]= & ((HWStackSram *)stack)->spl_reg;
00282
00283 rw[0x57]= new NotSimulatedRegister("Self-programming register SPMCSR not simulated");
00284
00285 rw[0x55]= new NotSimulatedRegister("MCU register MCUCR not simulated");
00286 rw[0x54]= new NotSimulatedRegister("MCU register MCUSR not simulated");
00287 rw[0x53]= new NotSimulatedRegister("MCU register SMCR not simulated");
00288
00289 rw[0x51]= new NotSimulatedRegister("On-chip debug register OCDR not simulated");
00290 rw[0x50]= new NotSimulatedRegister("ADC register ADCSRA not simulated");
00291
00292 rw[0x4E]= & spi->spdr_reg;
00293 rw[0x4D]= & spi->spsr_reg;
00294 rw[0x4C]= & spi->spcr_reg;
00295 rw[0x4B]= gpior2_reg;
00296 rw[0x4A]= gpior1_reg;
00297
00298 rw[0x48]= & timer0->ocrb_reg;
00299 rw[0x47]= & timer0->ocra_reg;
00300 rw[0x46]= & timer0->tcnt_reg;
00301 rw[0x45]= & timer0->tccrb_reg;
00302 rw[0x44]= & timer0->tccra_reg;
00303 rw[0x43]= & gtccr_reg;
00304 rw[0x42]= & eeprom->eearh_reg;
00305 rw[0x41]= & eeprom->eearl_reg;
00306 rw[0x40]= & eeprom->eedr_reg;
00307 rw[0x3F]= & eeprom->eecr_reg;
00308 rw[0x3E]= gpior0_reg;
00309 rw[0x3D]= eimsk_reg;
00310 rw[0x3C]= eifr_reg;
00311 rw[0x3b]= pcifr_reg;
00312
00313 rw[0x37]= & timerIrq2->tifr_reg;
00314 rw[0x36]= & timerIrq1->tifr_reg;
00315 rw[0x35]= & timerIrq0->tifr_reg;
00316
00317 rw[0x2B]= & portd.port_reg;
00318 rw[0x2A]= & portd.ddr_reg;
00319 rw[0x29]= & portd.pin_reg;
00320 rw[0x28]= & portc.port_reg;
00321 rw[0x27]= & portc.ddr_reg;
00322 rw[0x26]= & portc.pin_reg;
00323 rw[0x25]= & portb.port_reg;
00324 rw[0x24]= & portb.ddr_reg;
00325 rw[0x23]= & portb.pin_reg;
00326 rw[0x25]= & porta.port_reg;
00327 rw[0x24]= & porta.ddr_reg;
00328 rw[0x23]= & porta.pin_reg;
00329
00330 Reset();
00331 }
00332