2
0

lpc21x4.pp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576
  1. {******************************************************************************
  2. lpc2114.h - Register defs for Philips LPC2114, LPC2124
  3. THE SOFTWARE IS DELIVERED "AS IS" WITHOUT WARRANTY OR CONDITION OF ANY KIND,
  4. EITHER EXPRESS, IMPLIED OR STATUTORY. THIS INCLUDES WITHOUT LIMITATION ANY
  5. WARRANTY OR CONDITION WITH RESPECT TO MERCHANTABILITY OR FITNESS FOR ANY
  6. PARTICULAR PURPOSE, OR AGAINST THE INFRINGEMENTS OF INTELLECTUAL PROPERTY RIGHTS
  7. OF OTHERS.
  8. This file may be freely used for commercial and non-commercial applications,
  9. including being redistributed with any tools.
  10. If you find a problem with the file, please report it so that it can be fixed.
  11. Created by Sten Larsson (sten_larsson at yahoo com)
  12. Free Pascal conversion by the Free Pascal development team
  13. ******************************************************************************}
  14. unit lpc21x4;
  15. {$goto on}
  16. interface
  17. {##############################################################################
  18. ## MISC
  19. ##############################################################################}
  20. { Constants for data to put in IRQ/FIQ Exception Vectors }
  21. const
  22. VECTDATA_IRQ = dword($E51FFFF0); { LDR PC,[PC,#-0xFF0] }
  23. // VECTDATA_FIQ { __TODO }
  24. type
  25. TBitvector32 = bitpacked array[0..31] of 0..1;
  26. {##############################################################################
  27. ## VECTORED INTERRUPT CONTROLLER
  28. ##############################################################################}
  29. var
  30. VICIRQStatus : DWord absolute $FFFFF000;
  31. VICFIQStatus : DWord absolute $FFFFF004;
  32. VICRawIntr : DWord absolute $FFFFF008;
  33. VICIntSelect : DWord absolute $FFFFF00C;
  34. VICIntEnable : DWord absolute $FFFFF010;
  35. VICIntEnClear : DWord absolute $FFFFF014;
  36. VICSoftInt : DWord absolute $FFFFF018;
  37. VICSoftIntClear : DWord absolute $FFFFF01C;
  38. VICProtection : DWord absolute $FFFFF020;
  39. VICVectAddr : DWord absolute $FFFFF030;
  40. VICDefVectAddr : DWord absolute $FFFFF034;
  41. VICVectAddr0 : DWord absolute $FFFFF100;
  42. VICVectAddr1 : DWord absolute $FFFFF104;
  43. VICVectAddr2 : DWord absolute $FFFFF108;
  44. VICVectAddr3 : DWord absolute $FFFFF10C;
  45. VICVectAddr4 : DWord absolute $FFFFF110;
  46. VICVectAddr5 : DWord absolute $FFFFF114;
  47. VICVectAddr6 : DWord absolute $FFFFF118;
  48. VICVectAddr7 : DWord absolute $FFFFF11C;
  49. VICVectAddr8 : DWord absolute $FFFFF120;
  50. VICVectAddr9 : DWord absolute $FFFFF124;
  51. VICVectAddr10 : DWord absolute $FFFFF128;
  52. VICVectAddr11 : DWord absolute $FFFFF12C;
  53. VICVectAddr12 : DWord absolute $FFFFF130;
  54. VICVectAddr13 : DWord absolute $FFFFF134;
  55. VICVectAddr14 : DWord absolute $FFFFF138;
  56. VICVectAddr15 : DWord absolute $FFFFF13C;
  57. VICVectCntl0 : DWord absolute $FFFFF200;
  58. VICVectCntl1 : DWord absolute $FFFFF204;
  59. VICVectCntl2 : DWord absolute $FFFFF208;
  60. VICVectCntl3 : DWord absolute $FFFFF20C;
  61. VICVectCntl4 : DWord absolute $FFFFF210;
  62. VICVectCntl5 : DWord absolute $FFFFF214;
  63. VICVectCntl6 : DWord absolute $FFFFF218;
  64. VICVectCntl7 : DWord absolute $FFFFF21C;
  65. VICVectCntl8 : DWord absolute $FFFFF220;
  66. VICVectCntl9 : DWord absolute $FFFFF224;
  67. VICVectCntl10 : DWord absolute $FFFFF228;
  68. VICVectCntl11 : DWord absolute $FFFFF22C;
  69. VICVectCntl12 : DWord absolute $FFFFF230;
  70. VICVectCntl13 : DWord absolute $FFFFF234;
  71. VICVectCntl14 : DWord absolute $FFFFF238;
  72. VICVectCntl15 : DWord absolute $FFFFF23C;
  73. VICITCR : DWord absolute $FFFFF300;
  74. VICITIP1 : DWord absolute $FFFFF304;
  75. VICITIP2 : DWord absolute $FFFFF308;
  76. VICITOP1 : DWord absolute $FFFFF30C;
  77. VICITOP2 : DWord absolute $FFFFF310;
  78. VICPeriphID0 : DWord absolute $FFFFFFE0;
  79. VICPeriphID1 : DWord absolute $FFFFFFE4;
  80. VICPeriphID2 : DWord absolute $FFFFFFE8;
  81. VICPeriphID3 : DWord absolute $FFFFFFEC;
  82. VICIntEnClr : DWord absolute $FFFFF014;
  83. VICSoftIntClr : DWord absolute $FFFFF01C;
  84. {##############################################################################
  85. ## PCB - Pin Connect Block
  86. ##############################################################################}
  87. PCB_PINSEL0 : DWord absolute $E002C000;
  88. PCB_PINSEL1 : DWord absolute $E002C004;
  89. PCB_PINSEL2 : DWord absolute $E002C014;
  90. {##############################################################################
  91. ## GPIO - General Purpose I/O
  92. ##############################################################################}
  93. GPIO0_IOPIN : DWord absolute $E0028000;
  94. GPIO0_IOSET : DWord absolute $E0028004;
  95. GPIO0_IODIR : DWord absolute $E0028008;
  96. GPIO0_IOCLR : DWord absolute $E002800C;
  97. GPIO1_IOPIN : DWord absolute $E0028010;
  98. GPIO1_IOSET : DWord absolute $E0028014;
  99. GPIO1_IODIR : DWord absolute $E0028018;
  100. GPIO1_IOCLR : DWord absolute $E002801C;
  101. {##############################################################################
  102. ## UART0 / UART1
  103. ##############################################################################}
  104. { ---- UART 0 --------------------------------------------- }
  105. UART0_RBR : DWord absolute $E000C000;
  106. UART0_THR : DWord absolute $E000C000;
  107. UART0_IER : DWord absolute $E000C004;
  108. UART0_IIR : DWord absolute $E000C008;
  109. UART0_FCR : DWord absolute $E000C008;
  110. UART0_LCR : DWord absolute $E000C00C;
  111. UART0_LSR : DWord absolute $E000C014;
  112. UART0_SCR : DWord absolute $E000C01C;
  113. UART0_DLL : DWord absolute $E000C000;
  114. UART0_DLM : DWord absolute $E000C004;
  115. { ---- UART 1 --------------------------------------------- }
  116. UART1_RBR : DWord absolute $E0010000;
  117. UART1_THR : DWord absolute $E0010000;
  118. UART1_IER : DWord absolute $E0010004;
  119. UART1_IIR : DWord absolute $E0010008;
  120. UART1_FCR : DWord absolute $E0010008;
  121. UART1_LCR : DWord absolute $E001000C;
  122. UART1_LSR : DWord absolute $E0010014;
  123. UART1_SCR : DWord absolute $E001001C;
  124. UART1_DLL : DWord absolute $E0010000;
  125. UART1_DLM : DWord absolute $E0010004;
  126. UART1_MCR : DWord absolute $E0010010;
  127. UART1_MSR : DWord absolute $E0010018;
  128. {##############################################################################
  129. ## I2C
  130. ##############################################################################}
  131. I2C_I2CONSET : DWord absolute $E001C000;
  132. I2C_I2STAT : DWord absolute $E001C004;
  133. I2C_I2DAT : DWord absolute $E001C008;
  134. I2C_I2ADR : DWord absolute $E001C00C;
  135. I2C_I2SCLH : DWord absolute $E001C010;
  136. I2C_I2SCLL : DWord absolute $E001C014;
  137. I2C_I2CONCLR : DWord absolute $E001C018;
  138. {##############################################################################
  139. ## SPI - Serial Peripheral Interface
  140. ##############################################################################}
  141. SPI_SPCR : DWord absolute $E0020000; { SPI = SPI0 }
  142. SPI_SPSR : DWord absolute $E0020004;
  143. SPI_SPDR : DWord absolute $E0020008;
  144. SPI_SPCCR : DWord absolute $E002000C;
  145. SPI_SPTCR : DWord absolute $E0020010;
  146. SPI_SPTSR : DWord absolute $E0020014;
  147. SPI_SPTOR : DWord absolute $E0020018;
  148. SPI_SPINT : DWord absolute $E002001C;
  149. SPI0_SPCR : DWord absolute $E0020000; { SPI = SPI0 }
  150. SPI0_SPSR : DWord absolute $E0020004;
  151. SPI0_SPDR : DWord absolute $E0020008;
  152. SPI0_SPCCR : DWord absolute $E002000C;
  153. SPI0_SPTCR : DWord absolute $E0020010;
  154. SPI0_SPTSR : DWord absolute $E0020014;
  155. SPI0_SPTOR : DWord absolute $E0020018;
  156. SPI0_SPINT : DWord absolute $E002001C;
  157. SPI1_SPCR : DWord absolute $E0030000;
  158. SPI1_SPSR : DWord absolute $E0030004;
  159. SPI1_SPDR : DWord absolute $E0030008;
  160. SPI1_SPCCR : DWord absolute $E003000C;
  161. SPI1_SPTCR : DWord absolute $E0030010;
  162. SPI1_SPTSR : DWord absolute $E0030014;
  163. SPI1_SPTOR : DWord absolute $E0030018;
  164. SPI1_SPINT : DWord absolute $E003001C;
  165. {##############################################################################
  166. ## Timer 0 and Timer 1
  167. ##############################################################################}
  168. { ---- Timer 0 -------------------------------------------- }
  169. T0_IR : DWord absolute $E0004000;
  170. T0_TCR : DWord absolute $E0004004;
  171. T0_TC : DWord absolute $E0004008;
  172. T0_PR : DWord absolute $E000400C;
  173. T0_PC : DWord absolute $E0004010;
  174. T0_MCR : DWord absolute $E0004014;
  175. T0_MR0 : DWord absolute $E0004018;
  176. T0_MR1 : DWord absolute $E000401C;
  177. T0_MR2 : DWord absolute $E0004020;
  178. T0_MR3 : DWord absolute $E0004024;
  179. T0_CCR : DWord absolute $E0004028;
  180. T0_CR0 : DWord absolute $E000402C;
  181. T0_CR1 : DWord absolute $E0004030;
  182. T0_CR2 : DWord absolute $E0004034;
  183. T0_CR3 : DWord absolute $E0004038;
  184. T0_EMR : DWord absolute $E000403C;
  185. { ---- Timer 1 -------------------------------------------- }
  186. T1_IR : DWord absolute $E0008000;
  187. T1_TCR : DWord absolute $E0008004;
  188. T1_TC : DWord absolute $E0008008;
  189. T1_PR : DWord absolute $E000800C;
  190. T1_PC : DWord absolute $E0008010;
  191. T1_MCR : DWord absolute $E0008014;
  192. T1_MR0 : DWord absolute $E0008018;
  193. T1_MR1 : DWord absolute $E000801C;
  194. T1_MR2 : DWord absolute $E0008020;
  195. T1_MR3 : DWord absolute $E0008024;
  196. T1_CCR : DWord absolute $E0008028;
  197. T1_CR0 : DWord absolute $E000802C;
  198. T1_CR1 : DWord absolute $E0008030;
  199. T1_CR2 : DWord absolute $E0008034;
  200. T1_CR3 : DWord absolute $E0008038;
  201. T1_EMR : DWord absolute $E000803C;
  202. {##############################################################################
  203. ## PWM
  204. ##############################################################################}
  205. PWM_IR : DWord absolute $E0014000;
  206. PWM_TCR : DWord absolute $E0014004;
  207. PWM_TC : DWord absolute $E0014008;
  208. PWM_PR : DWord absolute $E001400C;
  209. PWM_PC : DWord absolute $E0014010;
  210. PWM_MCR : DWord absolute $E0014014;
  211. PWM_MR0 : DWord absolute $E0014018;
  212. PWM_MR1 : DWord absolute $E001401C;
  213. PWM_MR2 : DWord absolute $E0014020;
  214. PWM_MR3 : DWord absolute $E0014024;
  215. PWM_MR4 : DWord absolute $E0014040;
  216. PWM_MR5 : DWord absolute $E0014044;
  217. PWM_MR6 : DWord absolute $E0014048;
  218. PWM_EMR : DWord absolute $E001403C;
  219. PWM_PCR : DWord absolute $E001404C;
  220. PWM_LER : DWord absolute $E0014050;
  221. PWM_CCR : DWord absolute $E0014028;
  222. PWM_CR0 : DWord absolute $E001402C;
  223. PWM_CR1 : DWord absolute $E0014030;
  224. PWM_CR2 : DWord absolute $E0014034;
  225. PWM_CR3 : DWord absolute $E0014038;
  226. {##############################################################################
  227. ## RTC
  228. ##############################################################################}
  229. { ---- RTC: Miscellaneous Register Group ------------------ }
  230. RTC_ILR : DWord absolute $E0024000;
  231. RTC_CTC : DWord absolute $E0024004;
  232. RTC_CCR : DWord absolute $E0024008;
  233. RTC_CIIR : DWord absolute $E002400C;
  234. RTC_AMR : DWord absolute $E0024010;
  235. RTC_CTIME0 : DWord absolute $E0024014;
  236. RTC_CTIME1 : DWord absolute $E0024018;
  237. RTC_CTIME2 : DWord absolute $E002401C;
  238. { ---- RTC: Timer Control Group --------------------------- }
  239. RTC_SEC : DWord absolute $E0024020;
  240. RTC_MIN : DWord absolute $E0024024;
  241. RTC_HOUR : DWord absolute $E0024028;
  242. RTC_DOM : DWord absolute $E002402C;
  243. RTC_DOW : DWord absolute $E0024030;
  244. RTC_DOY : DWord absolute $E0024034;
  245. RTC_MONTH : DWord absolute $E0024038;
  246. RTC_YEAR : DWord absolute $E002403C;
  247. { ---- RTC: Alarm Control Group --------------------------- }
  248. RTC_ALSEC : DWord absolute $E0024060;
  249. RTC_ALMIN : DWord absolute $E0024064;
  250. RTC_ALHOUR : DWord absolute $E0024068;
  251. RTC_ALDOM : DWord absolute $E002406C;
  252. RTC_ALDOW : DWord absolute $E0024070;
  253. RTC_ALDOY : DWord absolute $E0024074;
  254. RTC_ALMON : DWord absolute $E0024078;
  255. RTC_ALYEAR : DWord absolute $E002407C;
  256. { ---- RTC: Reference Clock Divider Group ----------------- }
  257. RTC_PREINT : DWord absolute $E0024080;
  258. RTC_PREFRAC : DWord absolute $E0024084;
  259. {##############################################################################
  260. ## AE - AD Converter
  261. ##############################################################################}
  262. AD_ADCR : DWord absolute $E0034000;
  263. AD_ADDR : DWord absolute $E0034004;
  264. {##############################################################################
  265. ## WD - Watchdog
  266. ##############################################################################}
  267. WD_WDMOD : DWord absolute $E0000000;
  268. WD_WDTC : DWord absolute $E0000004;
  269. WD_WDFEED : DWord absolute $E0000008;
  270. WD_WDTV : DWord absolute $E000000C;
  271. {##############################################################################
  272. ## SCB - System Control Block
  273. ##############################################################################}
  274. SCB_EXTINT : DWord absolute $E01FC140;
  275. SCB_EXTWAKE : DWord absolute $E01FC144;
  276. SCB_EXTMODE : DWord absolute $E01FC148;
  277. SCB_EXTPOLAR : DWord absolute $E01FC14C;
  278. SCB_MEMMAP : DWord absolute $E01FC040;
  279. SCB_PLLCON : DWord absolute $E01FC080;
  280. SCB_PLLCFG : DWord absolute $E01FC084;
  281. SCB_PLLSTAT : DWord absolute $E01FC088;
  282. SCB_PLLFEED : DWord absolute $E01FC08C;
  283. SCB_PCON : DWord absolute $E01FC0C0;
  284. SCB_PCONP : DWord absolute $E01FC0C4;
  285. SCB_VPBDIV : DWord absolute $E01FC100;
  286. {##############################################################################
  287. ## MAM - Memory Accelerator Module
  288. ##############################################################################}
  289. MAM_MAMCR : DWord absolute $E01FC000;
  290. MAM_MAMTIM : DWord absolute $E01FC004;
  291. MAM_MAMMAP : DWord absolute $E01FC040;
  292. var
  293. Undefined_Handler,
  294. SWI_Handler,
  295. Prefetch_Handler,
  296. Abort_Handler,
  297. IRQ_Handler,
  298. FIQ_Handler : pointer;
  299. type
  300. tm = 1..32;
  301. tp = 1..8;
  302. procedure InitPLL(m : tm;p : tp);
  303. procedure PLLFeed;
  304. function GetProcessorClock(CrystalFrequency : DWord) : DWord;
  305. implementation
  306. procedure PLLFeed;
  307. begin
  308. SCB_PLLFEED:=$aa;
  309. SCB_PLLFEED:=$55;
  310. end;
  311. function GetProcessorClock(CrystalFrequency : DWord) : DWord;
  312. begin
  313. if (TBitvector32(SCB_PLLSTAT)[8] and 1)<>0 then
  314. GetProcessorClock:=((SCB_PLLSTAT and $f)+1)*CrystalFrequency
  315. else
  316. GetProcessorClock:=CrystalFrequency;
  317. end;
  318. procedure InitPLL(m : tm;p : tp);
  319. begin
  320. case p of
  321. 1: p:=0;
  322. 2..3: p:=1;
  323. 4..7: p:=2;
  324. 8: p:=3;
  325. end;
  326. { set p and m }
  327. SCB_PLLCFG:=(m-1) or (p shl 5);
  328. { write changes }
  329. PLLFeed;
  330. { start PLL }
  331. TBitvector32(SCB_PLLCON)[0]:=1;
  332. { write changes }
  333. PLLFeed;
  334. { wait for pll sync }
  335. while TBitvector32(SCB_PLLSTAT)[10]=0 do
  336. ;
  337. { connect PLL }
  338. TBitvector32(SCB_PLLCON)[1]:=1;
  339. { write changes }
  340. PLLFeed;
  341. end;
  342. procedure PASCALMAIN; external name 'PASCALMAIN';
  343. procedure _FPC_haltproc; public name '_haltproc';
  344. label
  345. Lhalt;
  346. begin
  347. Lhalt:
  348. goto Lhalt;
  349. end;
  350. var
  351. _data: record end; external name '_data';
  352. _edata: record end; external name '_edata';
  353. _etext: record end; external name '_etext';
  354. _bss_start: record end; external name '_bss_start';
  355. _bss_end: record end; external name '_bss_end';
  356. _stack_top: record end; external name '_stack_top';
  357. procedure _FPC_start; assembler; nostackframe;
  358. label
  359. _start;
  360. asm
  361. // code derived from phillips appnote 10254
  362. .init
  363. .align 16
  364. .globl _start
  365. b _start
  366. b .LUndefined_Addr // Undefined Instruction vector
  367. b .LSWI_Addr // Software Interrupt vector
  368. b .LPrefetch_Addr // Prefetch abort vector
  369. b .LAbort_Addr // Data abort vector
  370. nop // reserved
  371. b .LIRQ_Addr // Interrupt Request (IRQ) vector
  372. b .LFIQ_Addr // Fast interrupt request (FIQ) vector
  373. .LUndefined_Addr:
  374. ldr r0,.L1
  375. ldr pc,[r0]
  376. .LSWI_Addr:
  377. ldr r0,.L2
  378. ldr pc,[r0]
  379. .LPrefetch_Addr:
  380. ldr r0,.L3
  381. ldr pc,[r0]
  382. .LAbort_Addr:
  383. ldr r0,.L4
  384. ldr pc,[r0]
  385. .LIRQ_Addr:
  386. ldr r0,.L5
  387. ldr pc,[r0]
  388. .LFIQ_Addr:
  389. ldr r0,.L5
  390. ldr pc,[r0]
  391. .L1:
  392. .long Undefined_Handler
  393. .L2:
  394. .long SWI_Handler
  395. .L3:
  396. .long Prefetch_Handler
  397. .L4:
  398. .long Abort_Handler
  399. .L5:
  400. .long IRQ_Handler
  401. .L6:
  402. .long FIQ_Handler
  403. _start:
  404. (*
  405. Set absolute stack top
  406. stack is already set by bootloader
  407. but if this point is entered by any
  408. other means than reset, the stack pointer
  409. needs to be set explicity
  410. *)
  411. ldr r0,.L_stack_top
  412. (*
  413. Setting up SP for IRQ and FIQ mode.
  414. Change mode before setting each one
  415. move back again to Supervisor mode
  416. Each interrupt has its own link
  417. register, stack pointer and program
  418. counter The stack pointers must be
  419. initialized for interrupts to be
  420. used later.
  421. *)
  422. (*
  423. setup irq and fiq stacks each 128 bytes
  424. *)
  425. msr cpsr_c, #0x12 // switch to irq mode
  426. mov sp, r0 // set irq stack pointer
  427. sub r0,r0,#128 // irq stack size
  428. msr cpsr_c, #0x11 // fiq mode
  429. mov sp, r0 // set fiq stack pointer
  430. sub r0,r0,#128 // fiq stack size
  431. msr cpsr_c, #0x13 // supervisor mode F,I enabled
  432. mov sp, r0 // stack
  433. ldr r1,.LDefaultHandlerAddr
  434. ldr r0,.L1
  435. str r1,[r0]
  436. ldr r0,.L2
  437. str r1,[r0]
  438. ldr r0,.L3
  439. str r1,[r0]
  440. ldr r0,.L4
  441. str r1,[r0]
  442. ldr r0,.L5
  443. str r1,[r0]
  444. ldr r0,.L6
  445. str r1,[r0]
  446. // copy initialized data from flash to ram
  447. ldr r1,.L_etext
  448. ldr r2,.L_data
  449. ldr r3,.L_edata
  450. .Lcopyloop:
  451. cmp r2,r3
  452. ldrls r0,[r1],#4
  453. strls r0,[r2],#4
  454. bls .Lcopyloop
  455. // clear onboard ram
  456. ldr r1,.L_bss_start
  457. ldr r2,.L_bss_end
  458. mov r0,#0
  459. .Lzeroloop:
  460. cmp r1,r2
  461. strls r0,[r1],#4
  462. bls .Lzeroloop
  463. bl PASCALMAIN
  464. bl _FPC_haltproc
  465. .L_bss_start:
  466. .long _bss_start
  467. .L_bss_end:
  468. .long _bss_end
  469. .L_etext:
  470. .long _etext
  471. .L_data:
  472. .long _data
  473. .L_edata:
  474. .long _edata
  475. .L_stack_top:
  476. .long _stack_top
  477. .LDefaultHandlerAddr:
  478. .long .LDefaultHandler
  479. // default irq handler just returns
  480. .LDefaultHandler:
  481. mov pc,r14
  482. .text
  483. end;
  484. end.