sc32442b.pp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515
  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. var
  300. Undefined_Handler,
  301. SWI_Handler,
  302. Prefetch_Handler,
  303. Abort_Handler,
  304. IRQ_Handler,
  305. FIQ_Handler : pointer;
  306. implementation
  307. procedure AT91F_Default_FIQ_handler; assembler; nostackframe; public name 'AT91F_Default_FIQ_handler';
  308. asm
  309. .Lloop:
  310. b .Lloop
  311. end;
  312. procedure AT91F_Default_IRQ_handler; assembler; nostackframe; public name 'AT91F_Default_IRQ_handler';
  313. asm
  314. .Lloop:
  315. b .Lloop
  316. end;
  317. procedure AT91F_Spurious_handler; assembler; nostackframe; public name 'AT91F_Spurious_handler';
  318. asm
  319. .Lloop:
  320. b .Lloop
  321. end;
  322. procedure PASCALMAIN; external name 'PASCALMAIN';
  323. procedure _FPC_haltproc; assembler; nostackframe; public name '_haltproc';
  324. asm
  325. .Lhalt:
  326. b .Lhalt
  327. end;
  328. var
  329. _data: record end; external name '_data';
  330. _edata: record end; external name '_edata';
  331. _etext: record end; external name '_etext';
  332. _bss_start: record end; external name '_bss_start';
  333. _bss_end: record end; external name '_bss_end';
  334. _stack_top: record end; external name '_stack_top';
  335. procedure _FPC_start; assembler; nostackframe;
  336. label
  337. _start;
  338. asm
  339. .init
  340. .align 16
  341. .globl _start
  342. b _start
  343. b .LUndefined_Addr // Undefined Instruction vector
  344. b .LSWI_Addr // Software Interrupt vector
  345. b .LPrefetch_Addr // Prefetch abort vector
  346. b .LAbort_Addr // Data abort vector
  347. nop // reserved
  348. b .LIRQ_Addr // Interrupt Request (IRQ) vector
  349. b .LFIQ_Addr // Fast interrupt request (FIQ) vector
  350. .LUndefined_Addr:
  351. ldr r0,.L1
  352. ldr pc,[r0]
  353. .LSWI_Addr:
  354. ldr r0,.L2
  355. ldr pc,[r0]
  356. .LPrefetch_Addr:
  357. ldr r0,.L3
  358. ldr pc,[r0]
  359. .LAbort_Addr:
  360. ldr r0,.L4
  361. ldr pc,[r0]
  362. .LIRQ_Addr:
  363. ldr r0,.L5
  364. ldr pc,[r0]
  365. .LFIQ_Addr:
  366. ldr r0,.L5
  367. ldr pc,[r0]
  368. .L1:
  369. .long Undefined_Handler
  370. .L2:
  371. .long SWI_Handler
  372. .L3:
  373. .long Prefetch_Handler
  374. .L4:
  375. .long Abort_Handler
  376. .L5:
  377. .long IRQ_Handler
  378. .L6:
  379. .long FIQ_Handler
  380. _start:
  381. (*
  382. Set absolute stack top
  383. stack is already set by bootloader
  384. but if this point is entered by any
  385. other means than reset, the stack pointer
  386. needs to be set explicity
  387. *)
  388. ldr r0,.L_stack_top
  389. (*
  390. Setting up SP for the different CPU modes.
  391. Change mode before setting each one
  392. move back again to Supervisor mode
  393. Each interrupt has its own link
  394. register, stack pointer and program
  395. counter The stack pointers must be
  396. initialized for interrupts to be
  397. used later.
  398. *)
  399. msr cpsr_c, #0xdb // switch to Undefined Instruction Mode
  400. mov sp, r0
  401. sub r0, r0, #0x10
  402. msr cpsr_c, #0xd7 // switch to Abort Mode
  403. mov sp, r0
  404. sub r0, r0, #0x10
  405. msr CPSR_c, #0xd1 // switch to FIQ Mode
  406. mov sp, r0
  407. sub r0, r0, #0x80
  408. msr CPSR_c, #0xd2 // switch to IRQ Mode
  409. mov sp, r0
  410. sub r0, r0, #0x80
  411. msr CPSR_c, #0xd3 // switch to Supervisor Mode
  412. mov sp, r0
  413. sub r0, r0, #0x80
  414. msr CPSR_c, #0x1f // switch to System Mode, interrupts enabled
  415. mov sp, r0
  416. // for now, all handlers are set to a default one
  417. ldr r1,.LDefaultHandlerAddr
  418. ldr r0,.L1
  419. str r1,[r0]
  420. ldr r0,.L2
  421. str r1,[r0]
  422. ldr r0,.L3
  423. str r1,[r0]
  424. ldr r0,.L4
  425. str r1,[r0]
  426. ldr r0,.L5
  427. str r1,[r0]
  428. ldr r0,.L6
  429. str r1,[r0]
  430. // copy initialized data from flash to ram
  431. ldr r1,.L_etext
  432. ldr r2,.L_data
  433. ldr r3,.L_edata
  434. .Lcopyloop:
  435. cmp r2,r3
  436. ldrls r0,[r1],#4
  437. strls r0,[r2],#4
  438. bls .Lcopyloop
  439. // clear onboard ram
  440. ldr r1,.L_bss_start
  441. ldr r2,.L_bss_end
  442. mov r0,#0
  443. .Lzeroloop:
  444. cmp r1,r2
  445. strls r0,[r1],#4
  446. bls .Lzeroloop
  447. bl PASCALMAIN
  448. bl _FPC_haltproc
  449. .L_bss_start:
  450. .long _bss_start
  451. .L_bss_end:
  452. .long _bss_end
  453. .L_etext:
  454. .long _etext
  455. .L_data:
  456. .long _data
  457. .L_edata:
  458. .long _edata
  459. .L_stack_top:
  460. .long _stack_top
  461. .LDefaultHandlerAddr:
  462. .long .LDefaultHandler
  463. // default irq handler just returns
  464. .LDefaultHandler:
  465. mov pc,r14
  466. .text
  467. end;
  468. end.
  469. end.