00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "at90canbase.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(at90can32, AvrDevice_at90can32);
00034 AVR_REGISTER(at90can64, AvrDevice_at90can64);
00035 AVR_REGISTER(at90can128, AvrDevice_at90can128);
00036
00037 AvrDevice_at90canbase::~AvrDevice_at90canbase() {
00038 delete extirq01;
00039 delete eicra_reg;
00040 delete eicrb_reg;
00041 delete eimsk_reg;
00042 delete eifr_reg;
00043 delete ad;
00044 delete spi;
00045 delete acomp;
00046 delete usart0;
00047 delete usart1;
00048 delete timerIrq0;
00049 delete timer0;
00050 delete inputCapture1;
00051 delete timerIrq1;
00052 delete timer1;
00053 delete timerIrq2;
00054 delete timer2;
00055
00056 delete inputCapture3;
00057 delete timerIrq3;
00058 delete timer3;
00059
00060 delete gpior0_reg;
00061 delete gpior1_reg;
00062 delete gpior2_reg;
00063 }
00064
00065 AvrDevice_at90canbase::AvrDevice_at90canbase(unsigned ram_bytes,
00066 unsigned flash_bytes,
00067 unsigned ee_bytes ):
00068 AvrDevice(224,
00069 ram_bytes,
00070 0,
00071 flash_bytes),
00072 aref(),
00073 porta(this, "A", true),
00074 portb(this, "B", true),
00075 portc(this, "C", true, 7),
00076 portd(this, "D", true),
00077 porte(this, "E", true),
00078 portf(this, "F", true),
00079 portg(this, "G", true),
00080 assr_reg(&coreTraceGroup, "ASSR"),
00081 gtccr_reg(&coreTraceGroup, "GTCCR"),
00082 prescaler013(this, "01", >ccr_reg, 0, 7),
00083 prescaler2(this, "2", PinAtPort(&portc, 7), &assr_reg, 5, >ccr_reg, 1, 7),
00084
00085 admux(this,
00086 &portf.GetPin(0),
00087 &portf.GetPin(1),
00088 &portf.GetPin(2),
00089 &portf.GetPin(3),
00090 &portf.GetPin(4),
00091 &portf.GetPin(5),
00092 &portf.GetPin(6),
00093 &portf.GetPin(7))
00094 {
00095 flagJMPInstructions = (flash_bytes > 8U * 1024U) ? true : false;
00096 irqSystem = new HWIrqSystem(this, (flash_bytes > 8U * 1024U) ? 4 : 2, 26);
00097
00098 eeprom = new HWEeprom(this, irqSystem, ee_bytes, 23, HWEeprom::DEVMODE_EXTENDED);
00099 stack = new HWStackSram(this, 16);
00100
00101 RegisterPin("AREF", &aref);
00102 rampz = new AddressExtensionRegister(this, "RAMPZ", 1);
00103
00104 eicra_reg = new IOSpecialReg(&coreTraceGroup, "EICRA");
00105 eicrb_reg = new IOSpecialReg(&coreTraceGroup, "EICRB");
00106 eimsk_reg = new IOSpecialReg(&coreTraceGroup, "EIMSK");
00107 eifr_reg = new IOSpecialReg(&coreTraceGroup, "EIFR");
00108 extirq01 = new ExternalIRQHandler(this, irqSystem, eimsk_reg, eifr_reg);
00109 extirq01->registerIrq(1, 0, new ExternalIRQSingle(eicra_reg, 0, 2, GetPin("D0")));
00110 extirq01->registerIrq(2, 1, new ExternalIRQSingle(eicra_reg, 2, 2, GetPin("D1")));
00111 extirq01->registerIrq(3, 2, new ExternalIRQSingle(eicra_reg, 4, 2, GetPin("D2")));
00112 extirq01->registerIrq(4, 3, new ExternalIRQSingle(eicra_reg, 6, 2, GetPin("D3")));
00113 extirq01->registerIrq(5, 4, new ExternalIRQSingle(eicrb_reg, 0, 2, GetPin("E4")));
00114 extirq01->registerIrq(6, 5, new ExternalIRQSingle(eicrb_reg, 2, 2, GetPin("E5")));
00115 extirq01->registerIrq(7, 6, new ExternalIRQSingle(eicrb_reg, 4, 2, GetPin("E6")));
00116 extirq01->registerIrq(8, 7, new ExternalIRQSingle(eicrb_reg, 6, 2, GetPin("E7")));
00117
00118 timerIrq0 = new TimerIRQRegister(this, irqSystem, 0);
00119 timerIrq0->registerLine(0, new IRQLine("TOV0", 16));
00120 timerIrq0->registerLine(1, new IRQLine("OCF0A", 15));
00121
00122 timer0 = new HWTimer8_1C(this,
00123 new PrescalerMultiplexerExt(&prescaler013, PinAtPort(&portd, 7)),
00124 0,
00125 timerIrq0->getLine("TOV0"),
00126 timerIrq0->getLine("OCF0A"),
00127 new PinAtPort(&portb, 7));
00128
00129 timerIrq1 = new TimerIRQRegister(this, irqSystem, 1);
00130 timerIrq1->registerLine(0, new IRQLine("TOV1", 14));
00131 timerIrq1->registerLine(1, new IRQLine("OCF1A", 13));
00132 timerIrq1->registerLine(2, new IRQLine("OCF1B", 12));
00133 timerIrq1->registerLine(3, new IRQLine("OCF1C", 11));
00134 timerIrq1->registerLine(5, new IRQLine("ICF1", 10));
00135
00136 inputCapture1 = new ICaptureSource(PinAtPort(&portd, 4));
00137 timer1 = new HWTimer16_3C(this,
00138 new PrescalerMultiplexer(&prescaler013),
00139 1,
00140 timerIrq1->getLine("TOV1"),
00141 timerIrq1->getLine("OCF1A"),
00142 new PinAtPort(&portb, 1),
00143 timerIrq1->getLine("OCF1B"),
00144 new PinAtPort(&portb, 2),
00145 timerIrq1->getLine("OCF1C"),
00146 new PinAtPort(&portb, 3),
00147 timerIrq1->getLine("ICF1"),
00148 inputCapture1);
00149
00150 timerIrq2 = new TimerIRQRegister(this, irqSystem, 2);
00151 timerIrq2->registerLine(0, new IRQLine("TOV2", 9));
00152 timerIrq2->registerLine(1, new IRQLine("OCF2A", 7));
00153
00154 timer2 = new HWTimer8_1C(this,
00155 new PrescalerMultiplexer(&prescaler2),
00156 2,
00157 timerIrq2->getLine("TOV2"),
00158 timerIrq2->getLine("OCF2A"),
00159 new PinAtPort(&portb, 4));
00160
00161 timerIrq3 = new TimerIRQRegister(this, irqSystem, 3);
00162 timerIrq3->registerLine(0, new IRQLine("TOV3", 30));
00163 timerIrq3->registerLine(1, new IRQLine("OCF3A", 27));
00164 timerIrq3->registerLine(2, new IRQLine("OCF3B", 28));
00165 timerIrq3->registerLine(3, new IRQLine("OCF3C", 29));
00166 timerIrq3->registerLine(5, new IRQLine("ICF3", 26));
00167
00168 inputCapture3 = new ICaptureSource(PinAtPort(&porte, 7));
00169 timer3 = new HWTimer16_3C(this,
00170 new PrescalerMultiplexerExt(&prescaler013, PinAtPort(&porte, 6)),
00171 3,
00172 timerIrq3->getLine("TOV3"),
00173 timerIrq3->getLine("OCF3A"),
00174 new PinAtPort(&portb, 1),
00175 timerIrq3->getLine("OCF3B"),
00176 new PinAtPort(&portb, 2),
00177 timerIrq3->getLine("OCF3C"),
00178 new PinAtPort(&portb, 3),
00179 timerIrq3->getLine("ICF3"),
00180 inputCapture3);
00181
00182 gpior0_reg = new GPIORegister(this, &coreTraceGroup, "GPIOR0");
00183 gpior1_reg = new GPIORegister(this, &coreTraceGroup, "GPIOR1");
00184 gpior2_reg = new GPIORegister(this, &coreTraceGroup, "GPIOR2");
00185
00186 ad = new HWAd(this, &admux, irqSystem, aref, 25);
00187 spi = new HWSpi(this,
00188 irqSystem,
00189 PinAtPort(&portb, 2),
00190 PinAtPort(&portb, 3),
00191 PinAtPort(&portb, 1),
00192 PinAtPort(&portb, 0),
00193 20,
00194 true);
00195
00196 wado = new HWWado(this);
00197
00198 acomp = new HWAcomp(this, irqSystem, PinAtPort(&porte, 2), PinAtPort(&porte, 3), 23);
00199
00200 usart0 = new HWUsart(this,
00201 irqSystem,
00202 PinAtPort(&porte,1),
00203 PinAtPort(&porte,0),
00204 PinAtPort(&porte,2),
00205 20,
00206 21,
00207 22,
00208 0);
00209
00210 usart1 = new HWUsart(this,
00211 irqSystem,
00212 PinAtPort(&portd,3),
00213 PinAtPort(&portd,2),
00214 PinAtPort(&portd,5),
00215 31,
00216 32,
00217 33,
00218 1);
00219
00220
00221
00222
00223
00224 rw[0xce]= & usart1->udr_reg;
00225 rw[0xcd]= & usart1->ubrrhi_reg;
00226
00227 rw[0xca]= & usart1->ucsrc_reg;
00228 rw[0xcc]= & usart1->ubrr_reg;
00229 rw[0xc9]= & usart1->ucsrb_reg;
00230 rw[0xc8]= & usart1->ucsra_reg;
00231
00232 rw[0xc6]= & usart0->udr_reg;
00233 rw[0xc5]= & usart0->ubrrhi_reg;
00234 rw[0xc4]= & usart0->ubrr_reg;
00235
00236 rw[0xc2]= & usart0->ucsrc_reg;
00237 rw[0xc1]= & usart0->ucsrb_reg;
00238 rw[0xc0]= & usart0->ucsra_reg;
00239
00240
00241
00242 rw[0xb6]= & assr_reg;
00243
00244 rw[0xb3]= & timer2->ocra_reg;
00245 rw[0xb2]= & timer2->tcnt_reg;
00246
00247 rw[0xb0]= & timer2->tccr_reg;
00248
00249 rw[0x9d]= & timer3->ocrc_h_reg;
00250 rw[0x9c]= & timer3->ocrc_l_reg;
00251 rw[0x9b]= & timer3->ocrb_h_reg;
00252 rw[0x9a]= & timer3->ocrb_l_reg;
00253 rw[0x99]= & timer3->ocra_h_reg;
00254 rw[0x98]= & timer3->ocra_l_reg;
00255 rw[0x97]= & timer3->icr_h_reg;
00256 rw[0x96]= & timer3->icr_l_reg;
00257 rw[0x95]= & timer3->tcnt_h_reg;
00258 rw[0x94]= & timer3->tcnt_l_reg;
00259
00260 rw[0x92]= & timer3->tccrc_reg;
00261 rw[0x91]= & timer3->tccrb_reg;
00262 rw[0x90]= & timer3->tccra_reg;
00263
00264 rw[0x8d]= & timer1->ocrc_h_reg;
00265 rw[0x8c]= & timer1->ocrc_l_reg;
00266 rw[0x8b]= & timer1->ocrb_h_reg;
00267 rw[0x8a]= & timer1->ocrb_l_reg;
00268 rw[0x89]= & timer1->ocra_h_reg;
00269 rw[0x88]= & timer1->ocra_l_reg;
00270 rw[0x87]= & timer1->icr_h_reg;
00271 rw[0x86]= & timer1->icr_l_reg;
00272 rw[0x85]= & timer1->tcnt_h_reg;
00273 rw[0x84]= & timer1->tcnt_l_reg;
00274
00275 rw[0x82]= & timer1->tccrc_reg;
00276 rw[0x81]= & timer1->tccrb_reg;
00277 rw[0x80]= & timer1->tccra_reg;
00278
00279 rw[0x7C]= & admux.admux_reg;
00280 rw[0x7A]= & ad->adcsr_reg;
00281 rw[0x79]= & ad->adch_reg;
00282 rw[0x78]= & ad->adcl_reg;
00283
00284
00285
00286 rw[0x70]= & timerIrq2->timsk_reg;
00287 rw[0x6F]= & timerIrq1->timsk_reg;
00288 rw[0x6E]= & timerIrq0->timsk_reg;
00289
00290
00291 rw[0x69]= eicra_reg;
00292
00293
00294
00295
00296
00297 rw[0x60]= & wado->wdtcr_reg;
00298 rw[0x5f]= statusRegister;
00299 rw[0x5e]= & ((HWStackSram *)stack)->sph_reg;
00300 rw[0x5d]= & ((HWStackSram *)stack)->spl_reg;
00301
00302 rw[0x5b]= & rampz->ext_reg;
00303
00304
00305
00306
00307
00308
00309
00310
00311 rw[0x50]= & acomp->acsr_reg;
00312
00313 rw[0x4E]= & spi->spdr_reg;
00314 rw[0x4D]= & spi->spsr_reg;
00315 rw[0x4C]= & spi->spcr_reg;
00316 rw[0x4B]= gpior2_reg;
00317 rw[0x4A]= gpior1_reg;
00318
00319 rw[0x47]= & timer0->ocra_reg;
00320 rw[0x46]= & timer0->tcnt_reg;
00321
00322 rw[0x44]= & timer0->tccr_reg;
00323 rw[0x43]= & gtccr_reg;
00324 rw[0x42]= & eeprom->eearh_reg;
00325 rw[0x41]= & eeprom->eearl_reg;
00326 rw[0x40]= & eeprom->eedr_reg;
00327 rw[0x3F]= & eeprom->eecr_reg;
00328
00329 rw[0x3E]= gpior0_reg;
00330 rw[0x3D]= eimsk_reg;
00331 rw[0x3C]= eifr_reg;
00332
00333
00334 rw[0x38]= & timerIrq3->tifr_reg;
00335 rw[0x37]= & timerIrq2->tifr_reg;
00336 rw[0x36]= & timerIrq1->tifr_reg;
00337 rw[0x35]= & timerIrq0->tifr_reg;
00338
00339 rw[0x34]= & portg.port_reg;
00340 rw[0x33]= & portg.ddr_reg;
00341 rw[0x32]= & portg.pin_reg;
00342
00343 rw[0x31]= & portf.port_reg;
00344 rw[0x30]= & portf.ddr_reg;
00345 rw[0x2F]= & portf.pin_reg;
00346
00347 rw[0x2E]= & porte.port_reg;
00348 rw[0x2D]= & porte.ddr_reg;
00349 rw[0x2C]= & porte.pin_reg;
00350
00351 rw[0x2B]= & portd.port_reg;
00352 rw[0x2A]= & portd.ddr_reg;
00353 rw[0x29]= & portd.pin_reg;
00354
00355 rw[0x28]= & portc.port_reg;
00356 rw[0x27]= & portc.ddr_reg;
00357 rw[0x26]= & portc.pin_reg;
00358
00359 rw[0x25]= & portb.port_reg;
00360 rw[0x24]= & portb.ddr_reg;
00361 rw[0x23]= & portb.pin_reg;
00362
00363 rw[0x22]= & porta.port_reg;
00364 rw[0x21]= & porta.ddr_reg;
00365 rw[0x20]= & porta.pin_reg;
00366
00367 Reset();
00368 }
00369