sc32442b.pp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  1. {
  2. Initialization stub copied from at91sam7x256.pp
  3. }
  4. unit sc32442b;
  5. {$goto on}
  6. interface
  7. var
  8. { Memory Controller }
  9. BWSCON: longword absolute $48000000;
  10. BANKCON0: longword absolute $48000004;
  11. BANKCON1: longword absolute $48000008;
  12. BANKCON2: longword absolute $4800000C;
  13. BANKCON3: longword absolute $48000010;
  14. BANKCON4: longword absolute $48000014;
  15. BANKCON5: longword absolute $48000018;
  16. BANKCON6: longword absolute $4800001C;
  17. BANKCON7: longword absolute $48000020;
  18. REFRESH: longword absolute $48000024;
  19. BANKSIZE: longword absolute $48000028;
  20. MRSRB6: longword absolute $4800002C;
  21. { USB Host Controller }
  22. HcRevision: longword absolute $49000000;
  23. HcControl: longword absolute $49000004;
  24. HcCommonStatus: longword absolute $49000008;
  25. HcInterruptStatus: longword absolute $4900000C;
  26. HcInterruptEnable: longword absolute $49000010;
  27. HcInterruptDisable: longword absolute $49000014;
  28. HcHCCA: longword absolute $49000018;
  29. HcPeriodCuttentED: longword absolute $4900001C;
  30. HcControlHeadED: longword absolute $49000020;
  31. HcControlCurrentED: longword absolute $49000024;
  32. HcBulkHeadED: longword absolute $49000028;
  33. HcBulkCurrentED: longword absolute $4900002C;
  34. HcDoneHead: longword absolute $49000030;
  35. HcRmInterval: longword absolute $49000034;
  36. HcFmRemaining: longword absolute $49000038;
  37. HcFmNumber: longword absolute $4900003C;
  38. HcPeriodicStart: longword absolute $49000040;
  39. HcLSThreshold: longword absolute $49000044;
  40. HcRhDescriptorA: longword absolute $49000048;
  41. HcRhDescriptorB: longword absolute $4900004C;
  42. HcRhStatus: longword absolute $49000050;
  43. HcRhPortStatus1: longword absolute $49000054;
  44. HcRhPortStatus2: longword absolute $49000058;
  45. { Interrupt controller }
  46. SRCPND: longword absolute $4A000000;
  47. INTMOD: longword absolute $4A000004;
  48. INTMSK: longword absolute $4A000008;
  49. PRIORITY: longword absolute $4A00000C;
  50. INTPND: longword absolute $4A000010;
  51. INTOFFSET: longword absolute $4A000014;
  52. SUBSRCPND: longword absolute $4A000018;
  53. INTSUBMSK: longword absolute $4A00001C;
  54. type
  55. TDMA = packed record
  56. DISRC,
  57. DISRCC,
  58. DIDST,
  59. DIDSTC,
  60. DCON,
  61. DSTAT,
  62. DCSRC,
  63. DCDST,
  64. DMASKTRIG: longword;
  65. end;
  66. var
  67. { DMA }
  68. DMA0: TDMA absolute $4B000000;
  69. DMA1: TDMA absolute $4B000040;
  70. DMA2: TDMA absolute $4B000080;
  71. DMA3: TDMA absolute $4B0000C0;
  72. { Clock and power }
  73. LOCKTIME: longword absolute $4C000000;
  74. MPLLCON: longword absolute $4C000004;
  75. UPLLCON: longword absolute $4C000008;
  76. CLKCON: longword absolute $4C00000C;
  77. CLKSLOW: longword absolute $4C000010;
  78. CLKDIVN: longword absolute $4C000014;
  79. CAMDIVN: longword absolute $4C000018;
  80. { LCD Controller }
  81. LCDCON1: longword absolute $4D000000;
  82. LCDCON2: longword absolute $4D000004;
  83. LCDCON3: longword absolute $4D000008;
  84. LCDCON4: longword absolute $4D00000C;
  85. LCDCON5: longword absolute $4D000010;
  86. LCDSADDR1: longword absolute $4D000014;
  87. LCDSADDR2: longword absolute $4D000018;
  88. LCDSADDR3: longword absolute $4D00001C;
  89. REDLUT: longword absolute $4D000020;
  90. GREENLUT: longword absolute $4D000024;
  91. BLUELUT: longword absolute $4D000028;
  92. DITHMODE: longword absolute $4D00004C;
  93. TPAL: longword absolute $4D000050;
  94. LCDINTPND: longword absolute $4D000054;
  95. LCDSRCPND: longword absolute $4D000058;
  96. LCDINTMSK: longword absolute $4D00005C;
  97. TCONSEL: longword absolute $4D000060;
  98. { NAND Flash }
  99. NFCONF: longword absolute $4E000000;
  100. NFCONT: longword absolute $4E000004;
  101. NFCMD: longword absolute $4E000008;
  102. NFADDR: longword absolute $4E00000C;
  103. NFDATA: longword absolute $4E000010;
  104. NFECC0: longword absolute $4E000014;
  105. NFECC1: longword absolute $4E000018;
  106. NFSECC: longword absolute $4E00001C;
  107. NFSTAT: longword absolute $4E000020;
  108. NFESTAT0: longword absolute $4E000024;
  109. NFESTAT1: longword absolute $4E000028;
  110. NFMECC0: longword absolute $4E00002C;
  111. NFMECC1: longword absolute $4E000030;
  112. NFSECC2: longword absolute $4E000034;
  113. NFSBLK: longword absolute $4E000038;
  114. NFEBLK: longword absolute $4E00003C;
  115. type
  116. TUART = packed record
  117. ULCON,
  118. UCON,
  119. UFCON,
  120. UMCON,
  121. UTRSTAT,
  122. UERSTAT,
  123. UFSTAT,
  124. UMSTAT,
  125. UTXH,
  126. URXH,
  127. UBRDIV: longword;
  128. end;
  129. var
  130. { UART }
  131. UART0: TUART absolute $50000000;
  132. UART1: TUART absolute $50004000;
  133. UART2: TUART absolute $50008000;
  134. type
  135. TPWMTimer = packed record
  136. TCNTB,
  137. TCMPB,
  138. TCNTO: longword;
  139. end;
  140. var
  141. { PWM Timer }
  142. TCFG0: longword absolute $51000000;
  143. TCFG1: longword absolute $51000004;
  144. TCON: longword absolute $51000008;
  145. PWMTimer: array[0..4] of TPWMTimer absolute $5100000C;
  146. { USB Device }
  147. FUNC_ADDR_REG: byte absolute $52000140;
  148. PWR_REG: byte absolute $52000144;
  149. EP_INT_REG: byte absolute $52000148;
  150. USB_INT_REG: byte absolute $52000158;
  151. EP_INT_EN_REG: byte absolute $5200015C;
  152. USB_INT_EN_REG: byte absolute $5200016C;
  153. FRAME_NUM1_REG: byte absolute $52000170;
  154. FRAME_NUM2_REG: byte absolute $52000174;
  155. INDEX_REG: byte absolute $52000178;
  156. EP0_CSR: byte absolute $52000184;
  157. IN_CSR1_REG: byte absolute $52000184;
  158. IN_CSR2_REG: byte absolute $52000188;
  159. MAXP_REG: byte absolute $52000180;
  160. OUT_CSR1_REG: byte absolute $52000190;
  161. OUT_CSR2_REG: byte absolute $52000194;
  162. OUT_FIFO_CNT1_REG: byte absolute $52000198;
  163. OUT_FIFO_CNT2_REG: byte absolute $5200019C;
  164. EP0_FIFO: byte absolute $520001C0;
  165. EP1_FIFO: byte absolute $520001C4;
  166. EP2_FIFO: byte absolute $520001C8;
  167. EP3_FIFO: byte absolute $520001CC;
  168. EP4_FIFO: byte absolute $520001D0;
  169. EP1_DMA_CON: byte absolute $52000200;
  170. EP1_DMA_UNIT: byte absolute $52000204;
  171. EP1_DMA_FIFO: byte absolute $52000208;
  172. EP1_DMA_TTC_L: byte absolute $5200020C;
  173. EP1_DMA_TTC_M: byte absolute $52000210;
  174. EP1_DMA_TTC_H: byte absolute $52000214;
  175. EP2_DMA_CON: byte absolute $52000218;
  176. EP2_DMA_UNIT: byte absolute $5200021C;
  177. EP2_DMA_FIFO: byte absolute $52000220;
  178. EP2_DMA_TTC_L: byte absolute $52000224;
  179. EP2_DMA_TTC_M: byte absolute $52000228;
  180. EP2_DMA_TTC_H: byte absolute $5200022C;
  181. EP3_DMA_CON: byte absolute $52000240;
  182. EP3_DMA_UNIT: byte absolute $52000244;
  183. EP3_DMA_FIFO: byte absolute $52000248;
  184. EP3_DMA_TTC_L: byte absolute $5200024C;
  185. EP3_DMA_TTC_M: byte absolute $52000250;
  186. EP3_DMA_TTC_H: byte absolute $52000254;
  187. EP4_DMA_CON: byte absolute $52000258;
  188. EP4_DMA_UNIT: byte absolute $5200025C;
  189. EP4_DMA_FIFO: byte absolute $52000260;
  190. EP4_DMA_TTC_L: byte absolute $52000264;
  191. EP4_DMA_TTC_M: byte absolute $52000268;
  192. EP4_DMA_TTC_H: byte absolute $5200026C;
  193. { Watchdog timer }
  194. WTCON: longword absolute $53000000;
  195. WTDAT: longword absolute $53000004;
  196. WTCNT: longword absolute $53000008;
  197. { I2C }
  198. IICCON: longword absolute $54000000;
  199. IICSTAT: longword absolute $54000004;
  200. IICADD: longword absolute $54000008;
  201. IICDS: longword absolute $5400000C;
  202. IICLC: longword absolute $54000010;
  203. { I2S }
  204. IISCON: longword absolute $55000000;
  205. IISMOD: longword absolute $55000004;
  206. IISPSR: longword absolute $55000008;
  207. IISFCON: longword absolute $5500000C;
  208. IISFIFO: longword absolute $55000010;
  209. type
  210. TGPIO = packed record
  211. CON,
  212. DAT,
  213. DN: longword;
  214. end;
  215. var
  216. { GPIO }
  217. GPA: TGPIO absolute $56000000;
  218. GPB: TGPIO absolute $56000010;
  219. GPC: TGPIO absolute $56000020;
  220. GPD: TGPIO absolute $56000030;
  221. GPE: TGPIO absolute $56000040;
  222. GPF: TGPIO absolute $56000050;
  223. GPG: TGPIO absolute $56000060;
  224. GPH: TGPIO absolute $56000070;
  225. GPJ: TGPIO absolute $560000D0;
  226. MISCCR: longword absolute $56000080;
  227. DCLKCON: longword absolute $56000084;
  228. EXTINT0: longword absolute $56000088;
  229. EXTINT1: longword absolute $5600008C;
  230. EXTINT2: longword absolute $56000090;
  231. EINTFLT0: longword absolute $56000094;
  232. EINTFLT1: longword absolute $56000098;
  233. EINTFLT2: longword absolute $5600009C;
  234. EINTFLT3: longword absolute $560000A0;
  235. EINTMASK: longword absolute $560000A4;
  236. EINTPEND: longword absolute $560000A8;
  237. GSTATUS0: longword absolute $560000AC;
  238. GSTATUS1: longword absolute $560000B0;
  239. GSTATUS2: longword absolute $560000B4;
  240. GSTATUS3: longword absolute $560000B8;
  241. GSTATUS4: longword absolute $560000BC;
  242. MSLCON: longword absolute $560000CC;
  243. { RTC }
  244. RTCCON: byte absolute $57000040;
  245. TICNT: byte absolute $57000044;
  246. RTCALM: byte absolute $57000050;
  247. ALMSEC: byte absolute $57000054;
  248. ALMMIN: byte absolute $57000058;
  249. ALMHOUR: byte absolute $5700005C;
  250. ALMDATE: byte absolute $57000060;
  251. ALMMON: byte absolute $57000064;
  252. ALMYEAR: byte absolute $57000068;
  253. BCDSEC: byte absolute $57000070;
  254. BCDMIN: byte absolute $57000074;
  255. BCDHOUR: byte absolute $57000078;
  256. BCDDATE: byte absolute $5700007C;
  257. BCDDAY: byte absolute $57000080;
  258. BCDMON: byte absolute $57000084;
  259. BCDYEAR: byte absolute $57000088;
  260. RTCLBAT: byte absolute $5700006C;
  261. { AD converter }
  262. ADCCON: longword absolute $58000000;
  263. ADCTSC: longword absolute $58000004;
  264. ADCDLY: longword absolute $58000008;
  265. ADCDAT0: longword absolute $5800000C;
  266. ADCDAT1: longword absolute $58000010;
  267. ADCUPDN: longword absolute $58000014;
  268. type
  269. TSPI = packed record
  270. SPCON,
  271. SPSTA,
  272. SPPIN,
  273. SPPRE,
  274. SPTDAT,
  275. SPRDAT: longword;
  276. end;
  277. var
  278. { SPI }
  279. SPI0: TSPI absolute $59000000;
  280. SPI1: TSPI absolute $59000020;
  281. { SD Interface }
  282. SDICON: longword absolute $5A000000;
  283. SDIPRE: longword absolute $5A000004;
  284. SDICARG: longword absolute $5A000008;
  285. SDICCON: longword absolute $5A00000C;
  286. SDICSTA: longword absolute $5A000010;
  287. SDIRSP0: longword absolute $5A000014;
  288. SDIRSP1: longword absolute $5A000018;
  289. SDIRSP2: longword absolute $5A00001C;
  290. SDIRSP3: longword absolute $5A000020;
  291. SDIDTIMER: longword absolute $5A000024;
  292. SDIBSIZE: longword absolute $5A000028;
  293. SDIDCON: longword absolute $5A00002C;
  294. SDIDCNT: longword absolute $5A000030;
  295. SDIDSTA: longword absolute $5A000034;
  296. SDIFSTA: longword absolute $5A000038;
  297. SDIIMSK: longword absolute $5A00003C;
  298. SDIDAT: byte absolute $5A000040;
  299. implementation
  300. procedure UndefinedInstrHandler; external name 'UndefinedInstrHandler';
  301. procedure SWIHandler; external name 'SWIHandler';
  302. procedure PrefetchAbortHandler; external name 'PrefetchAbortHandler';
  303. procedure DataAbortHandler; external name 'DataAbortHandler';
  304. procedure IRQHandler; external name 'IRQHandler';
  305. procedure FIQHandler; external name 'FIQHandler';
  306. procedure DefaultExceptionHandler; assembler; nostackframe;
  307. asm
  308. .Lloop:
  309. b .Lloop
  310. end;
  311. procedure PASCALMAIN; external name 'PASCALMAIN';
  312. procedure _FPC_haltproc; assembler; nostackframe; public name '_haltproc';
  313. asm
  314. .Lhalt:
  315. b .Lhalt
  316. end;
  317. var
  318. _data: record end; external name '_data';
  319. _edata: record end; external name '_edata';
  320. _etext: record end; external name '_etext';
  321. _bss_start: record end; external name '_bss_start';
  322. _bss_end: record end; external name '_bss_end';
  323. _stack_top: record end; external name '_stack_top';
  324. procedure _FPC_start; assembler; nostackframe;
  325. label
  326. _start;
  327. asm
  328. .init
  329. .align 16
  330. .globl _start
  331. b _start
  332. ldr pc, .LUndefined_Addr // Undefined Instruction vector
  333. ldr pc, .LSWI_Addr // Software Interrupt vector
  334. ldr pc, .LPrefetch_Addr // Prefetch abort vector
  335. ldr pc, .LAbort_Addr // Data abort vector
  336. nop // reserved
  337. ldr pc, .LIRQ_Addr // Interrupt Request (IRQ) vector
  338. ldr pc, .LFIQ_Addr // Fast interrupt request (FIQ) vector
  339. .LUndefined_Addr:
  340. .long UndefinedInstrHandler
  341. .LSWI_Addr:
  342. .long SWIHandler
  343. .LPrefetch_Addr:
  344. .long PrefetchAbortHandler
  345. .LAbort_Addr:
  346. .long DataAbortHandler
  347. .LIRQ_Addr:
  348. .long IRQHandler
  349. .LFIQ_Addr:
  350. .long FIQHandler
  351. .weak UndefinedInstrHandler
  352. .weak SWIHandler
  353. .weak PrefetchAbortHandler
  354. .weak DataAbortHandler
  355. .weak IRQHandler
  356. .weak FIQHandler
  357. .set UndefinedInstrHandler, DefaultExceptionHandler
  358. .set SWIHandler, DefaultExceptionHandler
  359. .set PrefetchAbortHandler, DefaultExceptionHandler
  360. .set DataAbortHandler, DefaultExceptionHandler
  361. .set IRQHandler, DefaultExceptionHandler
  362. .set FIQHandler, DefaultExceptionHandler
  363. _start:
  364. (*
  365. Set absolute stack top
  366. stack is already set by bootloader
  367. but if this point is entered by any
  368. other means than reset, the stack pointer
  369. needs to be set explicity
  370. *)
  371. ldr r0,.L_stack_top
  372. (*
  373. Setting up SP for the different CPU modes.
  374. Change mode before setting each one
  375. move back again to Supervisor mode
  376. Each interrupt has its own link
  377. register, stack pointer and program
  378. counter The stack pointers must be
  379. initialized for interrupts to be
  380. used later.
  381. *)
  382. msr cpsr_c, #0xdb // switch to Undefined Instruction Mode
  383. mov sp, r0
  384. sub r0, r0, #0x10
  385. msr cpsr_c, #0xd7 // switch to Abort Mode
  386. mov sp, r0
  387. sub r0, r0, #0x10
  388. msr CPSR_c, #0xd1 // switch to FIQ Mode
  389. mov sp, r0
  390. sub r0, r0, #0x80
  391. msr CPSR_c, #0xd2 // switch to IRQ Mode
  392. mov sp, r0
  393. sub r0, r0, #0x80
  394. msr CPSR_c, #0xd3 // switch to Supervisor Mode
  395. mov sp, r0
  396. sub r0, r0, #0x80
  397. msr CPSR_c, #0x1f // switch to System Mode, interrupts enabled
  398. mov sp, r0
  399. // copy initialized data from flash to ram
  400. ldr r1,.L_etext
  401. ldr r2,.L_data
  402. ldr r3,.L_edata
  403. .Lcopyloop:
  404. cmp r2,r3
  405. ldrls r0,[r1],#4
  406. strls r0,[r2],#4
  407. bls .Lcopyloop
  408. // clear onboard ram
  409. ldr r1,.L_bss_start
  410. ldr r2,.L_bss_end
  411. mov r0,#0
  412. .Lzeroloop:
  413. cmp r1,r2
  414. strls r0,[r1],#4
  415. bls .Lzeroloop
  416. bl PASCALMAIN
  417. bl _FPC_haltproc
  418. .L_bss_start:
  419. .long _bss_start
  420. .L_bss_end:
  421. .long _bss_end
  422. .L_etext:
  423. .long _etext
  424. .L_data:
  425. .long _data
  426. .L_edata:
  427. .long _edata
  428. .L_stack_top:
  429. .long _stack_top
  430. .text
  431. end;
  432. end.
  433. end.