board.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  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_SPINAND_3)
  98. /*SPI3 IO2*/
  99. PIN_MFP_SET(GPIO_8, SPINAND_MFP_PU_CFG),
  100. /*SPI3 IO3*/
  101. PIN_MFP_SET(GPIO_9, SPINAND_MFP_PU_CFG),
  102. /*SPI3 SS*/
  103. PIN_MFP_SET(GPIO_10, SPINAND_MFP_CFG),
  104. /*SPI3 CLK*/
  105. PIN_MFP_SET(GPIO_11, SPINAND_MFP_CFG),
  106. /*SPI3 IO1*/
  107. PIN_MFP_SET(GPIO_12, SPINAND_MFP_CFG),
  108. /*SPI3 IO0*/
  109. PIN_MFP_SET(GPIO_13, SPINAND_MFP_CFG),
  110. #endif
  111. #if IS_ENABLED(CONFIG_AUDIO_I2SRX_0)
  112. /*I2SRX0 mclk*/
  113. PIN_MFP_SET(GPIO_53, I2SRX_MFP_CFG),
  114. /*I2SRX0 bclk*/
  115. PIN_MFP_SET(GPIO_54, I2SRX_MFP_CFG),
  116. /*I2SRX0 lrclk*/
  117. PIN_MFP_SET(GPIO_55, I2SRX_MFP_CFG),
  118. /*I2SRX0 d0*/
  119. PIN_MFP_SET(GPIO_56, I2SRX_MFP_CFG),
  120. #endif
  121. #if IS_ENABLED(CONFIG_SPI_1)
  122. /*SPI SS*/
  123. PIN_MFP_SET(GPIO_24, SPI_MFP_CFG(MFP_SPI1)),
  124. /* SPI CLK*/
  125. PIN_MFP_SET(GPIO_25, SPI_MFP_CFG(MFP_SPI1)),
  126. /* SPI MISO*/
  127. PIN_MFP_SET(GPIO_26, SPI_MFP_CFG(MFP_SPI1)),
  128. /* SPI MOSI*/
  129. PIN_MFP_SET(GPIO_27, SPI_MFP_CFG(MFP_SPI1)),
  130. #endif
  131. #if IS_ENABLED(CONFIG_SPI_2)
  132. /*SPI SS*/
  133. PIN_MFP_SET(GPIO_30, SPI_MFP_CFG(MFP_SPI2)),
  134. /* SPI CLK*/
  135. PIN_MFP_SET(GPIO_31, SPI_MFP_CFG(MFP_SPI2)),
  136. /* SPI MISO*/
  137. PIN_MFP_SET(GPIO_32, SPI_MFP_CFG(MFP_SPI2)),
  138. /* SPI MOSI*/
  139. PIN_MFP_SET(GPIO_33, SPI_MFP_CFG(MFP_SPI2)),
  140. #endif
  141. #if IS_ENABLED(CONFIG_SPI_3)
  142. /*SPI SS*/
  143. PIN_MFP_SET(GPIO_20, SPI_MFP_CFG(MFP_SPI3)),
  144. /* SPI CLK*/
  145. PIN_MFP_SET(GPIO_21, SPI_MFP_CFG(MFP_SPI3)),
  146. /* SPI MISO*/
  147. PIN_MFP_SET(GPIO_22, SPI_MFP_CFG(MFP_SPI3)),
  148. /* SPI MOSI*/
  149. PIN_MFP_SET(GPIO_23, SPI_MFP_CFG(MFP_SPI3)),
  150. #endif
  151. #if IS_ENABLED(CONFIG_SPIMT_0)
  152. /* SPI SS*/
  153. PIN_MFP_SET(GPIO_49, SPIMT_MFP_CFG(MFP0_SPIMT)),
  154. /* SPI CLK*/
  155. PIN_MFP_SET(GPIO_50, SPIMT_MFP_CFG(MFP0_SPIMT)),
  156. /* SPI MISO*/
  157. PIN_MFP_SET(GPIO_51, SPIMT_MFP_CFG(MFP0_SPIMT)),
  158. /* SPI MOSI*/
  159. PIN_MFP_SET(GPIO_52, SPIMT_MFP_CFG(MFP0_SPIMT)),
  160. /* SPI SS1*/
  161. PIN_MFP_SET(GPIO_61, SPIMT_MFP_CFG(MFP0_SPIMT)),
  162. #endif
  163. #if IS_ENABLED(CONFIG_SPIMT_1)
  164. /* SPI SS*/
  165. PIN_MFP_SET(GPIO_53, SPIMT_MFP_CFG(MFP1_SPIMT)),
  166. /* SPI CLK*/
  167. PIN_MFP_SET(GPIO_54, SPIMT_MFP_CFG(MFP1_SPIMT)),
  168. /* SPI MISO*/
  169. PIN_MFP_SET(GPIO_55, SPIMT_MFP_CFG(MFP1_SPIMT)),
  170. /* SPI MOSI*/
  171. PIN_MFP_SET(GPIO_56, SPIMT_MFP_CFG(MFP1_SPIMT)),
  172. #endif
  173. };
  174. #if IS_ENABLED(CONFIG_MMC_0)
  175. static const struct acts_pin_config board_mmc0_config[] = {
  176. /* MMC0 CMD*/
  177. PIN_MFP_SET(GPIO_25, SDC0_MFP_CFG_VAL),
  178. /* MMC0 CLK*/
  179. PIN_MFP_SET(GPIO_24, (GPIO_CTL_MFP(SDC0_MFP_SEL)|GPIO_CTL_PADDRV_LEVEL(3))),
  180. /* MMC0 DATA0 */
  181. PIN_MFP_SET(GPIO_18, SDC0_MFP_CFG_VAL),
  182. /* MMC0 DATA1 */
  183. PIN_MFP_SET(GPIO_19, SDC0_MFP_CFG_VAL),
  184. /* MMC0 DATA2 */
  185. PIN_MFP_SET(GPIO_20, SDC0_MFP_CFG_VAL),
  186. /* MMC0 DATA3 */
  187. PIN_MFP_SET(GPIO_21, SDC0_MFP_CFG_VAL),
  188. };
  189. #endif
  190. #if IS_ENABLED(CONFIG_AUDIO_SPDIFTX_0)
  191. static const struct acts_pin_config board_spdiftx0_config[] = {
  192. PIN_MFP_SET(GPIO_9, SPDIFTX_MFP_CFG),
  193. };
  194. #endif
  195. #if IS_ENABLED(CONFIG_AUDIO_SPDIFRX_0)
  196. static const struct acts_pin_config board_spdifrx0_config[] = {
  197. PIN_MFP_SET(GPIO_13, SPDIFRX_MFP_CFG)
  198. };
  199. #endif
  200. #if IS_ENABLED(CONFIG_AUDIO_I2STX_0)
  201. static const struct acts_pin_config board_i2stx0_config[] = {
  202. /*I2STX0 mclk*/
  203. PIN_MFP_SET(GPIO_49, I2STX_MFP_CFG),
  204. /*I2STX0 bclk*/
  205. PIN_MFP_SET(GPIO_50, I2STX_MFP_CFG),
  206. /*I2STX0 lrclk*/
  207. PIN_MFP_SET(GPIO_51, I2STX_MFP_CFG),
  208. /*I2STX0 d0*/
  209. PIN_MFP_SET(GPIO_52, I2STX_MFP_CFG),
  210. };
  211. #endif
  212. #if IS_ENABLED(CONFIG_PWM)
  213. /* Look at CONFIG_PWM_PIN_CHAN_MAP select the available pwm gpio */
  214. static const struct pwm_acts_pin_config board_pwm_config[] = {
  215. /* GPIO5 used as pwm channel 1*/
  216. PWM_PIN_MFP_SET(GPIO_5, 1, PWM_MFP_CFG),
  217. /* GPIO21 used as pwm channel 7*/
  218. PWM_PIN_MFP_SET(GPIO_21, 7, PWM_MFP_CFG),
  219. };
  220. #endif
  221. #if IS_ENABLED(CONFIG_PANEL)
  222. static const struct acts_pin_config board_lcd_pin_config[] = {
  223. /* lcd cs */
  224. PIN_MFP_SET(GPIO_30, (GPIO_CTL_MFP(LCD_MFP_SEL)|GPIO_CTL_PULLUP)),
  225. /* lcd scl */
  226. PIN_MFP_SET(GPIO_34, LCD_MFP_SEL),
  227. /* lcd_d0*/
  228. PIN_MFP_SET(GPIO_14, LCD_MFP_SEL),
  229. /* lcd_d1*/
  230. PIN_MFP_SET(GPIO_15, LCD_MFP_SEL),
  231. /* lcd_d2*/
  232. PIN_MFP_SET(GPIO_16, LCD_MFP_SEL),
  233. /* lcd_d3*/
  234. PIN_MFP_SET(GPIO_17, LCD_MFP_SEL),
  235. /* lcd power: IOVCC2 */
  236. PIN_MFP_SET(GPIO_33, 0x1F),
  237. };
  238. #endif
  239. #if IS_ENABLED(CONFIG_ADCKEY)
  240. #define CONFIG_ADCKEY_GPIO
  241. #ifdef CONFIG_ADCKEY_GPIO
  242. #define CONFIG_ADCKEY_GPIO_NUM (GPIO_21)
  243. #else
  244. #define CONFIG_ADCKEY_WIO_NUM (WIO_0)
  245. #define CONFIG_ADCKEY_WIO_MFP (3)
  246. #endif
  247. static void board_adckey_pinmux_init(void)
  248. {
  249. #ifdef CONFIG_ADCKEY_GPIO
  250. acts_pinmux_set(CONFIG_ADCKEY_GPIO_NUM, ADCKEY_MFP_CFG);
  251. #else
  252. sys_write32(CONFIG_ADCKEY_WIO_MFP, WIO0_CTL + (CONFIG_ADCKEY_WIO_NUM * 4));
  253. #endif
  254. }
  255. #endif
  256. static int board_early_init(const struct device *arg)
  257. {
  258. ARG_UNUSED(arg);
  259. acts_pinmux_setup_pins(board_pin_config, ARRAY_SIZE(board_pin_config));
  260. #if IS_ENABLED(CONFIG_MMC_0)
  261. acts_pinmux_setup_pins(board_mmc0_config, ARRAY_SIZE(board_mmc0_config));
  262. #endif
  263. #if IS_ENABLED(CONFIG_ADCKEY)
  264. board_adckey_pinmux_init();
  265. #endif
  266. #if IS_ENABLED(CONFIG_PANEL)
  267. acts_pinmux_setup_pins(board_lcd_pin_config, ARRAY_SIZE(board_lcd_pin_config));
  268. #endif
  269. #ifdef CONFIG_RTT_CONSOLE
  270. jtag_set();
  271. #endif
  272. return 0;
  273. }
  274. static int board_later_init(const struct device *arg)
  275. {
  276. ARG_UNUSED(arg);
  277. printk("%s %d: \n", __func__, __LINE__);
  278. return 0;
  279. }
  280. /* UART registers struct */
  281. struct acts_uart_reg {
  282. volatile uint32_t ctrl;
  283. volatile uint32_t rxdat;
  284. volatile uint32_t txdat;
  285. volatile uint32_t stat;
  286. volatile uint32_t br;
  287. } ;
  288. void uart_poll_out_ch(int c)
  289. {
  290. struct acts_uart_reg *uart = (struct acts_uart_reg*)UART0_REG_BASE;
  291. /* Wait for transmitter to be ready */
  292. while (uart->stat & BIT(6));
  293. /* send a character */
  294. uart->txdat = (uint32_t)c;
  295. }
  296. /*for early printk*/
  297. int arch_printk_char_out(int c)
  298. {
  299. if ('\n' == c)
  300. uart_poll_out_ch('\r');
  301. uart_poll_out_ch(c);
  302. return 0;
  303. }
  304. void board_get_mmc0_pinmux_info(struct board_pinmux_info *pinmux_info)
  305. {
  306. #if IS_ENABLED(CONFIG_MMC_0)
  307. pinmux_info->pins_config = board_mmc0_config;
  308. pinmux_info->pins_num = ARRAY_SIZE(board_mmc0_config);
  309. #endif
  310. }
  311. void board_get_spdiftx0_pinmux_info(struct board_pinmux_info *pinmux_info)
  312. {
  313. #if IS_ENABLED(CONFIG_AUDIO_SPDIFTX_0)
  314. pinmux_info->pins_config = board_spdiftx0_config;
  315. pinmux_info->pins_num = ARRAY_SIZE(board_spdiftx0_config);
  316. #endif
  317. }
  318. void board_get_spdifrx0_pinmux_info(struct board_pinmux_info *pinmux_info)
  319. {
  320. #if IS_ENABLED(CONFIG_AUDIO_SPDIFRX_0)
  321. pinmux_info->pins_config = board_spdifrx0_config;
  322. pinmux_info->pins_num = ARRAY_SIZE(board_spdifrx0_config);
  323. #endif
  324. }
  325. void board_get_i2stx0_pinmux_info(struct board_pinmux_info *pinmux_info)
  326. {
  327. #if IS_ENABLED(CONFIG_AUDIO_SPDIFRX_0)
  328. pinmux_info->pins_config = board_i2stx0_config;
  329. pinmux_info->pins_num = ARRAY_SIZE(board_i2stx0_config);
  330. #endif
  331. }
  332. void board_get_pwm_pinmux_info(struct board_pwm_pinmux_info *pinmux_info)
  333. {
  334. #if IS_ENABLED(CONFIG_PWM)
  335. pinmux_info->pins_config = board_pwm_config;
  336. pinmux_info->pins_num = ARRAY_SIZE(board_pwm_config);
  337. #endif
  338. }
  339. #if IS_ENABLED(CONFIG_PANEL)
  340. static uint32_t lcd_pin_backup[3];
  341. void board_lcd_suspend(bool aod_en, bool early_suspend)
  342. {
  343. if (early_suspend) {
  344. lcd_pin_backup[0] = sys_read32(GPION_CTL(35)); /* lcd te */
  345. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(35));
  346. if (aod_en == false) {
  347. lcd_pin_backup[1] = sys_read32(GPION_CTL(21)); /* lcd power */
  348. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(21));
  349. lcd_pin_backup[2] = sys_read32(GPION_CTL(32)); /* lcd reset */
  350. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(32));
  351. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(30)); /* lcd cs */
  352. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(33)); /* lcd power IOVCC2 */
  353. }
  354. }
  355. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(34)); /* lcd scl */
  356. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(14)); /* lcd d0 */
  357. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(15)); /* lcd d1 */
  358. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(16)); /* lcd d2 */
  359. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(17)); /* lcd d3 */
  360. }
  361. void board_lcd_resume(bool aod_en, bool late_resume)
  362. {
  363. acts_pinmux_setup_pins(board_lcd_pin_config, ARRAY_SIZE(board_lcd_pin_config));
  364. if (late_resume) {
  365. sys_write32(lcd_pin_backup[0], GPION_CTL(35)); /* lcd te */
  366. if (aod_en == false) {
  367. sys_write32(lcd_pin_backup[1], GPION_CTL(21)); /* lcd GND_LEDK */
  368. sys_write32(lcd_pin_backup[2], GPION_CTL(32)); /* lcd reset */
  369. }
  370. }
  371. }
  372. #endif /* CONFIG_PANEL */
  373. SYS_INIT(board_early_init, PRE_KERNEL_1, 5);
  374. SYS_INIT(board_later_init, POST_KERNEL, 5);