sc32442b.pp 15 KB

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