at91sam7x256.pp 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627
  1. unit at91sam7x256;
  2. {$goto on}
  3. interface
  4. type
  5. AT91_REG = DWord;
  6. TBitvector32 = bitpacked array[0..31] of 0..1;
  7. const
  8. // (CKGR)
  9. AT91C_CKGR_DIV = dword($000000FF); // Divider Selected
  10. AT91C_CKGR_MOSCEN = dword($00000001); // Main Oscillator Enable
  11. AT91C_CKGR_MUL = dword($07FF0000); // PLL Multiplier
  12. AT91C_CKGR_OSCOUNT = dword($0000FF00); // Main Oscillator Start-up Time
  13. AT91C_CKGR_OUT_0 = dword($00000000); // Please refer to the PLL datasheet
  14. AT91C_CKGR_PLLCOUNT = dword($00003F00); // PLL Counter
  15. AT91C_MC_FMCN = dword($00FF0000); // (MC) Flash Microsecond Cycle Number
  16. AT91C_MC_FWS_1FWS = dword($00000100);
  17. AT91C_WDTC_WDDIS = dword($00008000);
  18. type
  19. TAT91C_Low_Lewel_Settings = record
  20. osc_div_factor:byte;
  21. osc_mul_factor:word;
  22. end;
  23. var
  24. AT91C_AIC_SMR : array[0..31] of AT91_REG absolute $FFFFF000; // Source Mode Register
  25. AT91C_AIC_SVR : array[0..31] of AT91_REG absolute $FFFFF020; // Source Vector Register
  26. AT91C_AIC_IVR : AT91_REG absolute $FFFFF040; // IRQ Vector Register
  27. AT91C_AIC_FVR : AT91_REG absolute $FFFFF044; // FIQ Vector Register
  28. AT91C_AIC_ISR : AT91_REG absolute $FFFFF048; // Interrupt Status Register
  29. AT91C_AIC_IPR : AT91_REG absolute $FFFFF04C; // Interrupt Pending Register
  30. AT91C_AIC_IMR : AT91_REG absolute $FFFFF050; // Interrupt Mask Register
  31. AT91C_AIC_CISR : AT91_REG absolute $FFFFF054; // Core Interrupt Status Register }
  32. // Reserved0 : array[0..1] of AT91_REG;
  33. AT91C_AIC_IECR : AT91_REG absolute $FFFFF060; // Interrupt Enable Command Register
  34. AT91C_AIC_IDCR : AT91_REG absolute $FFFFF064; // Interrupt Disable Command Register
  35. AT91C_AIC_ICCR : AT91_REG absolute $FFFFF068; // Interrupt Clear Command Register
  36. AT91C_AIC_ISCR : AT91_REG absolute $FFFFF06C; // Interrupt Set Command Register
  37. AT91C_AIC_EOICR : AT91_REG absolute $FFFFF070; // End of Interrupt Command Register
  38. AT91C_AIC_SPU : AT91_REG absolute $FFFFF074; // Spurious Vector Register
  39. AT91C_AIC_DCR : AT91_REG absolute $FFFFF078; // Debug Control Register (Protect) }
  40. // Reserved1 : array[0..0] of AT91_REG;
  41. // ========== Register definition for PIOA peripheral ==========
  42. AT91C_PIOA_IMR : DWord absolute $FFFFF448; // Interrupt Mask Register
  43. AT91C_PIOA_IER : DWord absolute $FFFFF440; // Interrupt Enable Register
  44. AT91C_PIOA_OWDR : DWord absolute $FFFFF4A4; // Output Write Disable Register
  45. AT91C_PIOA_ISR : DWord absolute $FFFFF44C; // Interrupt Status Register
  46. AT91C_PIOA_PPUDR : DWord absolute $FFFFF460; // Pull-up Disable Register
  47. AT91C_PIOA_MDSR : DWord absolute $FFFFF458; // Multi-driver Status Register
  48. AT91C_PIOA_MDER : DWord absolute $FFFFF450; // Multi-driver Enable Register
  49. AT91C_PIOA_PER : DWord absolute $FFFFF400; // PIO Enable Register
  50. AT91C_PIOA_PSR : DWord absolute $FFFFF408; // PIO Status Register
  51. AT91C_PIOA_OER : DWord absolute $FFFFF410; // Output Enable Register
  52. AT91C_PIOA_BSR : DWord absolute $FFFFF474; // Select B Register
  53. AT91C_PIOA_PPUER : DWord absolute $FFFFF464; // Pull-up Enable Register
  54. AT91C_PIOA_MDDR : DWord absolute $FFFFF454; // Multi-driver Disable Register
  55. AT91C_PIOA_PDR : DWord absolute $FFFFF404; // PIO Disable Register
  56. AT91C_PIOA_ODR : DWord absolute $FFFFF414; // Output Disable Registerr
  57. AT91C_PIOA_IFDR : DWord absolute $FFFFF424; // Input Filter Disable Register
  58. AT91C_PIOA_ABSR : DWord absolute $FFFFF478; // AB Select Status Register
  59. AT91C_PIOA_ASR : DWord absolute $FFFFF470; // Select A Register
  60. AT91C_PIOA_PPUSR : DWord absolute $FFFFF468; // Pull-up Status Register
  61. AT91C_PIOA_ODSR : DWord absolute $FFFFF438; // Output Data Status Register
  62. AT91C_PIOA_SODR : DWord absolute $FFFFF430; // Set Output Data Register
  63. AT91C_PIOA_IFSR : DWord absolute $FFFFF428; // Input Filter Status Register
  64. AT91C_PIOA_IFER : DWord absolute $FFFFF420; // Input Filter Enable Register
  65. AT91C_PIOA_OSR : DWord absolute $FFFFF418; // Output Status Register
  66. AT91C_PIOA_IDR : DWord absolute $FFFFF444; // Interrupt Disable Register
  67. AT91C_PIOA_PDSR : DWord absolute $FFFFF43C; // Pin Data Status Register
  68. AT91C_PIOA_CODR : DWord absolute $FFFFF434; // Clear Output Data Register
  69. AT91C_PIOA_OWSR : DWord absolute $FFFFF4A8; // Output Write Status Register
  70. AT91C_PIOA_OWER : DWord absolute $FFFFF4A0; // Output Write Enable Register
  71. // ========== Register definition for PIOB peripheral ==========
  72. AT91C_PIOB_PER : DWord absolute $FFFFF600; // PIO Enable Register
  73. AT91C_PIOB_PDR : DWord absolute $FFFFF604; // PIO Disable Register
  74. AT91C_PIOB_PSR : DWord absolute $FFFFF608; // PIO Status Register
  75. AT91C_PIOB_OER : DWord absolute $FFFFF610; // Output Enable Register
  76. AT91C_PIOB_ODR : DWord absolute $FFFFF614; // Output Disable Registerr
  77. AT91C_PIOB_OSR : DWord absolute $FFFFF618; // Output Status Register
  78. AT91C_PIOB_IFER : DWord absolute $FFFFF620; // Input Filter Enable Register
  79. AT91C_PIOB_IFDR : DWord absolute $FFFFF624; // Input Filter Disable Register
  80. AT91C_PIOB_IFSR : DWord absolute $FFFFF628; // Input Filter Status Register
  81. AT91C_PIOB_SODR : DWord absolute $FFFFF630; // Set Output Data Register
  82. AT91C_PIOB_CODR : DWord absolute $FFFFF634; // Clear Output Data Register
  83. AT91C_PIOB_ODSR : DWord absolute $FFFFF638; // Output Data Status Register
  84. AT91C_PIOB_PDSR : DWord absolute $FFFFF63C; // Pin Data Status Register
  85. AT91C_PIOB_IER : DWord absolute $FFFFF640; // Interrupt Enable Register
  86. AT91C_PIOB_IDR : DWord absolute $FFFFF644; // Interrupt Disable Register
  87. AT91C_PIOB_IMR : DWord absolute $FFFFF648; // Interrupt Mask Register
  88. AT91C_PIOB_ISR : DWord absolute $FFFFF64C; // Interrupt Status Register
  89. AT91C_PIOB_MDER : DWord absolute $FFFFF650; // Multi-driver Enable Register
  90. AT91C_PIOB_MDDR : DWord absolute $FFFFF654; // Multi-driver Disable Register
  91. AT91C_PIOB_MDSR : DWord absolute $FFFFF658; // Multi-driver Status Register
  92. AT91C_PIOB_PPUDR : DWord absolute $FFFFF660; // Pull-up Disable Register
  93. AT91C_PIOB_PPUER : DWord absolute $FFFFF664; // Pull-up Enable Register
  94. AT91C_PIOB_PPUSR : DWord absolute $FFFFF668; // Pull-up Status Register
  95. AT91C_PIOB_ASR : DWord absolute $FFFFF670; // Select A Register
  96. AT91C_PIOB_BSR : DWord absolute $FFFFF674; // Select B Register
  97. AT91C_PIOB_ABSR : DWord absolute $FFFFF678; // AB Select Status Register
  98. AT91C_PIOB_OWER : DWord absolute $FFFFF6A0; // Output Write Enable Register
  99. AT91C_PIOB_OWDR : DWord absolute $FFFFF6A4; // Output Write Disable Register
  100. AT91C_PIOB_OWSR : DWord absolute $FFFFF6A8; // Output Write Status Register
  101. // ========== Register definition for CKGR peripheral ==========
  102. AT91C_CKGR_PLLR : DWord absolute $FFFFFC2C; // PLL Register
  103. AT91C_CKGR_MCFR : DWord absolute $FFFFFC24; // Main Clock Frequency Register
  104. AT91C_CKGR_MOR : DWord absolute $FFFFFC20; // Main Oscillator Register
  105. // ========== Register definition for PMC peripheral ==========
  106. AT91C_PMC_SCSR : DWord absolute $FFFFFC08; // System Clock Status Register
  107. AT91C_PMC_SCER : DWord absolute $FFFFFC00; // System Clock Enable Register
  108. AT91C_PMC_IMR : DWord absolute $FFFFFC6C; // Interrupt Mask Register
  109. AT91C_PMC_IDR : DWord absolute $FFFFFC64; // Interrupt Disable Register
  110. AT91C_PMC_PCDR : DWord absolute $FFFFFC14; // Peripheral Clock Disable Register
  111. AT91C_PMC_SCDR : DWord absolute $FFFFFC04; // System Clock Disable Register
  112. AT91C_PMC_SR : DWord absolute $FFFFFC68; // Status Register
  113. AT91C_PMC_IER : DWord absolute $FFFFFC60; // Interrupt Enable Register
  114. AT91C_PMC_MCKR : DWord absolute $FFFFFC30; // Master Clock Register
  115. AT91C_PMC_MOR : DWord absolute $FFFFFC20; // Main Oscillator Register
  116. AT91C_PMC_PCER : DWord absolute $FFFFFC10; // Peripheral Clock Enable Register
  117. AT91C_PMC_PCSR : DWord absolute $FFFFFC18; // Peripheral Clock Status Register
  118. AT91C_PMC_PLLR : DWord absolute $FFFFFC2C; // PLL Register
  119. AT91C_PMC_MCFR : DWord absolute $FFFFFC24; // Main Clock Frequency Register
  120. AT91C_PMC_PCKR : DWord absolute $FFFFFC40; // Programmable Clock Register
  121. const
  122. AT91C_PMC_CSS_PLL_CLK = dword($3); // (PMC) Clock from PLL is selected
  123. AT91C_PMC_PRES_CLK_2 = dword($1) shl 2; // (PMC) Selected clock divided by 2
  124. AT91C_PMC_MOSCS = dword($1) shl 0; // (PMC) MOSC Status/Enable/Disable/Mask
  125. AT91C_PMC_LOCK = dword($1) shl 2; // (PMC) PLL Status/Enable/Disable/Mask
  126. AT91C_PMC_MCKRDY = dword($1) shl 3; // (PMC) MCK_RDY Status/Enable/Disable/Mask
  127. var
  128. // ========== Register definition for RSTC peripheral ==========
  129. AT91C_RSTC_RSR : DWord absolute $FFFFFD04; // Reset Status Register
  130. AT91C_RSTC_RMR : DWord absolute $FFFFFD08; // Reset Mode Register
  131. AT91C_RSTC_RCR : DWord absolute $FFFFFD00; // Reset Control Register
  132. // ========== Register definition for RTTC peripheral ==========
  133. AT91C_RTTC_RTMR : DWord absolute $FFFFFD20; // Real-time Mode Register
  134. AT91C_RTTC_RTAR : DWord absolute $FFFFFD24; // Real-time Alarm Register
  135. AT91C_RTTC_RTVR : DWord absolute $FFFFFD28; // Real-time Value Register
  136. AT91C_RTTC_RTSR : DWord absolute $FFFFFD2C; // Real-time Status Register
  137. // ========== Register definition for PITC peripheral ==========
  138. AT91C_PITC_PIMR : DWord absolute $FFFFFD30; // Period Interval Mode Register
  139. AT91C_PITC_PISR : DWord absolute $FFFFFD34; // Period Interval Status Register
  140. AT91C_PITC_PIVR : DWord absolute $FFFFFD38; // Period Interval Value Register
  141. AT91C_PITC_PIIR : DWord absolute $FFFFFD3C; // Period Interval Image Register
  142. // ========== Register definition for WDTC peripheral ==========
  143. AT91C_WDTC_WDMR : DWord absolute $FFFFFD44; // Watchdog Mode Register
  144. AT91C_WDTC_WDSR : DWord absolute $FFFFFD48; // Watchdog Status Register
  145. AT91C_WDTC_WDCR : DWord absolute $FFFFFD40; // Watchdog Control Register
  146. // ========== Register definition for VREG peripheral ==========
  147. AT91C_VREG_MR : DWord absolute $FFFFFD60; // Voltage Regulator Mode Register
  148. // ========== Register definition for MC peripheral ==========
  149. AT91C_MC_FCR : DWord absolute $FFFFFF64; // MC Flash Command Register
  150. AT91C_MC_ASR : DWord absolute $FFFFFF04; // MC Abort Status Register
  151. AT91C_MC_FSR : DWord absolute $FFFFFF68; // MC Flash Status Register
  152. AT91C_MC_FMR : DWord absolute $FFFFFF60; // MC Flash Mode Register
  153. AT91C_MC_AASR : DWord absolute $FFFFFF08; // MC Abort Address Status Register
  154. AT91C_MC_RCR : DWord absolute $FFFFFF00; // MC Remap Control Register
  155. // *****************************************************************************
  156. // BASE ADDRESS DEFINITIONS FOR AT91SAM7X256
  157. // *****************************************************************************
  158. AT91C_BASE_SYS : DWord absolute $FFFFF000; // (SYS) Base Address
  159. AT91C_BASE_AIC : DWord absolute $FFFFF000; // (AIC) Base Address
  160. AT91C_BASE_PIOA : DWord absolute $FFFFF400; // (PIOA) Base Address
  161. AT91C_BASE_CKGR : DWord absolute $FFFFFC20; // (CKGR) Base Address
  162. AT91C_BASE_PMC : DWord absolute $FFFFFC00; // (PMC) Base Address
  163. AT91C_BASE_WDTC : DWord absolute $FFFFFD40; // (WDTC) Base Address
  164. AT91C_BASE_VREG : DWord absolute $FFFFFD60; // (VREG) Base Address
  165. AT91C_BASE_MC : DWord absolute $FFFFFF00; // (MC) Base Address
  166. // ========== Peripheral mapping ==========
  167. // ========== Register definition for TC0 peripheral ==========
  168. AT91C_TC0_CCR : DWord absolute $FFFA0000; // Channel Control Register
  169. AT91C_TC0_CMR : DWord absolute $FFFA0004; // Channel Mode Register (Capture Mode / Waveform Mode)
  170. AT91C_TC0_CV : DWord absolute $FFFA0010; // Counter Value
  171. AT91C_TC0_RA : DWord absolute $FFFA0014; // Register A
  172. AT91C_TC0_RB : DWord absolute $FFFA0018; // Register B
  173. AT91C_TC0_RC : DWord absolute $FFFA001C; // Register C
  174. AT91C_TC0_SR : DWord absolute $FFFA0020; // Status Register
  175. AT91C_TC0_IMR : DWord absolute $FFFA002C; // Interrupt Mask Register
  176. AT91C_TC0_IER : DWord absolute $FFFA0024; // Interrupt Enable Register
  177. AT91C_TC0_IDR : DWord absolute $FFFA0028; // Interrupt Disable Register
  178. // ========== Register definition for TC1 peripheral ==========
  179. AT91C_TC1_CCR : DWord absolute $FFFA0040; // Channel Control Register
  180. AT91C_TC1_CMR : DWord absolute $FFFA0044; // Channel Mode Register (Capture Mode / Waveform Mode)
  181. AT91C_TC1_CV : DWord absolute $FFFA0050; // Counter Value
  182. AT91C_TC1_RA : DWord absolute $FFFA0054; // Register A
  183. AT91C_TC1_RB : DWord absolute $FFFA0058; // Register B
  184. AT91C_TC1_RC : DWord absolute $FFFA005C; // Register C
  185. AT91C_TC1_SR : DWord absolute $FFFA0060; // Status Register
  186. AT91C_TC1_IER : DWord absolute $FFFA0064; // Interrupt Enable Register
  187. AT91C_TC1_IDR : DWord absolute $FFFA0068; // Interrupt Disable Register
  188. AT91C_TC1_IMR : DWord absolute $FFFA006C; // Interrupt Mask Register
  189. // ========== Register definition for TC2 peripheral ==========
  190. AT91C_TC2_CCR : DWord absolute $FFFA0080; // Channel Control Register
  191. AT91C_TC2_CMR : DWord absolute $FFFA0084; // Channel Mode Register (Capture Mode / Waveform Mode;
  192. AT91C_TC2_CV : DWord absolute $FFFA0090; // Counter Value
  193. AT91C_TC2_RA : DWord absolute $FFFA0094; // Register A
  194. AT91C_TC2_RB : DWord absolute $FFFA0098; // Register B
  195. AT91C_TC2_RC : DWord absolute $FFFA009C; // Register C
  196. AT91C_TC2_SR : DWord absolute $FFFA00A0; // Status Register
  197. AT91C_TC2_IER : DWord absolute $FFFA00A4; // Interrupt Enable Register
  198. AT91C_TC2_IDR : DWord absolute $FFFA00A8; // Interrupt Disable Register
  199. AT91C_TC2_IMR : DWord absolute $FFFA00AC; // Interrupt Mask Register
  200. // ========== Register definition for TCB peripheral ==========
  201. AT91C_TCB_BCR : DWord absolute $FFFA00C0; // TC Block Control Register
  202. AT91C_TCB_BMR : DWord absolute $FFFA00C4; // TC Block Mode Register
  203. // ========== Register definition for UDP peripheral ==========
  204. AT91C_UDP_NUM : DWord absolute $FFFB0000; // Frame Number Register
  205. AT91C_UDP_GLBSTATE : DWord absolute $FFFB0004; // Global State Register
  206. AT91C_UDP_FADDR : DWord absolute $FFFB0008; // Function Address Register
  207. AT91C_UDP_IER : DWord absolute $FFFB0010; // Interrupt Enable Register
  208. AT91C_UDP_IDR : DWord absolute $FFFB0014; // Interrupt Disable Register
  209. AT91C_UDP_IMR : DWord absolute $FFFB0018; // Interrupt Mask Register
  210. AT91C_UDP_ISR : DWord absolute $FFFB001C; // Interrupt Status Register
  211. AT91C_UDP_ICR : DWord absolute $FFFB0020; // Interrupt Clear Register
  212. AT91C_UDP_RSTEP : DWord absolute $FFFB0028; // Reset Endpoint Register
  213. AT91C_UDP_CSR : DWord absolute $FFFB0030; // Endpoint Control and Status Register
  214. AT91C_UDP_FDR : DWord absolute $FFFB0050; // Endpoint FIFO Data Register
  215. AT91C_UDP_TXVC : DWord absolute $FFFB0074; // Transceiver Control Register
  216. // ========== Register definition for TWI peripheral ==========
  217. AT91C_TWI_CR : DWord absolute $FFFB8000; // Control Register
  218. AT91C_TWI_MMR : DWord absolute $FFFB8004; // Master Mode Register
  219. AT91C_TWI_IADR : DWord absolute $FFFB800C; // Internal Address Register
  220. AT91C_TWI_CWGR : DWord absolute $FFFB8010; // Clock Waveform Generator Register
  221. AT91C_TWI_SR : DWord absolute $FFFB8020; // Status Register
  222. AT91C_TWI_IER : DWord absolute $FFFB8024; // Interrupt Enable Register
  223. AT91C_TWI_IDR : DWord absolute $FFFB8028; // Interrupt Disable Register
  224. AT91C_TWI_IMR : DWord absolute $FFFB802C; // Interrupt Mask Register
  225. AT91C_TWI_RHR : DWord absolute $FFFB8030; // Receive Holding Register
  226. AT91C_TWI_THR : DWord absolute $FFFB8034; // Transmit Holding Register
  227. // ========== Register definition for US0 peripheral ==========
  228. AT91C_US0_CR : DWord absolute $FFFC0000; // Control Register
  229. AT91C_US0_MR : DWord absolute $FFFC0004; // Mode Register
  230. AT91C_US0_IER : DWord absolute $FFFC0008; // Interrupt Enable Register
  231. AT91C_US0_IDR : DWord absolute $FFFC000C; // Interrupt Disable Register
  232. AT91C_US0_IMR : DWord absolute $FFFC0010; // Interrupt Mask Register
  233. AT91C_US0_CSR : DWord absolute $FFFC0014; // Channel Status Register
  234. AT91C_US0_RHR : DWord absolute $FFFC0018; // Receiver Holding Register
  235. AT91C_US0_THR : DWord absolute $FFFC001C; // Transmitter Holding Register
  236. AT91C_US0_BRGR : DWord absolute $FFFC0020; // Baud Rate Generator Register
  237. AT91C_US0_RTOR : DWord absolute $FFFC0024; // Receiver Time-out Register
  238. AT91C_US0_TTGR : DWord absolute $FFFC0028; // Transmitter Time-guard Register
  239. AT91C_US0_FIDI : DWord absolute $FFFC0040; // FI_DI_Ratio Register
  240. AT91C_US0_NER : DWord absolute $FFFC0044; // Nb Errors Register
  241. AT91C_US0_IF : DWord absolute $FFFC004C; // IRDA_FILTER Register
  242. // ========== Register definition for PDC_US0 peripheral ==========
  243. AT91C_US0_RPR : DWord absolute $FFFC0100; // Receive Pointer Register
  244. AT91C_US0_RCR : DWord absolute $FFFC0104; // Receive Counter Register
  245. AT91C_US0_TPR : DWord absolute $FFFC0108; // Transmit Pointer Register
  246. AT91C_US0_TCR : DWord absolute $FFFC010C; // Transmit Counter Register
  247. AT91C_US0_RNPR : DWord absolute $FFFC0110; // Receive Next Pointer Register
  248. AT91C_US0_RNCR : DWord absolute $FFFC0114; // Receive Next Counter Register
  249. AT91C_US0_TNPR : DWord absolute $FFFC0118; // Transmit Next Pointer Register
  250. AT91C_US0_TNCR : DWord absolute $FFFC011C; // Transmit Next Counter Register
  251. AT91C_US0_PTCR : DWord absolute $FFFC0120; // PDC Transfer Control Register
  252. AT91C_US0_PTSR : DWord absolute $FFFC0124; // PDC Transfer Status Register
  253. // ========== Register definition for US1 peripheral ==========
  254. AT91C_US1_CR : DWord absolute $FFFC4000; // Control Register
  255. AT91C_US1_MR : DWord absolute $FFFC4004; // Mode Register
  256. AT91C_US1_IER : DWord absolute $FFFC4008; // Interrupt Enable Register
  257. AT91C_US1_IDR : DWord absolute $FFFC400C; // Interrupt Disable Register
  258. AT91C_US1_IMR : DWord absolute $FFFC4010; // Interrupt Mask Register
  259. AT91C_US1_CSR : DWord absolute $FFFC4014; // Channel Status Register
  260. AT91C_US1_THR : DWord absolute $FFFC401C; // Transmitter Holding Register
  261. AT91C_US1_RHR : DWord absolute $FFFC4018; // Receiver Holding Register
  262. AT91C_US1_BRGR : DWord absolute $FFFC4020; // Baud Rate Generator Register
  263. AT91C_US1_RTOR : DWord absolute $FFFC4024; // Receiver Time-out Register
  264. AT91C_US1_TTGR : DWord absolute $FFFC4028; // Transmitter Time-guard Register
  265. AT91C_US1_FIDI : DWord absolute $FFFC4040; // FI_DI_Ratio Register
  266. AT91C_US1_NER : DWord absolute $FFFC4044; // Nb Errors Register
  267. AT91C_US1_IF : DWord absolute $FFFC404C; // IRDA_FILTER Register
  268. // ========== Register definition for PDC_US1 peripheral ==========
  269. AT91C_US1_RPR : DWord absolute $FFFC4100; // Receive Pointer Register
  270. AT91C_US1_RCR : DWord absolute $FFFC4104; // Receive Counter Register
  271. AT91C_US1_TPR : DWord absolute $FFFC4108; // Transmit Pointer Register
  272. AT91C_US1_TCR : DWord absolute $FFFC410C; // Transmit Counter Register
  273. AT91C_US1_RNPR : DWord absolute $FFFC4110; // Receive Next Pointer Register
  274. AT91C_US1_RNCR : DWord absolute $FFFC4114; // Receive Next Counter Register
  275. AT91C_US1_TNPR : DWord absolute $FFFC4118; // Transmit Next Pointer Register
  276. AT91C_US1_TNCR : DWord absolute $FFFC411C; // Transmit Next Counter Register
  277. AT91C_US1_PTCR : DWord absolute $FFFC4120; // PDC Transfer Control Register
  278. AT91C_US1_PTSR : DWord absolute $FFFC4124; // PDC Transfer Status Register
  279. // ========== Register definition for PWMC peripheral ==========
  280. AT91C_PWMC_MR : DWord absolute $FFFCC000; // PWMC Mode Register
  281. AT91C_PWMC_ENA : DWord absolute $FFFCC004; // PWMC Enable Register
  282. AT91C_PWMC_DIS : DWord absolute $FFFCC008; // PWMC Disable Register
  283. AT91C_PWMC_SR : DWord absolute $FFFCC00C; // PWMC Status Register
  284. AT91C_PWMC_IER : DWord absolute $FFFCC010; // PWMC Interrupt Enable Register
  285. AT91C_PWMC_ISR : DWord absolute $FFFCC01C; // PWMC Interrupt Status Register
  286. AT91C_PWMC_IDR : DWord absolute $FFFCC014; // PWMC Interrupt Disable Register
  287. AT91C_PWMC_IMR : DWord absolute $FFFCC018; // PWMC Interrupt Mask Register
  288. AT91C_PWMC_VR : DWord absolute $FFFCC0FC; // PWMC Version Register
  289. // ========== Register definition for PWMC_CH0 peripheral ==========
  290. AT91C_PWMC_CH0_CMR : DWord absolute $FFFCC200; // Channel Mode Register
  291. AT91C_PWMC_CH0_CDTYR : DWord absolute $FFFCC204; // Channel Duty Cycle Register
  292. AT91C_PWMC_CH0_CPRDR : DWord absolute $FFFCC208; // Channel Period Register
  293. AT91C_PWMC_CH0_CCNTR : DWord absolute $FFFCC20C; // Channel Counter Register
  294. AT91C_PWMC_CH0_CUPDR : DWord absolute $FFFCC210; // Channel Update Register
  295. // ========== Register definition for PWMC_CH1 peripheral ==========
  296. AT91C_PWMC_CH1_CMR : DWord absolute $FFFCC220; // Channel Mode Register
  297. AT91C_PWMC_CH1_CDTYR : DWord absolute $FFFCC224; // Channel Duty Cycle Register
  298. AT91C_PWMC_CH1_CPRDR : DWord absolute $FFFCC228; // Channel Period Register
  299. AT91C_PWMC_CH1_CCNTR : DWord absolute $FFFCC22C; // Channel Counter Register
  300. AT91C_PWMC_CH1_CUPDR : DWord absolute $FFFCC230; // Channel Update Register
  301. // ========== Register definition for PWMC_CH2 peripheral ==========
  302. AT91C_PWMC_CH2_CMR : DWord absolute $FFFCC240; // Channel Mode Register
  303. AT91C_PWMC_CH2_CDTYR : DWord absolute $FFFCC244; // Channel Duty Cycle Register
  304. AT91C_PWMC_CH2_CPRDR : DWord absolute $FFFCC248; // Channel Period Register
  305. AT91C_PWMC_CH2_CCNTR : DWord absolute $FFFCC24C; // Channel Counter Register
  306. AT91C_PWMC_CH2_CUPDR : DWord absolute $FFFCC250; // Channel Update Register
  307. // ========== Register definition for PWMC_CH3 peripheral ==========
  308. AT91C_PWMC_CH3_CMR : DWord absolute $FFFCC260; // Channel Mode Register
  309. AT91C_PWMC_CH3_CDTYR : DWord absolute $FFFCC264; // Channel Duty Cycle Register
  310. AT91C_PWMC_CH3_CPRDR : DWord absolute $FFFCC268; // Channel Period Register
  311. AT91C_PWMC_CH3_CCNTR : DWord absolute $FFFCC26C; // Channel Counter Register
  312. AT91C_PWMC_CH3_CUPDR : DWord absolute $FFFCC270; // Channel Update Register
  313. // ========== Register definition for ADC peripheral ==========
  314. AT91C_ADC_CR : DWord absolute $FFFD8000; // ADC Control Register
  315. AT91C_ADC_MR : DWord absolute $FFFD8004; // ADC Mode Register
  316. AT91C_ADC_CHER : DWord absolute $FFFD8010; // ADC Channel Enable Register
  317. AT91C_ADC_CHDR : DWord absolute $FFFD8014; // ADC Channel Disable Register
  318. AT91C_ADC_CHSR : DWord absolute $FFFD8018; // ADC Channel Status Register
  319. AT91C_ADC_SR : DWord absolute $FFFD801C; // ADC Status Register
  320. AT91C_ADC_LCDR : DWord absolute $FFFD8020; // ADC Last Converted Data Register
  321. AT91C_ADC_IER : DWord absolute $FFFD8024; // ADC Interrupt Enable Register
  322. AT91C_ADC_IDR : DWord absolute $FFFD8028; // ADC Interrupt Disable Register
  323. AT91C_ADC_IMR : DWord absolute $FFFD802C; // ADC Interrupt Mask Register
  324. AT91C_ADC_CDR0 : DWord absolute $FFFD8030; // ADC Channel Data Register 0
  325. AT91C_ADC_CDR1 : DWord absolute $FFFD8034; // ADC Channel Data Register 1
  326. AT91C_ADC_CDR2 : DWord absolute $FFFD8038; // ADC Channel Data Register 2
  327. AT91C_ADC_CDR3 : DWord absolute $FFFD803C; // ADC Channel Data Register 3
  328. AT91C_ADC_CDR4 : DWord absolute $FFFD8040; // ADC Channel Data Register 4
  329. AT91C_ADC_CDR5 : DWord absolute $FFFD8044; // ADC Channel Data Register 5
  330. AT91C_ADC_CDR6 : DWord absolute $FFFD8048; // ADC Channel Data Register 6
  331. AT91C_ADC_CDR7 : DWord absolute $FFFD804C; // ADC Channel Data Register 7
  332. // ========== Register definition for PDC_ADC peripheral ==========
  333. AT91C_ADC_RPR : DWord absolute $FFFD8100; // Receive Pointer Register
  334. AT91C_ADC_RCR : DWord absolute $FFFD8104; // Receive Counter Register
  335. AT91C_ADC_TPR : DWord absolute $FFFD8108; // Transmit Pointer Register
  336. AT91C_ADC_TCR : DWord absolute $FFFD810C; // Transmit Counter Register
  337. AT91C_ADC_RNPR : DWord absolute $FFFD8110; // Receive Next Pointer Register
  338. AT91C_ADC_RNCR : DWord absolute $FFFD8114; // Receive Next Counter Register
  339. AT91C_ADC_TNPR : DWord absolute $FFFD8118; // Transmit Next Pointer Register
  340. AT91C_ADC_TNCR : DWord absolute $FFFD811C; // Transmit Next Counter Register
  341. AT91C_ADC_PTCR : DWord absolute $FFFD8120; // PDC Transfer Control Register
  342. AT91C_ADC_PTSR : DWord absolute $FFFD8124; // PDC Transfer Status Register
  343. procedure lowlevelinit(LowLewelValues:TAT91C_Low_Lewel_Settings);
  344. var
  345. Undefined_Handler,
  346. SWI_Handler,
  347. Prefetch_Handler,
  348. Abort_Handler,
  349. IRQ_Handler,
  350. FIQ_Handler : pointer;
  351. implementation
  352. procedure AT91F_Default_FIQ_handler; assembler; nostackframe; public name 'AT91F_Default_FIQ_handler';
  353. asm
  354. .Lloop:
  355. b .Lloop
  356. end;
  357. procedure AT91F_Default_IRQ_handler; assembler; nostackframe; public name 'AT91F_Default_IRQ_handler';
  358. asm
  359. .Lloop:
  360. b .Lloop
  361. end;
  362. procedure AT91F_Spurious_handler; assembler; nostackframe; public name 'AT91F_Spurious_handler';
  363. asm
  364. .Lloop:
  365. b .Lloop
  366. end;
  367. { Basic hardware initialization
  368. Note: see page 5 - 6 of Atmel's
  369. "Getting Started with AT91SAM7X Microcontrollers" for details.}
  370. procedure lowlevelinit(LowLewelValues:TAT91C_Low_Lewel_Settings);
  371. var
  372. i : Longint;
  373. begin
  374. { Set Flash Wait state (AT91C_MC_FMR = MC Flash Mode Register)}
  375. AT91C_MC_FMR := ((AT91C_MC_FMCN) and (50*$10000)) or AT91C_MC_FWS_1FWS;
  376. { Watchdog Disable (AT91C_WDTC_WDMR = Watchdog Mode Register)}
  377. AT91C_WDTC_WDMR := AT91C_WDTC_WDDIS;
  378. {Enable the Main Oscillator (AT91C_PMC_MOR = Main Oscillator Register)}
  379. AT91C_PMC_MOR := (( AT91C_CKGR_OSCOUNT and ($0800) or AT91C_CKGR_MOSCEN ));
  380. { Wait the startup time (until PMC Status register MOSCEN bit is set)
  381. result: $FFFFFC68 bit 0 will set when main oscillator has stabilized}
  382. while (AT91C_PMC_SR and AT91C_PMC_MOSCS)=0 do
  383. ;
  384. { PMC Clock Generator PLL Register setup }
  385. AT91C_PMC_PLLR :=((AT91C_CKGR_OUT_0) or
  386. (AT91C_CKGR_DIV and LowLewelValues.osc_div_factor) or
  387. (AT91C_CKGR_PLLCOUNT and (40 shl 10)) or
  388. (AT91C_CKGR_MUL and (LowLewelValues.osc_mul_factor shl 16)));
  389. { Wait the startup time (until PMC Status register LOCK bit is set)
  390. result: 0xFFFFFC68 bit 2 will set when PLL has locked }
  391. while (AT91C_PMC_SR and AT91C_PMC_LOCK)=0 do
  392. ;
  393. { PMC Master Clock Register setup (AT91C_PMC_MCKR = Master Clock Register)}
  394. AT91C_PMC_MCKR := AT91C_PMC_PRES_CLK_2;
  395. { Wait the startup time (until PMC Status register MCKRDY bit is set)
  396. result: $FFFFFC68 bit 3 will set when Master Clock has stabilized }
  397. while (AT91C_PMC_SR and AT91C_PMC_MCKRDY)=0 do
  398. ;
  399. {(AT91C_PMC_MCKR = Master Clock Register) }
  400. AT91C_PMC_MCKR := AT91C_PMC_MCKR or AT91C_PMC_CSS_PLL_CLK;
  401. { Wait the startup time (until PMC Status register MCKRDY bit is set)
  402. result: $FFFFFC68 bit 3 will set when Master Clock has stabilized }
  403. while (AT91C_PMC_SR and AT91C_PMC_MCKRDY)=0 do
  404. ;
  405. { Set up the default interrupts handler vectors }
  406. AT91C_AIC_SVR[0]:=AT91_REG(@AT91F_Default_FIQ_handler);
  407. for i:=1 to 30 do
  408. AT91C_AIC_SVR[i]:=AT91_REG(@AT91F_Default_IRQ_handler);
  409. AT91C_AIC_SPU:=AT91_REG(@AT91F_Spurious_handler);
  410. end;
  411. procedure PASCALMAIN; external name 'PASCALMAIN';
  412. procedure _FPC_haltproc; assembler; nostackframe; public name '_haltproc';
  413. asm
  414. .Lhalt:
  415. b .Lhalt
  416. end;
  417. var
  418. _data: record end; external name '_data';
  419. _edata: record end; external name '_edata';
  420. _etext: record end; external name '_etext';
  421. _bss_start: record end; external name '_bss_start';
  422. _bss_end: record end; external name '_bss_end';
  423. _stack_top: record end; external name '_stack_top';
  424. procedure _FPC_start; assembler; nostackframe;
  425. label
  426. _start;
  427. asm
  428. .init
  429. .align 16
  430. .globl _start
  431. b _start
  432. b .LUndefined_Addr // Undefined Instruction vector
  433. b .LSWI_Addr // Software Interrupt vector
  434. b .LPrefetch_Addr // Prefetch abort vector
  435. b .LAbort_Addr // Data abort vector
  436. nop // reserved
  437. b .LIRQ_Addr // Interrupt Request (IRQ) vector
  438. b .LFIQ_Addr // Fast interrupt request (FIQ) vector
  439. .LUndefined_Addr:
  440. ldr r0,.L1
  441. ldr pc,[r0]
  442. .LSWI_Addr:
  443. ldr r0,.L2
  444. ldr pc,[r0]
  445. .LPrefetch_Addr:
  446. ldr r0,.L3
  447. ldr pc,[r0]
  448. .LAbort_Addr:
  449. ldr r0,.L4
  450. ldr pc,[r0]
  451. .LIRQ_Addr:
  452. ldr r0,.L5
  453. ldr pc,[r0]
  454. .LFIQ_Addr:
  455. ldr r0,.L5
  456. ldr pc,[r0]
  457. .L1:
  458. .long Undefined_Handler
  459. .L2:
  460. .long SWI_Handler
  461. .L3:
  462. .long Prefetch_Handler
  463. .L4:
  464. .long Abort_Handler
  465. .L5:
  466. .long IRQ_Handler
  467. .L6:
  468. .long FIQ_Handler
  469. _start:
  470. (*
  471. Set absolute stack top
  472. stack is already set by bootloader
  473. but if this point is entered by any
  474. other means than reset, the stack pointer
  475. needs to be set explicity
  476. *)
  477. ldr r0,.L_stack_top
  478. (*
  479. Setting up SP for the different CPU modes.
  480. Change mode before setting each one
  481. move back again to Supervisor mode
  482. Each interrupt has its own link
  483. register, stack pointer and program
  484. counter The stack pointers must be
  485. initialized for interrupts to be
  486. used later.
  487. *)
  488. msr cpsr_c, #0xdb // switch to Undefined Instruction Mode
  489. mov sp, r0
  490. sub r0, r0, #0x10
  491. msr cpsr_c, #0xd7 // switch to Abort Mode
  492. mov sp, r0
  493. sub r0, r0, #0x10
  494. msr CPSR_c, #0xd1 // switch to FIQ Mode
  495. mov sp, r0
  496. sub r0, r0, #0x80
  497. msr CPSR_c, #0xd2 // switch to IRQ Mode
  498. mov sp, r0
  499. sub r0, r0, #0x80
  500. msr CPSR_c, #0xd3 // switch to Supervisor Mode
  501. mov sp, r0
  502. sub r0, r0, #0x80
  503. msr CPSR_c, #0x1f // switch to System Mode, interrupts enabled
  504. mov sp, r0
  505. // for now, all handlers are set to a default one
  506. ldr r1,.LDefaultHandlerAddr
  507. ldr r0,.L1
  508. str r1,[r0]
  509. ldr r0,.L2
  510. str r1,[r0]
  511. ldr r0,.L3
  512. str r1,[r0]
  513. ldr r0,.L4
  514. str r1,[r0]
  515. ldr r0,.L5
  516. str r1,[r0]
  517. ldr r0,.L6
  518. str r1,[r0]
  519. // copy initialized data from flash to ram
  520. ldr r1,.L_etext
  521. ldr r2,.L_data
  522. ldr r3,.L_edata
  523. .Lcopyloop:
  524. cmp r2,r3
  525. ldrls r0,[r1],#4
  526. strls r0,[r2],#4
  527. bls .Lcopyloop
  528. // clear onboard ram
  529. ldr r1,.L_bss_start
  530. ldr r2,.L_bss_end
  531. mov r0,#0
  532. .Lzeroloop:
  533. cmp r1,r2
  534. strls r0,[r1],#4
  535. bls .Lzeroloop
  536. bl PASCALMAIN
  537. bl _FPC_haltproc
  538. .L_bss_start:
  539. .long _bss_start
  540. .L_bss_end:
  541. .long _bss_end
  542. .L_etext:
  543. .long _etext
  544. .L_data:
  545. .long _data
  546. .L_edata:
  547. .long _edata
  548. .L_stack_top:
  549. .long _stack_top
  550. .LDefaultHandlerAddr:
  551. .long .LDefaultHandler
  552. // default irq handler just returns
  553. .LDefaultHandler:
  554. mov pc,r14
  555. .text
  556. end;
  557. end.
  558. end.