board.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  1. /*
  2. * Copyright (c) 2019 Actions Semiconductor Co., Ltd
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. /**
  7. * @file
  8. * @brief board init functions
  9. */
  10. #include <kernel.h>
  11. #include <init.h>
  12. #include <device.h>
  13. #include <soc.h>
  14. #include "board.h"
  15. #include <drivers/gpio.h>
  16. #include <board_cfg.h>
  17. #define CONFIG_GPIO_HIGHZ (0x1000)
  18. void boot_to_application(void)
  19. {
  20. boot_to_app(0, BOOT_FLASH_ID_NOR);
  21. }
  22. void boot_to_ota_app(void)
  23. {
  24. boot_to_part(5, 0, BOOT_FLASH_ID_NOR); // 5=temp part
  25. }
  26. static const struct acts_pin_config board_pin_config[] = {
  27. /*UART0 */
  28. #if IS_ENABLED(CONFIG_UART_0)
  29. /* uart0 tx */
  30. PIN_MFP_SET(GPIO_28, UART0_MFP_CFG),
  31. /* uart0 rx */
  32. PIN_MFP_SET(GPIO_29, UART0_MFP_CFG),
  33. #endif
  34. /*UART1 */
  35. #if IS_ENABLED(CONFIG_UART_1)
  36. /* uart1 tx */
  37. PIN_MFP_SET(GPIO_16, UART1_MFP_CFG),
  38. /* uart1 rx */
  39. PIN_MFP_SET(GPIO_17, UART1_MFP_CFG),
  40. #endif
  41. #if IS_ENABLED(CONFIG_SPI_FLASH_0)
  42. /* SPI0 CS */
  43. PIN_MFP_SET(GPIO_0, SPINOR_MFP_CFG),
  44. /* SPI0 MISO */
  45. PIN_MFP_SET(GPIO_1, SPINOR_MFP_CFG),
  46. /* SPI0 CLK */
  47. PIN_MFP_SET(GPIO_2, SPINOR_MFP_CFG),
  48. /* SPI0 MOSI */
  49. PIN_MFP_SET(GPIO_3, SPINOR_MFP_CFG),
  50. /* SPI0 IO2 */
  51. PIN_MFP_SET(GPIO_6, SPINOR_MFP_PU_CFG),
  52. /* SPI0 IO3 */
  53. PIN_MFP_SET(GPIO_7, SPINOR_MFP_PU_CFG),
  54. #endif
  55. #if IS_ENABLED(CONFIG_ACTS_BATTERY_NTC)
  56. PIN_MFP_SET(GPIO_20, BATNTC_MFP_CFG),
  57. #endif
  58. #if IS_ENABLED(CONFIG_I2CMT_0)
  59. /* I2C CLK*/
  60. PIN_MFP_SET(GPIO_18, I2CMT_MFP_CFG(MFP0_I2CMT)),
  61. /* I2C DATA*/
  62. PIN_MFP_SET(GPIO_19, I2CMT_MFP_CFG(MFP0_I2CMT)),
  63. #endif
  64. #if IS_ENABLED(CONFIG_I2CMT_1)
  65. /* I2C CLK*/
  66. PIN_MFP_SET(GPIO_55, I2CMT_MFP_CFG(MFP1_I2CMT)),
  67. /* I2C DATA*/
  68. PIN_MFP_SET(GPIO_56, I2CMT_MFP_CFG(MFP1_I2CMT)),
  69. #endif
  70. #if IS_ENABLED(CONFIG_I2C_0)
  71. /* I2C CLK*/
  72. PIN_MFP_SET(GPIO_57, I2C_MFP_CFG(MFP0_I2C)),
  73. /* I2C DATA*/
  74. PIN_MFP_SET(GPIO_58, I2C_MFP_CFG(MFP0_I2C)),
  75. #endif
  76. #if IS_ENABLED(CONFIG_I2C_1)
  77. /* I2C CLK*/
  78. PIN_MFP_SET(GPIO_51, I2C_MFP_CFG(MFP1_I2C)),
  79. /* I2C DATA*/
  80. PIN_MFP_SET(GPIO_52, I2C_MFP_CFG(MFP1_I2C)),
  81. #endif
  82. #if IS_ENABLED(CONFIG_I2C_2)
  83. /* I2C CLK*/
  84. PIN_MFP_SET(GPIO_61, I2C_MFP_CFG(MFP2_I2C)),
  85. /* I2C DATA*/
  86. PIN_MFP_SET(GPIO_62, I2C_MFP_CFG(MFP2_I2C)),
  87. #endif
  88. #if IS_ENABLED(CONFIG_I2C_3)
  89. /* I2C CLK*/
  90. PIN_MFP_SET(GPIO_60, I2C_MFP_CFG(MFP3_I2C)),
  91. /* I2C DATA*/
  92. PIN_MFP_SET(GPIO_59, I2C_MFP_CFG(MFP3_I2C)),
  93. #endif
  94. #if IS_ENABLED(CONFIG_CEC)
  95. PIN_MFP_SET(GPIO_12, CEC_MFP_CFG),
  96. #endif
  97. #if IS_ENABLED(CONFIG_AUDIO_I2SRX_0)
  98. /*I2SRX0 mclk*/
  99. PIN_MFP_SET(GPIO_53, I2SRX_MFP_CFG),
  100. /*I2SRX0 bclk*/
  101. PIN_MFP_SET(GPIO_54, I2SRX_MFP_CFG),
  102. /*I2SRX0 lrclk*/
  103. PIN_MFP_SET(GPIO_55, I2SRX_MFP_CFG),
  104. /*I2SRX0 d0*/
  105. PIN_MFP_SET(GPIO_56, I2SRX_MFP_CFG),
  106. #endif
  107. #if IS_ENABLED(CONFIG_SPI_1)
  108. /*SPI SS*/
  109. PIN_MFP_SET(GPIO_24, SPI_MFP_CFG(MFP_SPI1)),
  110. /* SPI CLK*/
  111. PIN_MFP_SET(GPIO_25, SPI_MFP_CFG(MFP_SPI1)),
  112. /* SPI MISO*/
  113. PIN_MFP_SET(GPIO_26, SPI_MFP_CFG(MFP_SPI1)),
  114. /* SPI MOSI*/
  115. PIN_MFP_SET(GPIO_27, SPI_MFP_CFG(MFP_SPI1)),
  116. #endif
  117. #if IS_ENABLED(CONFIG_SPI_2)
  118. /*SPI SS*/
  119. PIN_MFP_SET(GPIO_30, SPI_MFP_CFG(MFP_SPI2)),
  120. /* SPI CLK*/
  121. PIN_MFP_SET(GPIO_31, SPI_MFP_CFG(MFP_SPI2)),
  122. /* SPI MISO*/
  123. PIN_MFP_SET(GPIO_32, SPI_MFP_CFG(MFP_SPI2)),
  124. /* SPI MOSI*/
  125. PIN_MFP_SET(GPIO_33, SPI_MFP_CFG(MFP_SPI2)),
  126. #endif
  127. #if IS_ENABLED(CONFIG_SPI_3)
  128. /*SPI SS*/
  129. PIN_MFP_SET(GPIO_20, SPI_MFP_CFG(MFP_SPI3)),
  130. /* SPI CLK*/
  131. PIN_MFP_SET(GPIO_21, SPI_MFP_CFG(MFP_SPI3)),
  132. /* SPI MISO*/
  133. PIN_MFP_SET(GPIO_22, SPI_MFP_CFG(MFP_SPI3)),
  134. /* SPI MOSI*/
  135. PIN_MFP_SET(GPIO_23, SPI_MFP_CFG(MFP_SPI3)),
  136. #endif
  137. #if IS_ENABLED(CONFIG_SPIMT_0)
  138. /* SPI SS*/
  139. PIN_MFP_SET(GPIO_49, SPIMT_MFP_CFG(MFP0_SPIMT)),
  140. /* SPI CLK*/
  141. PIN_MFP_SET(GPIO_50, SPIMT_MFP_CFG(MFP0_SPIMT)),
  142. /* SPI MISO*/
  143. PIN_MFP_SET(GPIO_51, SPIMT_MFP_CFG(MFP0_SPIMT)),
  144. /* SPI MOSI*/
  145. PIN_MFP_SET(GPIO_52, SPIMT_MFP_CFG(MFP0_SPIMT)),
  146. /* SPI SS1*/
  147. PIN_MFP_SET(GPIO_61, SPIMT_MFP_CFG(MFP0_SPIMT)),
  148. #endif
  149. #if IS_ENABLED(CONFIG_SPIMT_1)
  150. /* SPI SS*/
  151. PIN_MFP_SET(GPIO_53, SPIMT_MFP_CFG(MFP1_SPIMT)),
  152. /* SPI CLK*/
  153. PIN_MFP_SET(GPIO_54, SPIMT_MFP_CFG(MFP1_SPIMT)),
  154. /* SPI MISO*/
  155. PIN_MFP_SET(GPIO_55, SPIMT_MFP_CFG(MFP1_SPIMT)),
  156. /* SPI MOSI*/
  157. PIN_MFP_SET(GPIO_56, SPIMT_MFP_CFG(MFP1_SPIMT)),
  158. #endif
  159. };
  160. #if IS_ENABLED(CONFIG_MMC_0)
  161. static const struct acts_pin_config board_mmc0_config[] = {
  162. /* MMC0 CMD*/
  163. PIN_MFP_SET(GPIO_25, SDC0_MFP_CFG_VAL),
  164. /* MMC0 CLK*/
  165. PIN_MFP_SET(GPIO_24, (GPIO_CTL_MFP(SDC0_MFP_SEL)|GPIO_CTL_PADDRV_LEVEL(3))),
  166. /* MMC0 DATA0 */
  167. PIN_MFP_SET(GPIO_18, SDC0_MFP_CFG_VAL),
  168. /* MMC0 DATA1 */
  169. PIN_MFP_SET(GPIO_19, SDC0_MFP_CFG_VAL),
  170. /* MMC0 DATA2 */
  171. PIN_MFP_SET(GPIO_20, SDC0_MFP_CFG_VAL),
  172. /* MMC0 DATA3 */
  173. PIN_MFP_SET(GPIO_21, SDC0_MFP_CFG_VAL),
  174. };
  175. #endif
  176. #if IS_ENABLED(CONFIG_AUDIO_SPDIFTX_0)
  177. static const struct acts_pin_config board_spdiftx0_config[] = {
  178. PIN_MFP_SET(GPIO_9, SPDIFTX_MFP_CFG),
  179. };
  180. #endif
  181. #if IS_ENABLED(CONFIG_AUDIO_SPDIFRX_0)
  182. static const struct acts_pin_config board_spdifrx0_config[] = {
  183. PIN_MFP_SET(GPIO_13, SPDIFRX_MFP_CFG)
  184. };
  185. #endif
  186. #if IS_ENABLED(CONFIG_AUDIO_I2STX_0)
  187. static const struct acts_pin_config board_i2stx0_config[] = {
  188. /*I2STX0 mclk*/
  189. PIN_MFP_SET(GPIO_49, I2STX_MFP_CFG),
  190. /*I2STX0 bclk*/
  191. PIN_MFP_SET(GPIO_50, I2STX_MFP_CFG),
  192. /*I2STX0 lrclk*/
  193. PIN_MFP_SET(GPIO_51, I2STX_MFP_CFG),
  194. /*I2STX0 d0*/
  195. PIN_MFP_SET(GPIO_52, I2STX_MFP_CFG),
  196. };
  197. #endif
  198. #if IS_ENABLED(CONFIG_SPINAND_3)
  199. static const struct acts_pin_config board_spinand_spi3_config[] = {
  200. /* IOVCC1 poweron */
  201. PIN_MFP_SET(CONFIG_SPINAND_POWER_GPIO, 0x1F),
  202. /*SPI3 IO2*/
  203. PIN_MFP_SET(GPIO_8, SPINAND_MFP_PU_CFG),
  204. /*SPI3 IO3*/
  205. PIN_MFP_SET(GPIO_9, SPINAND_MFP_PU_CFG),
  206. /*SPI3 SS*/
  207. PIN_MFP_SET(GPIO_10, SPINAND_MFP_CFG),
  208. /*SPI3 CLK*/
  209. PIN_MFP_SET(GPIO_11, SPINAND_MFP_CFG),
  210. /*SPI3 IO1*/
  211. PIN_MFP_SET(GPIO_12, SPINAND_MFP_CFG),
  212. /*SPI3 IO0*/
  213. PIN_MFP_SET(GPIO_13, SPINAND_MFP_CFG),
  214. };
  215. static const struct acts_pin_config board_spinand_spi3_gpiohighz_config[] = {
  216. /* IOVCC1 poweroff */
  217. PIN_MFP_SET(CONFIG_SPINAND_POWER_GPIO, CONFIG_GPIO_HIGHZ),
  218. /*SPI3 IO2*/
  219. PIN_MFP_SET(GPIO_8, CONFIG_GPIO_HIGHZ),
  220. /*SPI3 IO3*/
  221. PIN_MFP_SET(GPIO_9, CONFIG_GPIO_HIGHZ),
  222. /*SPI3 SS*/
  223. PIN_MFP_SET(GPIO_10, CONFIG_GPIO_HIGHZ),
  224. /*SPI3 CLK*/
  225. PIN_MFP_SET(GPIO_11, CONFIG_GPIO_HIGHZ),
  226. /*SPI3 IO1*/
  227. PIN_MFP_SET(GPIO_12, CONFIG_GPIO_HIGHZ),
  228. /*SPI3 IO0*/
  229. PIN_MFP_SET(GPIO_13, CONFIG_GPIO_HIGHZ),
  230. };
  231. #endif
  232. #if IS_ENABLED(CONFIG_PWM)
  233. /* Look at CONFIG_PWM_PIN_CHAN_MAP select the available pwm gpio */
  234. static const struct pwm_acts_pin_config board_pwm_config[] = {
  235. /* GPIO5 used as pwm channel 1*/
  236. PWM_PIN_MFP_SET(GPIO_5, 1, PWM_MFP_CFG),
  237. /* GPIO21 used as pwm channel 7*/
  238. PWM_PIN_MFP_SET(GPIO_21, 7, PWM_MFP_CFG),
  239. };
  240. #endif
  241. #if IS_ENABLED(CONFIG_PANEL)
  242. static const struct acts_pin_config board_lcd_pin_config[] = {
  243. /* lcd cs */
  244. PIN_MFP_SET(GPIO_30, (GPIO_CTL_MFP(LCD_MFP_SEL)|GPIO_CTL_PULLUP)),
  245. /* lcd scl */
  246. PIN_MFP_SET(GPIO_34, LCD_MFP_SEL),
  247. /* lcd_d0*/
  248. PIN_MFP_SET(GPIO_14, LCD_MFP_SEL),
  249. /* lcd_d1*/
  250. PIN_MFP_SET(GPIO_15, LCD_MFP_SEL),
  251. /* lcd_d2*/
  252. PIN_MFP_SET(GPIO_16, LCD_MFP_SEL),
  253. /* lcd_d3*/
  254. PIN_MFP_SET(GPIO_17, LCD_MFP_SEL),
  255. /* lcd power: IOVCC2 */
  256. PIN_MFP_SET(GPIO_33, 0x1F),
  257. };
  258. #endif
  259. #if IS_ENABLED(CONFIG_ADCKEY)
  260. #define CONFIG_ADCKEY_GPIO
  261. #ifdef CONFIG_ADCKEY_GPIO
  262. #define CONFIG_ADCKEY_GPIO_NUM (GPIO_21)
  263. #else
  264. #define CONFIG_ADCKEY_WIO_NUM (WIO_0)
  265. #define CONFIG_ADCKEY_WIO_MFP (3)
  266. #endif
  267. static void board_adckey_pinmux_init(void)
  268. {
  269. #ifdef CONFIG_ADCKEY_GPIO
  270. acts_pinmux_set(CONFIG_ADCKEY_GPIO_NUM, ADCKEY_MFP_CFG);
  271. #else
  272. sys_write32(CONFIG_ADCKEY_WIO_MFP, WIO0_CTL + (CONFIG_ADCKEY_WIO_NUM * 4));
  273. #endif
  274. }
  275. #endif
  276. static int board_early_init(const struct device *arg)
  277. {
  278. ARG_UNUSED(arg);
  279. acts_pinmux_setup_pins(board_pin_config, ARRAY_SIZE(board_pin_config));
  280. #if IS_ENABLED(CONFIG_MMC_0)
  281. acts_pinmux_setup_pins(board_mmc0_config, ARRAY_SIZE(board_mmc0_config));
  282. #endif
  283. #if IS_ENABLED(CONFIG_ADCKEY)
  284. board_adckey_pinmux_init();
  285. #endif
  286. #if IS_ENABLED(CONFIG_PANEL)
  287. acts_pinmux_setup_pins(board_lcd_pin_config, ARRAY_SIZE(board_lcd_pin_config));
  288. #endif
  289. #ifdef CONFIG_RTT_CONSOLE
  290. jtag_set();
  291. #endif
  292. /*if use external charger, set vd12 and vc18 to dcdc*/
  293. sys_write32(sys_read32(VOUT_CTL0) | (1<<18) | (1<<17), VOUT_CTL0);
  294. /*if use external charger, close internal charger*/
  295. sys_write32(sys_read32(CHG_CTL_SVCC) & ~(1<<10), CHG_CTL_SVCC);
  296. sys_write32(sys_read32(WIO1_CTL) | (1 << 25), WIO1_CTL);
  297. /*set wio1 as a wakeup src, for poweroff unnormal */
  298. sys_write32(sys_read32(WKEN_CTL_SVCC) | (1 << 5), WKEN_CTL_SVCC);
  299. return 0;
  300. }
  301. static int board_later_init(const struct device *arg)
  302. {
  303. ARG_UNUSED(arg);
  304. printk("%s %d: \n", __func__, __LINE__);
  305. return 0;
  306. }
  307. /* UART registers struct */
  308. struct acts_uart_reg {
  309. volatile uint32_t ctrl;
  310. volatile uint32_t rxdat;
  311. volatile uint32_t txdat;
  312. volatile uint32_t stat;
  313. volatile uint32_t br;
  314. } ;
  315. void uart_poll_out_ch(int c)
  316. {
  317. struct acts_uart_reg *uart = (struct acts_uart_reg*)UART0_REG_BASE;
  318. /* Wait for transmitter to be ready */
  319. while (uart->stat & BIT(6));
  320. /* send a character */
  321. uart->txdat = (uint32_t)c;
  322. }
  323. /*for early printk*/
  324. int arch_printk_char_out(int c)
  325. {
  326. if ('\n' == c)
  327. uart_poll_out_ch('\r');
  328. uart_poll_out_ch(c);
  329. return 0;
  330. }
  331. void board_get_mmc0_pinmux_info(struct board_pinmux_info *pinmux_info)
  332. {
  333. #if IS_ENABLED(CONFIG_MMC_0)
  334. pinmux_info->pins_config = board_mmc0_config;
  335. pinmux_info->pins_num = ARRAY_SIZE(board_mmc0_config);
  336. #endif
  337. }
  338. void board_get_spdiftx0_pinmux_info(struct board_pinmux_info *pinmux_info)
  339. {
  340. #if IS_ENABLED(CONFIG_AUDIO_SPDIFTX_0)
  341. pinmux_info->pins_config = board_spdiftx0_config;
  342. pinmux_info->pins_num = ARRAY_SIZE(board_spdiftx0_config);
  343. #endif
  344. }
  345. void board_get_spdifrx0_pinmux_info(struct board_pinmux_info *pinmux_info)
  346. {
  347. #if IS_ENABLED(CONFIG_AUDIO_SPDIFRX_0)
  348. pinmux_info->pins_config = board_spdifrx0_config;
  349. pinmux_info->pins_num = ARRAY_SIZE(board_spdifrx0_config);
  350. #endif
  351. }
  352. void board_get_i2stx0_pinmux_info(struct board_pinmux_info *pinmux_info)
  353. {
  354. #if IS_ENABLED(CONFIG_AUDIO_SPDIFRX_0)
  355. pinmux_info->pins_config = board_i2stx0_config;
  356. pinmux_info->pins_num = ARRAY_SIZE(board_i2stx0_config);
  357. #endif
  358. }
  359. void board_get_pwm_pinmux_info(struct board_pwm_pinmux_info *pinmux_info)
  360. {
  361. #if IS_ENABLED(CONFIG_PWM)
  362. pinmux_info->pins_config = board_pwm_config;
  363. pinmux_info->pins_num = ARRAY_SIZE(board_pwm_config);
  364. #endif
  365. }
  366. void board_get_spinand_pinmux_info(struct board_pinmux_info *pinmux_info)
  367. {
  368. #if IS_ENABLED(CONFIG_SPINAND_3)
  369. pinmux_info->pins_config = board_spinand_spi3_config;
  370. pinmux_info->pins_num = ARRAY_SIZE(board_spinand_spi3_config);
  371. #endif
  372. }
  373. void board_get_spinand_gpiohighz_info(struct board_pinmux_info *pinmux_info)
  374. {
  375. #if IS_ENABLED(CONFIG_SPINAND_3)
  376. pinmux_info->pins_config = board_spinand_spi3_gpiohighz_config;
  377. pinmux_info->pins_num = ARRAY_SIZE(board_spinand_spi3_gpiohighz_config);
  378. #endif
  379. }
  380. #if IS_ENABLED(CONFIG_PANEL)
  381. static uint32_t lcd_pin_backup[3];
  382. void board_lcd_suspend(bool aod_en, bool early_suspend)
  383. {
  384. if (early_suspend) {
  385. lcd_pin_backup[0] = sys_read32(GPION_CTL(35)); /* lcd te */
  386. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(35));
  387. if (aod_en == false) {
  388. lcd_pin_backup[1] = sys_read32(GPION_CTL(21)); /* lcd power */
  389. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(21));
  390. lcd_pin_backup[2] = sys_read32(GPION_CTL(32)); /* lcd reset */
  391. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(32));
  392. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(30)); /* lcd cs */
  393. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(33)); /* lcd power IOVCC2 */
  394. }
  395. }
  396. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(34)); /* lcd scl */
  397. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(14)); /* lcd d0 */
  398. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(15)); /* lcd d1 */
  399. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(16)); /* lcd d2 */
  400. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(17)); /* lcd d3 */
  401. }
  402. void board_lcd_resume(bool aod_en, bool late_resume)
  403. {
  404. acts_pinmux_setup_pins(board_lcd_pin_config, ARRAY_SIZE(board_lcd_pin_config));
  405. if (late_resume) {
  406. sys_write32(lcd_pin_backup[0], GPION_CTL(35)); /* lcd te */
  407. if (aod_en == false) {
  408. sys_write32(lcd_pin_backup[1], GPION_CTL(21)); /* lcd GND_LEDK */
  409. sys_write32(lcd_pin_backup[2], GPION_CTL(32)); /* lcd reset */
  410. }
  411. }
  412. }
  413. #endif /* CONFIG_PANEL */
  414. SYS_INIT(board_early_init, PRE_KERNEL_1, 5);
  415. SYS_INIT(board_later_init, POST_KERNEL, 5);