PageRenderTime 54ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 0ms

/Software/Testing/outeradc/code/asf/xmega/services/basic/clock/validation/zephyr_tripoli/osc.h

https://github.com/osuar/iarc
C Header | 429 lines | 228 code | 28 blank | 173 comment | 10 complexity | c75ba2dbd98dc587786da439269fbf02 MD5 | raw file
  1. /**
  2. * \file
  3. *
  4. * \brief Chip-specific oscillator management functions
  5. *
  6. * Copyright (C) 2010 Atmel Corporation. All rights reserved.
  7. *
  8. * \page License
  9. *
  10. * Redistribution and use in source and binary forms, with or without
  11. * modification, are permitted provided that the following conditions are met:
  12. *
  13. * 1. Redistributions of source code must retain the above copyright notice,
  14. * this list of conditions and the following disclaimer.
  15. *
  16. * 2. Redistributions in binary form must reproduce the above copyright notice,
  17. * this list of conditions and the following disclaimer in the documentation
  18. * and/or other materials provided with the distribution.
  19. *
  20. * 3. The name of Atmel may not be used to endorse or promote products derived
  21. * from this software without specific prior written permission.
  22. *
  23. * 4. This software may only be redistributed and used in connection with an
  24. * Atmel AVR product.
  25. *
  26. * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
  27. * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  28. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
  29. * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
  30. * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  31. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  32. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  33. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  34. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  35. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  36. * DAMAGE.
  37. */
  38. #ifndef CHIP_OSC_H_INCLUDED
  39. #define CHIP_OSC_H_INCLUDED
  40. #include <board.h>
  41. /**
  42. * \weakgroup osc_group
  43. * @{
  44. */
  45. //! \name Oscillator identifiers
  46. //@{
  47. #define OSC_ID_OSC0 0 //!< External Oscillator 0
  48. #define OSC_ID_OSC1 1 //!< External Oscillator 1
  49. #define OSC_ID_OSC32 2 //!< External 32 kHz oscillator
  50. //@}
  51. //! \name OSC0/OSC1 mode values
  52. //@{
  53. //! External clock connected to XIN
  54. #define OSC_MODE_EXTERNAL AVR32_PM_MODE_EXT_CLOCK
  55. //! Crystal connected to XIN/XOUT. Use oscillator gain G0 (400 kHz to 900 kHz)
  56. #define OSC_MODE_XTAL_G0 AVR32_PM_MODE_CRYSTAL_G0
  57. //! Crystal connected to XIN/XOUT. Use oscillator gain G1 (900 kHz to 3 MHz)
  58. #define OSC_MODE_XTAL_G1 AVR32_PM_MODE_CRYSTAL_G1
  59. //! Crystal connected to XIN/XOUT. Use oscillator gain G2 (3 MHz to 8 MHz)
  60. #define OSC_MODE_XTAL_G2 AVR32_PM_MODE_CRYSTAL_G2
  61. //! Crystal connected to XIN/XOUT. Use oscillator gain G3 (8 MHz and higher)
  62. #define OSC_MODE_XTAL_G3 AVR32_PM_MODE_CRYSTAL_G3
  63. //@}
  64. //! \name OSC32 mode values
  65. //@{
  66. //! External clock connected to XIN32
  67. #define OSC32_MODE_EXTERNAL AVR32_PM_OSCCTRL32_MODE_EXT_CLOCK
  68. //! Crystal connected to XIN32/XOUT32. Use automatic gain control
  69. #define OSC32_MODE_XTAL AVR32_PM_OSCCTRL32_MODE_CRYSTAL
  70. //@}
  71. //! \name OSC0/OSC1 startup values
  72. //@{
  73. //! 0 cycles
  74. #define OSC_STARTUP_0 AVR32_PM_OSCCTRL0_STARTUP_0_RCOSC
  75. //! 64 cycles (560 us)
  76. #define OSC_STARTUP_64 AVR32_PM_OSCCTRL0_STARTUP_64_RCOSC
  77. //! 128 cycles (1.1 ms)
  78. #define OSC_STARTUP_128 AVR32_PM_OSCCTRL0_STARTUP_128_RCOSC
  79. //! 2048 cycles (18 ms)
  80. #define OSC_STARTUP_2048 AVR32_PM_OSCCTRL0_STARTUP_2048_RCOSC
  81. //! 4096 cycles (36 ms)
  82. #define OSC_STARTUP_4096 AVR32_PM_OSCCTRL0_STARTUP_4096_RCOSC
  83. //! 8192 cycles (71 ms)
  84. #define OSC_STARTUP_8192 AVR32_PM_OSCCTRL0_STARTUP_8192_RCOSC
  85. //! 16384 cycles (142 ms)
  86. #define OSC_STARTUP_16384 AVR32_PM_OSCCTRL0_STARTUP_16384_RCOSC
  87. //@}
  88. //! \name OSC32 startup values
  89. //@{
  90. //! 0 cycles
  91. #define OSC32_STARTUP_0 AVR32_PM_OSCCTRL32_STARTUP_0_RCOSC
  92. //! 128 cycles (1.1 ms)
  93. #define OSC32_STARTUP_128 AVR32_PM_OSCCTRL32_STARTUP_128_RCOSC
  94. //! 8192 cycles (72.3 ms)
  95. #define OSC32_STARTUP_8192 AVR32_PM_OSCCTRL32_STARTUP_8192_RCOSC
  96. //! 16384 cycles (143 ms)
  97. #define OSC32_STARTUP_16384 AVR32_PM_OSCCTRL32_STARTUP_16384_RCOSC
  98. //! 65536 cycles (570 ms)
  99. #define OSC32_STARTUP_65536 AVR32_PM_OSCCTRL32_STARTUP_65536_RCOSC
  100. //! 131072 cycles (1.1 s)
  101. #define OSC32_STARTUP_131072 AVR32_PM_OSCCTRL32_STARTUP_131072_RCOSC
  102. //! 262144 cycles (2.3 s)
  103. #define OSC32_STARTUP_262144 AVR32_PM_OSCCTRL32_STARTUP_262144_RCOSC
  104. //! 524288 cycles (4.6 s)
  105. #define OSC32_STARTUP_524288 AVR32_PM_OSCCTRL32_STARTUP_524288_RCOSC
  106. //@}
  107. /**
  108. * \def OSC0_STARTUP_TIMEOUT
  109. * \brief Number of slow clock cycles to wait for OSC0 to start
  110. *
  111. * This is the number of slow clock cycles corresponding to
  112. * OSC0_STARTUP_VALUE with an additional 25% safety margin. If the
  113. * oscillator isn't running when this timeout has expired, it is assumed
  114. * to have failed to start.
  115. */
  116. /**
  117. * \def OSC0_MODE_VALUE
  118. * \brief Board-dependent value written to the MODE bitfield of
  119. * PM_OSCCTRL(0)
  120. */
  121. /**
  122. * \def OSC0_STARTUP_VALUE
  123. * \brief Board-dependent value written to the STARTUP bitfield of
  124. * PM_OSCCTRL(0)
  125. */
  126. #if defined(BOARD_OSC0_STARTUP_US)
  127. # if BOARD_OSC0_STARTUP_US == 0
  128. # define OSC0_STARTUP_VALUE OSC_STARTUP_0
  129. # define OSC0_STARTUP_TIMEOUT 8
  130. # elif BOARD_OSC0_STARTUP_US <= 560
  131. # define OSC0_STARTUP_VALUE OSC_STARTUP_64
  132. # define OSC0_STARTUP_TIMEOUT 80
  133. # elif BOARD_OSC0_STARTUP_US <= 1100
  134. # define OSC0_STARTUP_VALUE OSC_STARTUP_128
  135. # define OSC0_STARTUP_TIMEOUT 160
  136. # elif BOARD_OSC0_STARTUP_US <= 18000
  137. # define OSC0_STARTUP_VALUE OSC_STARTUP_2048
  138. # define OSC0_STARTUP_TIMEOUT 2560
  139. # elif BOARD_OSC0_STARTUP_US <= 36000
  140. # define OSC0_STARTUP_VALUE OSC_STARTUP_4096
  141. # define OSC0_STARTUP_TIMEOUT 5120
  142. # elif BOARD_OSC0_STARTUP_US <= 71000
  143. # define OSC0_STARTUP_VALUE OSC_STARTUP_8192
  144. # define OSC0_STARTUP_TIMEOUT 10240
  145. # elif BOARD_OSC0_STARTUP_US <= 142000
  146. # define OSC0_STARTUP_VALUE OSC_STARTUP_16384
  147. # define OSC0_STARTUP_TIMEOUT 20480
  148. # else
  149. # error BOARD_OSC0_STARTUP_US is too high
  150. # endif
  151. # if BOARD_OSC0_IS_XTAL == true
  152. # if BOARD_OSC0_HZ < 900000
  153. # define OSC0_MODE_VALUE OSC_MODE_XTAL_G0
  154. # elif BOARD_OSC0_HZ < 3000000
  155. # define OSC0_MODE_VALUE OSC_MODE_XTAL_G1
  156. # elif BOARD_OSC0_HZ < 8000000
  157. # define OSC0_MODE_VALUE OSC_MODE_XTAL_G2
  158. # else
  159. # define OSC0_MODE_VALUE OSC_MODE_XTAL_G3
  160. # endif
  161. # else
  162. # define OSC0_MODE_VALUE OSC_MODE_EXTERNAL
  163. # endif
  164. #else
  165. # ifdef BOARD_OSC0_HZ
  166. # error BOARD_OSC0_STARTUP_US must be defined by the board code
  167. # endif
  168. # ifdef __DOXYGEN__
  169. # define OSC0_STARTUP_VALUE UNDEFINED
  170. # define OSC0_STARTUP_TIMEOUT UNDEFINED
  171. # define OSC0_MODE_VALUE UNDEFINED
  172. # endif
  173. #endif
  174. /**
  175. * \def OSC1_STARTUP_VALUE
  176. * \brief Board-dependent value written to the STARTUP bitfield of
  177. * PM_OSCCTRL(1)
  178. */
  179. /**
  180. * \def OSC1_STARTUP_TIMEOUT
  181. * \brief Number of slow clock cycles to wait for OSC1 to start
  182. *
  183. * This is the number of slow clock cycles corresponding to
  184. * OSC1_STARTUP_VALUE with an additional 25% safety margin. If the
  185. * oscillator isn't running when this timeout has expired, it is assumed
  186. * to have failed to start.
  187. */
  188. /**
  189. * \def OSC1_MODE_VALUE
  190. * \brief Board-dependent value written to the MODE bitfield of
  191. * PM_OSCCTRL(1)
  192. */
  193. #if defined(BOARD_OSC1_STARTUP_US)
  194. # if BOARD_OSC1_STARTUP_US == 0
  195. # define OSC1_STARTUP_VALUE OSC_STARTUP_0
  196. # define OSC1_STARTUP_TIMEOUT 8
  197. # elif BOARD_OSC1_STARTUP_US <= 560
  198. # define OSC1_STARTUP_VALUE OSC_STARTUP_64
  199. # define OSC1_STARTUP_TIMEOUT 80
  200. # elif BOARD_OSC1_STARTUP_US <= 1100
  201. # define OSC1_STARTUP_VALUE OSC_STARTUP_128
  202. # define OSC1_STARTUP_TIMEOUT 160
  203. # elif BOARD_OSC1_STARTUP_US <= 18000
  204. # define OSC1_STARTUP_VALUE OSC_STARTUP_2048
  205. # define OSC1_STARTUP_TIMEOUT 2560
  206. # elif BOARD_OSC1_STARTUP_US <= 36000
  207. # define OSC1_STARTUP_VALUE OSC_STARTUP_4096
  208. # define OSC1_STARTUP_TIMEOUT 5120
  209. # elif BOARD_OSC1_STARTUP_US <= 71000
  210. # define OSC1_STARTUP_VALUE OSC_STARTUP_8192
  211. # define OSC1_STARTUP_TIMEOUT 10240
  212. # elif BOARD_OSC1_STARTUP_US <= 142000
  213. # define OSC1_STARTUP_VALUE OSC_STARTUP_16384
  214. # define OSC1_STARTUP_TIMEOUT 20480
  215. # else
  216. # error BOARD_OSC1_STARTUP_US is too high
  217. # endif
  218. # ifdef BOARD_OSC1_IS_XTAL
  219. # if BOARD_OSC1_HZ < 900000
  220. # define OSC1_MODE_VALUE OSC_MODE_XTAL_G0
  221. # elif BOARD_OSC1_HZ < 3000000
  222. # define OSC1_MODE_VALUE OSC_MODE_XTAL_G1
  223. # elif BOARD_OSC1_HZ < 8000000
  224. # define OSC1_MODE_VALUE OSC_MODE_XTAL_G2
  225. # else
  226. # define OSC1_MODE_VALUE OSC_MODE_XTAL_G3
  227. # endif
  228. # else
  229. # define OSC1_MODE_VALUE OSC_MODE_EXTERNAL
  230. # endif
  231. #else
  232. # ifdef __DOXYGEN__
  233. # define OSC1_STARTUP_VALUE UNDEFINED
  234. # define OSC1_STARTUP_TIMEOUT UNDEFINED
  235. # define OSC1_MODE_VALUE UNDEFINED
  236. # endif
  237. #endif
  238. /**
  239. * \name Board-specific configuration parameters
  240. * The following definitions must be provided by the board code for all
  241. * working oscillators on the board.
  242. */
  243. //@{
  244. /**
  245. * \def BOARD_OSC0_HZ
  246. * \brief Clock frequency of OSC0 in Hz
  247. */
  248. /**
  249. * \def BOARD_OSC0_STARTUP_US
  250. * \brief Startup time of OSC0 in microseconds
  251. */
  252. /**
  253. * \def BOARD_OSC0_IS_XTAL
  254. * \brief OSC0 uses a crystal, not an external clock
  255. */
  256. /**
  257. * \def BOARD_OSC1_HZ
  258. * \brief Clock frequency of OSC1 in Hz
  259. */
  260. /**
  261. * \def BOARD_OSC1_STARTUP_US
  262. * \brief Startup time of OSC1 in microseconds
  263. */
  264. /**
  265. * \def BOARD_OSC1_IS_XTAL
  266. * \brief OSC1 uses a crystal, not an external clock
  267. */
  268. /**
  269. * \def BOARD_OSC32_HZ
  270. * \brief Clock frequency of OSC32 in Hz
  271. */
  272. /**
  273. * \def BOARD_OSC32_STARTUP_US
  274. * \brief Startup time of OSC32 in microseconds
  275. */
  276. /**
  277. * \def BOARD_OSC32_IS_XTAL
  278. * \brief OSC32 uses a crystal, not an external clock
  279. */
  280. #if !defined(BOARD_OSC0_HZ)
  281. # ifdef __DOXYGEN__
  282. # define BOARD_OSC0_HZ UNDEFINED
  283. # endif
  284. #endif
  285. #if !defined(BOARD_OSC0_STARTUP_US)
  286. # ifdef __DOXYGEN__
  287. # define BOARD_OSC0_STARTUP_US UNDEFINED
  288. # endif
  289. #endif
  290. #if !defined(BOARD_OSC0_IS_XTAL)
  291. # ifdef __DOXYGEN__
  292. # define BOARD_OSC0_IS_XTAL UNDEFINED
  293. # endif
  294. #endif
  295. #if !defined(BOARD_OSC1_HZ)
  296. # ifdef __DOXYGEN__
  297. # define BOARD_OSC1_HZ UNDEFINED
  298. # endif
  299. #endif
  300. #if !defined(BOARD_OSC1_STARTUP_US)
  301. # ifdef __DOXYGEN__
  302. # define BOARD_OSC1_STARTUP_US UNDEFINED
  303. # endif
  304. #endif
  305. #if !defined(BOARD_OSC1_IS_XTAL)
  306. # ifdef __DOXYGEN__
  307. # define BOARD_OSC1_IS_XTAL UNDEFINED
  308. # endif
  309. #endif
  310. #if !defined(BOARD_OSC32_HZ)
  311. # ifdef __DOXYGEN__
  312. # define BOARD_OSC32_HZ UNDEFINED
  313. # endif
  314. #endif
  315. #if !defined(BOARD_OSC32_STARTUP_US)
  316. # ifdef __DOXYGEN__
  317. # define BOARD_OSC32_STARTUP_US UNDEFINED
  318. # endif
  319. #endif
  320. #if !defined(BOARD_OSC32_IS_XTAL)
  321. # ifdef __DOXYGEN__
  322. # define BOARD_OSC32_IS_XTAL UNDEFINED
  323. # endif
  324. #endif
  325. /**
  326. * \name Slow clock frequency limits
  327. * The slow clock is an internal RC oscillator whose frequency may drift
  328. * a bit as a result of temperature changes. These definitions provide
  329. * upper and lower limits which may be used to calculate upper and lower
  330. * limits of timeouts, derived clock frequencies, etc.
  331. */
  332. //@{
  333. //! Nominal frequency of the slow clock in Hz
  334. #define OSC_SLOW_NOMINAL_HZ AVR32_PM_RCOSC_FREQUENCY
  335. //! Minimum frequency of the slow clock in Hz
  336. #define OSC_SLOW_MIN_HZ 100000
  337. //! Maximum frequency of the slow clock in Hz
  338. #define OSC_SLOW_MAX_HZ 120000
  339. //@}
  340. #ifndef __ASSEMBLY__
  341. #include <stdbool.h>
  342. #include <stdint.h>
  343. #include <avr32/io.h>
  344. static inline void osc_enable(uint8_t id)
  345. {
  346. irqflags_t flags;
  347. uint32_t oscctrl;
  348. flags = cpu_irq_save();
  349. switch (id) {
  350. #ifdef BOARD_OSC0_HZ
  351. case OSC_ID_OSC0:
  352. oscctrl = (OSC0_STARTUP_VALUE << AVR32_PM_OSCCTRL0_STARTUP_OFFSET);
  353. oscctrl |= (OSC0_MODE_VALUE << AVR32_PM_OSCCTRL0_MODE_OFFSET);
  354. AVR32_PM.oscctrl0 = oscctrl;
  355. AVR32_PM.mcctrl |= (1 << AVR32_PM_MCCTRL_OSC0EN);
  356. break;
  357. #endif
  358. #ifdef BOARD_OSC1_HZ
  359. case OSC_ID_OSC1:
  360. oscctrl = (OSC1_STARTUP_VALUE << AVR32_PM_OSCCTRL1_STARTUP_OFFSET);
  361. oscctrl |= (OSC1_MODE_VALUE << AVR32_PM_OSCCTRL1_MODE_OFFSET);
  362. AVR32_PM.oscctrl1 = oscctrl;
  363. AVR32_PM.mcctrl |= (1 << AVR32_PM_MCCTRL_OSC1EN);
  364. break;
  365. #endif
  366. default:
  367. /* unhandled_case(id); */
  368. break;
  369. }
  370. cpu_irq_restore(flags);
  371. }
  372. static inline void osc_disable(uint8_t id)
  373. {
  374. irqflags_t flags;
  375. flags = cpu_irq_save();
  376. AVR32_PM.mcctrl &= ~(1U << (AVR32_PM_MCCTRL_OSC0EN + id));
  377. cpu_irq_restore(flags);
  378. }
  379. static inline bool osc_is_ready(uint8_t id)
  380. {
  381. return !!(AVR32_PM.poscsr & (1U << (AVR32_PM_POSCSR_OSC0RDY + id)));
  382. }
  383. static inline uint32_t osc_get_rate(uint8_t id)
  384. {
  385. switch (id) {
  386. #ifdef BOARD_OSC0_HZ
  387. case OSC_ID_OSC0:
  388. return BOARD_OSC0_HZ;
  389. #endif
  390. #ifdef BOARD_OSC1_HZ
  391. case OSC_ID_OSC1:
  392. return BOARD_OSC1_HZ;
  393. #endif
  394. default:
  395. /* unhandled_case(id); */
  396. return 0;
  397. }
  398. }
  399. #endif /* !__ASSEMBLY__ */
  400. //! @}
  401. #endif /* CHIP_OSC_H_INCLUDED */