1 from GoodFETARM7 import *
3 This is the ARM7 series of microcontrollers from Atmel, including:
10 ##### FLASH UPLOADER CODE
20 EBI_CSR0_MASK = 0xFFFF0000
24 EBI_CSR0 = EBI_BASE + EBI_OFF_CSR0
25 EBI_CSR1 = EBI_BASE + EBI_OFF_CSR1
26 EBI_CSR2 = EBI_BASE + EBI_OFF_CSR2
27 EBI_CSR3 = EBI_BASE + EBI_OFF_CSR3
28 EBI_CSR4 = EBI_BASE + EBI_OFF_CSR4
29 EBI_CSR5 = EBI_BASE + EBI_OFF_CSR5
30 EBI_CSR6 = EBI_BASE + EBI_OFF_CSR6
31 EBI_CSR7 = EBI_BASE + EBI_OFF_CSR7
32 EBI_MCR = EBI_BASE + EBI_OFF_MCR
34 REMAP_CMD = 0x00000001
35 MEM_CTRL_VAL = 0x00000006
38 SF_CHIP_ID = 0xFFF00000 # AT91R40 series, not sure on others
39 SF_CIDR_MASK = 0x0FFFFF00
43 PS_PCER = PS_BASE + 0x4
44 PS_PCDR = PS_BASE + 0x8
45 PS_PCSR = PS_BASE + 0xC
54 ("FIQ","Fast Interrupt"),
55 ("SWIRQ","Software Interrupt"),
56 ("US0IRQ","USART Channel 0 Interrupt"),
57 ("US1IRQ","USART Channel 1 Interrupt"),
58 ("TC0IRQ","Timer Channel 0 Interrupt"),
59 ("TC1IRQ","Timer Channel 1 Interrupt"),
60 ("TC2IRQ","Timer Channel 2 Interrupt"),
61 ("WDIRQ", "Watchdog Interrupt"),
62 ("PIOIRQ","Parallel I/O Controller Interrupt"),
70 ("IRQ0","External Interrupt 0"),
71 ("IRQ1","External Interrupt 0"),
72 ("IRQ0","External Interrupt 0"),
88 def aic_smr_decode(smr):
89 output = ["Interrupt Priority: %s"%(smr&7),
90 "Interrupt Source Type: %s"%("Low Level Sensitive","Negative Edge Triggered","High Level Sensitive","Positive Edge Triggered")[(smr>>5)],
92 return "\n".join(output)
95 AIC_SMR = [(AIC_BASE+(x*4), "Source Mode Register %d"%x) for x in xrange(32)]
96 AIC_SVR = [(AIC_BASE+0x80+(x*4), "Source Vector Register %d"%x) for x in xrange(32)]
97 AIC_IVR = AIC_BASE + 0x100
98 AIC_FVR = AIC_BASE + 0x104
99 AIC_ISR = AIC_BASE + 0x108
100 AIC_IPR = AIC_BASE + 0x10c
101 AIC_IMR = AIC_BASE + 0x110
102 AIC_CISR = AIC_BASE + 0x114
103 AIC_IECR = AIC_BASE + 0x120
104 AIC_IDCR = AIC_BASE + 0x124
105 AIC_ICCR = AIC_BASE + 0x128
106 AIC_ISCR = AIC_BASE + 0x12c
107 AIC_EOICR = AIC_BASE + 0x130
108 AIC_SPU = AIC_BASE + 0x134
111 PIO_BASE = 0xFFFF0000
112 PIO_PER = PIO_BASE + 0x0
113 PIO_PDR = PIO_BASE + 0x4
114 PIO_PSR = PIO_BASE + 0x8
115 PIO_OER = PIO_BASE + 0x10
116 PIO_ODR = PIO_BASE + 0x14
117 PIO_OSR = PIO_BASE + 0x18
118 PIO_SODR = PIO_BASE + 0x30
119 PIO_CODR = PIO_BASE + 0x34
120 PIO_ODSR = PIO_BASE + 0x38
121 PIO_CDSR = PIO_BASE + 0x3c
122 PIO_IER = PIO_BASE + 0x40
123 PIO_IDR = PIO_BASE + 0x44
124 PIO_IMR = PIO_BASE + 0x48
125 PIO_ISR = PIO_BASE + 0x4c
128 WD_OMR = WD_BASE + 0x0
129 WD_CMR = WD_BASE + 0x4
130 WD_CR = WD_BASE + 0x8
131 WD_SR = WD_BASE + 0xc
134 SF_CIDR = SF_BASE + 0x0
135 SF_EXID = SF_BASE + 0x4
136 SF_RSR = SF_BASE + 0x8
137 SF_MMR = SF_BASE + 0xC
138 SF_PMR = SF_BASE + 0x18
141 FLASH_BASE_ADDR = 0x1000000
143 FLASH_CODE_MASK = 0x000000FF
146 ATMEL_MANUFACTURED = 0x001F
147 FLASH_AT49BV_UNKNOW = 0xFFFF
148 FLASH_AT49BV8011 = 0x00CB
149 FLASH_AT49BV8011T = 0x004A
150 FLASH_AT49BV16x4 = 0x00C0
151 FLASH_AT49BV16x4T = 0x00C2
154 FLASH_AT29LV1024 = 0X26
155 FLASH_AT29C020 = 0XDA
157 #* Flash Program information
158 FLASH_PRG_SIZE = 0x800 #* 2Kbytes
159 FLASH_PRG_DEST = 0x20 #* Address on the target
162 #* Parameter for Flash_XV_Send_Data functions
171 #* Load program parameters
175 #* Flash LV Send Data parameters
176 SIZE_256_BYTES = 0x100
193 NB_TARGET_SUPPORTED = 6
199 #* Flash Program Address
200 FLASH_LV_PRG = 0x01018000
201 FLASH_BV_PRG = 0x0101A000
206 ebi_memory_map_items = {
207 EBI_OFF_CSR0:("Chip Select Register 0", "EBI_CSR0", EBI_READ|EBI_WRITE,0x0000203e),
208 EBI_OFF_CSR1:("Chip Select Register 1", "EBI_CSR1", EBI_READ|EBI_WRITE,0x10000000),
209 EBI_OFF_CSR2:("Chip Select Register 2", "EBI_CSR2", EBI_READ|EBI_WRITE,0x20000000),
210 EBI_OFF_CSR3:("Chip Select Register 3", "EBI_CSR3", EBI_READ|EBI_WRITE,0x30000000),
211 EBI_OFF_CSR4:("Chip Select Register 4", "EBI_CSR4", EBI_READ|EBI_WRITE,0x40000000),
212 EBI_OFF_CSR5:("Chip Select Register 5", "EBI_CSR5", EBI_READ|EBI_WRITE,0x50000000),
213 EBI_OFF_CSR6:("Chip Select Register 6", "EBI_CSR6", EBI_READ|EBI_WRITE,0x60000000),
214 EBI_OFF_CSR7:("Chip Select Register 7", "EBI_CSR7", EBI_READ|EBI_WRITE,0x70000000),
215 EBI_OFF_MCR: ("Memory Control Register","EBI_MCR", EBI_READ|EBI_WRITE,0),
218 def ebi_csr_decode(reg):
227 output = ["Base Address: %s"%hex(addr),
228 "Chip Select: %s"%("False","True")[csen],
229 "Byte Access Type: %s"%("Byte-Write","Byte-Access")[bat],
230 "Data Float Output Time: %d cycles added"%tdf,
231 "Page Size: %d MB"%(1,4,16,64)[pages],
232 "Wait State: %s"%("disabled","enabled")[wse],
233 "Wait States: %d"%nws,
234 "Data Bus Size: %d bits"%dbw,
236 return "\n".join(output)
239 0: ("A20,A21,A22,A23", 16, "None", "EBI_ALE_16M"),
240 1: ("A20,A21,A22,A23", 16, "None", "EBI_ALE_16M"),
241 2: ("A20,A21,A22,A23", 16, "None", "EBI_ALE_16M"),
242 3: ("A20,A21,A22,A23", 16, "None", "EBI_ALE_16M"),
243 4: ("A20,A21,A22", 8, "CS4", "EBI_ALE_8M"),
244 5: ("A20,A21", 4, "CS4,CS5", "EBI_ALE_4M"),
245 6: ("A20", 2, "CS4,CS5,CS6", "EBI_ALE_2M"),
246 7: ("None", 1, "CS4,CS5,CS6,CS7", "EBI_ALE_1M"),
250 validAddrBits,maxAddrSpace,validCS,codeLabel = mcr_decode[mcr&7]
252 output = ["Valid Address Bits: %s"%validAddrBits,
253 "Maximum Address Space: %xMB"%maxAddrSpace,
254 "Valid Chip Select: %s"%validCS,
255 "Code Label: %s"%codeLabel,
256 ("Standard Read Protocol for all external memory devices enabled (EBI_DRP_STANDARD)","Early Read Protocol for all external memory devices enabled (EBI_DRP_EARLY)")[drp]
258 return "\n".join(output)
260 def wd_omr_decode(omr):
261 return "\n".join(["External Signal: %s"%("disabled","enabled")[(omr>>3)&1],
262 "External Signal: %s"%("disabled","enabled")[(omr>>3)&1],
263 "Interrupt: %s"%("disabled","enabled")[(omr>>2)&1],
264 "Reset: %s"%("disabled","enabled")[(omr>>1)&1],
265 "Watch Dog: %s"%("disabled","enabled")[(omr)&1],
267 def wd_cmr_decode(cmr):
268 return "MCK/%d"%(8,32,128,1024)[(cmr>>2)&0xf]
274 class GoodFETAT91X40(GoodFETARM):
275 def getChipSelectReg(self, chipnum):
276 addr = EBI_BASE + (chipnum*4)
277 reg, = self.ARMreadMem(addr,1)
279 def getChipSelectRegstr(self, chipnum):
280 return ebi_csr_decode(self.getChipSelectReg(chipnum))
282 def getEBIMemoryMap(self):
283 keys = ebi_memory_map_items.keys()
285 output = [ "EBI Memory Map"]
287 desc,name,rw,default = ebi_memory_map_items[x*4]
288 output.append("\nMAP: %s (%s) - default: %x\n%s"%(name,desc,default,self.getChipSelectRegstr(x)))
289 return "\n".join(output)
290 def getMemoryControlRegister(self):
291 mcr = self.ARMreadMem(EBI_MCR)
293 def getMemoryControlRegisterstr(self):
294 return mcr_decode(self.getMemoryControlRegister())
296 def getInterruptSourceModeReg(self, regnum):
297 regval = self.ARMreadMem(AIC_SMR[regnum][0])
299 def getInterruptSourceModeRegstr(self, regnum):
300 return aic_smr_decode(self.getInterruptSourceModeReg(regnum))
301 def setInterruptSourceModeReg(self, regnum, val):
302 self.ARMwriteMem(AIC_SMR[regnum][0], val)
304 def getInterruptSourceVectorReg(self, regnum):
305 regval = self.ARMreadMem(AIC_SVR[regnum][0])
307 def setInterruptSourceModeReg(self, regnum, val):
308 self.ARMwriteMem(AIC_SVR[regnum][0], val)
310 def getIRQVectorReg(self):
311 return self.ARMreadMem(AIC_IVR)
312 def getFIQVectorReg(self):
313 return self.ARMreadMem(AIC_FVR)
315 def getInterruptStatusReg(self):
316 return self.ARMreadMem(AIC_ISR)
317 def getInterruptPendingReg(self):
318 return self.ARMreadMem(AIC_FSR)
319 def getInterruptMaskReg(self):
320 return self.ARMreadMem(AIC_IMR)
321 def getCoreInterruptStatusReg(self):
322 return self.ARMreadMem(AIC_CISR)
323 def enableInterrupt(self, interrupt):
324 self.ARMwriteMem(AIC_IECR, 1<<interrupt)
325 def disableInterrupt(self, interrupt):
326 self.ARMwriteMem(AIC_IDCR, 1<<interrupt)
327 def setInterruptCommandReg(self, interrupt):
328 self.ARMwriteMem(AIC_ISCR, 1<<interrupt)
329 def clearInterruptCommandReg(self, interrupt):
330 self.ARMwriteMem(AIC_ICCR, 1<<interrupt)
331 def clearCurrentInterrupt(self):
332 self.ARMwriteMem(AIC_EOICR, 1<<interrupt)
333 def getSpuriousVectorReg(self):
334 return self.ARMreadMem(AIC_SPU)
335 def setSpuriousVectorReg(self, val):
336 return self.ARMreadMem(AIC_SPU)
338 def enablePIOpin(self, mask):
339 self.ARMwriteMem(PIO_PER, mask)
340 def disablePIOpin(self, mask):
341 self.ARMwriteMem(PIO_PDR, mask)
342 def getPIOstatus(self):
343 return self.ARMreadMem(PIO_PSR)
344 def enablePIOoutput(self,mask):
345 self.ARMwriteMem(PIO_OER, mask)
346 def disablePIOoutput(self,mask):
347 self.ARMwriteMem(PIO_ODR, mask)
348 def getPIOoutputStatus(self):
349 return self.ARMreadMem(PIO_OSR)
351 def setOutputPin(self,mask):
352 self.ARMwriteMem(PIO_SODR, mask)
353 def clearOutputPin(self,mask):
354 self.ARMwriteMem(PIO_CODR, mask)
355 def getOutputDataStatusReg(self):
356 return self.ARMreadMem(PIO_ODSR)
357 def getPinDataStatusReg(self):
358 return self.ARMreadMem(PIO_PDSR)
359 def enablePIOinterrupt(self, mask):
360 self.ARMwriteMem(PIO_IER, mask)
361 def disablePIOinterrupt(self, mask):
362 self.ARMwriteMem(PIO_IDR, mask)
363 def getPIOinterruptMaskReg(self):
364 return self.ARMreadMem(PIO_IMR)
365 def getPIOinteruptStatusReg(self):
366 return self.ARMreadMem(PIO_ODSR)
369 def getWatchDogOverflowModeReg(self):
370 return self.ARMreadMem(WD_OMR)
371 def getWatchDogOverflowModeStr(self):
372 return wd_omr_decode(self.getWatchDogOverflowModeReg())
373 def setWatchDogOverflowModeReg(self, mode=0x2340):
374 self.ARMwriteMem(WD_OMR, mode)
375 def getWatchDogClockModeReg(self):
376 return self.ARMreadMem(WD_CMR)
377 def setWatchDogClockModeReg(self, mode=0x06e):
378 self.ARMwriteMem(WD_CMR, mode)
379 def setWatchDogControlReg(self, mode=0xC071):
380 self.ARMwriteMem(WD_CR, mode)
381 def getWatchDogStatusReg(self):
382 return self.ARMreadMem(WD_SR)
385 chipid = self.ARMreadMem(SF_CIDR,1)
387 def getResetStatusReg(self):
388 return self.ARMreadMem(SF_RSR)
389 def getMemoryModeReg(self):
390 return self.ARMreadMem(SF_MMR)
391 def setMemoryModeReg(self, val=0):
392 self.ARMwriteMem(SF_MMR, val)
393 def getProtectModeReg(self):
394 return self.ARMreadMem(SF_PMR)
395 def setProtectModeReg(self, val=0x27a80000):
396 self.ARMwriteMem(SF_PMR, val)
404 def ARMwriteFirmware(self, firmware):
406 chipid = self.ARMgetChipID()
407 # FIXME: initialize PLL or EBI
408 self.ARMmassErase(chipid)
409 self.ARMset_regCPSR(PM_svc) # set supervisor mode
410 # FIXME: download the "flash identifier" program into target RAM
411 self.ARMsetPC(PROGGYBASE)
413 # get manufacturer crap through DCC (really?? screw this...)
415 if (self.ARMget_regCPSR() & PM_svc != PM_svc):
416 raise Exception("No longer in Supervisor mode after firmware upload")
417 # FIXME: download the downloader program into target RAM
418 self.ARMsetPC(PROGGYBASE)
420 # FIXME: use DCC to upload the new firmware