arkn141-sqwf.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  1. #include <common.h>
  2. #include <dwmmc.h>
  3. #include <malloc.h>
  4. #include <asm/gpio.h>
  5. #include <mach/ark-common.h>
  6. DECLARE_GLOBAL_DATA_PTR;
  7. #define ARKN141_UPDATE_MAGIC "ada7f0c6-7c86-11e9-8f9e-2a86e4085a59"
  8. #define IRAM_BASE 0x300000
  9. #define rSYS_AHB_CLK_EN *((volatile unsigned int *)(0x40408044))
  10. #define rSYS_APB_CLK_EN *((volatile unsigned int *)(0x40408048))
  11. #define rSYS_PER_CLK_EN *((volatile unsigned int *)(0x40408050))
  12. #define rSYS_SD_CLK_CFG *((volatile unsigned int *)(0x40408058))
  13. #define rSYS_SD1_CLK_CFG *((volatile unsigned int *)(0x4040805c))
  14. #define rSYS_DEVICE_CLK_CFG1 *((volatile unsigned int *)(0x40408064))
  15. #define rSYS_SOFT_RSTNA *((volatile unsigned int *)(0x40408074))
  16. #define rSYS_PLLRFCK_CTL *((volatile unsigned int *)(0x4040814c))
  17. #define rSYS_AUDPLL_CFG *((volatile unsigned int *)(0x40408158))
  18. #define rSYS_I2S1_NCO_CFG *((volatile unsigned int *)(0x4040816c))
  19. #define rSYS_PAD_CTRL03 *((volatile unsigned int *)(0x404081cc))
  20. #define rSYS_PAD_CTRL05 *((volatile unsigned int *)(0x404081d4))
  21. #define rSYS_PAD_CTRL07 *((volatile unsigned int *)(0x404081dc))
  22. #define rSYS_PAD_CTRL08 *((volatile unsigned int *)(0x404081e0))
  23. #define rSYS_PAD_CTRL09 *((volatile unsigned int *)(0x404081e4))
  24. #define rSYS_PAD_CTRL0A *((volatile unsigned int *)(0x404081e8))
  25. #define rSYS_PAD_CTRL0B *((volatile unsigned int *)(0x404081ec))
  26. #define rSYS_PAD_CTRL0F *((volatile unsigned int *)(0x40408180))
  27. #define rSYS_PAD_DRIVE00 *((volatile unsigned int *)(0x404081f4))
  28. #define rSYS_PAD_DRIVE01 *((volatile unsigned int *)(0x404081f8))
  29. /* UART */
  30. enum {
  31. ARKN141_UART0 = 0,
  32. ARKN141_UART1 = 1,
  33. ARKN141_UART2 = 2,
  34. ARKN141_UART3 = 3
  35. };
  36. extern unsigned int pcm_data[];
  37. extern int get_pcm_data_size(void);
  38. static void uart_pad_gpio_mode_cfg(unsigned int port, int disable_uart)
  39. {
  40. unsigned int tmp;
  41. if(port > 4)
  42. return ;
  43. if(disable_uart) {
  44. unsigned int val;
  45. int offset;
  46. //uartx APB CLK disable
  47. offset = port + 7;
  48. val = rSYS_APB_CLK_EN;
  49. val &= ~(1 << offset);
  50. rSYS_APB_CLK_EN = val;
  51. //uartx UART CLK disable
  52. offset = port + 19;
  53. val = rSYS_PER_CLK_EN;
  54. val &= ~(1 << offset);
  55. rSYS_PER_CLK_EN = val;
  56. }
  57. if(port == ARKN141_UART2) {
  58. /* uart2 tx/rx pin config to gpio mode */
  59. tmp = rSYS_PAD_CTRL09;
  60. tmp &= ~(0xf << 24);
  61. rSYS_PAD_CTRL09 = tmp;
  62. //uart2 rx(gpio2) tx(gpio3)
  63. //gpio_direction_output(2, 1); /* trigger low edge wakeup mcu(mcu in stand-by mode when system setup) */
  64. }
  65. }
  66. static void dwmci_select_pad(void)
  67. {
  68. /* use sd/mmc 0 */
  69. rSYS_PAD_CTRL09 |= 0x7F;
  70. rSYS_SD_CLK_CFG = 0x00000420;
  71. /* use sd/mmc 1 pad sd1_2 */
  72. rSYS_PAD_CTRL0B |= (1 << 5) | (1 << 2);
  73. rSYS_PAD_CTRL05 &= ~(0x1FFFFF << 0);
  74. rSYS_PAD_CTRL05 |= (2 << 18) | (2 << 15) | (2 << 12) | (2 << 9) | (2 << 6) |
  75. (2 << 3) | (2 << 0);
  76. rSYS_SD1_CLK_CFG = 0x00000420;
  77. }
  78. static void dwmci_reset(void)
  79. {
  80. rSYS_AHB_CLK_EN &= ~((1 << 4) | (1 << 3));
  81. rSYS_SOFT_RSTNA &= ~((1 << 31) | (1 << 12));
  82. udelay(100);
  83. rSYS_SOFT_RSTNA |= ((1 << 31) | (1 << 12));
  84. rSYS_AHB_CLK_EN |= ((1 << 4) | (1 << 3));
  85. }
  86. #define ARK_MMC_CLK 24000000
  87. int ark_dwmci_init(char *name,u32 regbase, int bus_width, int index)
  88. {
  89. struct dwmci_host *host = NULL;
  90. host = malloc(sizeof(struct dwmci_host));
  91. if (!host) {
  92. printf("dwmci_host malloc fail!\n");
  93. return 1;
  94. }
  95. memset(host, 0, sizeof(struct dwmci_host));
  96. dwmci_select_pad();
  97. dwmci_reset();
  98. host->name = name;
  99. host->ioaddr = (void *)regbase;
  100. host->buswidth = bus_width;
  101. host->dev_index = index;
  102. host->bus_hz = ARK_MMC_CLK;
  103. host->fifo_mode = 1;
  104. add_dwmci(host, host->bus_hz, 400000);
  105. return 0;
  106. }
  107. int board_mmc_init(bd_t *bis)
  108. {
  109. ark_dwmci_init("ARK_MMC0", 0x60000000, 4, 0);
  110. ark_dwmci_init("ARK_MMC1", 0x68000000, 4, 0);
  111. return 0;
  112. }
  113. int dram_init(void)
  114. {
  115. gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE,
  116. CONFIG_SYS_SDRAM_SIZE);
  117. return 0;
  118. }
  119. int board_init(void)
  120. {
  121. unsigned int tmp;
  122. /* uart2 tx/rx pin config to gpio mode */
  123. uart_pad_gpio_mode_cfg(ARKN141_UART2, 0);
  124. gpio_direction_output(2, 1); /* trigger low edge wakeup mcu(mcu in stand-by mode when system setup) */
  125. /* SPI pad enable */
  126. tmp = rSYS_PAD_CTRL08;
  127. tmp &= ~(0xFF << 16);
  128. tmp |= (0xA8 << 16);
  129. rSYS_PAD_CTRL08 = tmp;
  130. /* power GPIO0 high for sdio wifi module in shangqi carcorder project */
  131. rSYS_PAD_CTRL0A &= ~(0x3 << 4);
  132. gpio_direction_output(0, 1);
  133. /* select gpio 61-69, 74-79 pad */
  134. rSYS_PAD_CTRL07 |= (1 << 30);
  135. /* set pad drive */
  136. rSYS_PAD_DRIVE00 = 0;
  137. rSYS_PAD_DRIVE01 = 0;
  138. rSYS_PAD_CTRL0F &= ~(3 << 30); /* 24M OSC drive */
  139. rSYS_PAD_CTRL0F |= 2 << 30;
  140. /* disable unused module clk */
  141. rSYS_AHB_CLK_EN &= ~1;
  142. rSYS_PER_CLK_EN &= ~((1 << 2) | (1 << 3) | (1 << 12) | (1 << 13) | (1 << 24));
  143. return 0;
  144. }
  145. /* IIS */
  146. #define rIIS_SACR0 *((volatile unsigned int *)(0x40800000))
  147. #define rIIS_SACR1 *((volatile unsigned int *)(0x40800004))
  148. #define rIIS_DACR0 *((volatile unsigned int *)(0x40800008))
  149. #define rIIS_SASR0 *((volatile unsigned int *)(0x4080000c))
  150. #define rIIS_DACR1 *((volatile unsigned int *)(0x40800010))
  151. #define rIIS_SAIMR *((volatile unsigned int *)(0x40800014))
  152. #define rIIS_SAICR *((volatile unsigned int *)(0x40800018))
  153. #define rIIS_ADCR0 *((volatile unsigned int *)(0x4080001c))
  154. #define rIIS_SADR *((volatile unsigned int *)(0x40800080))
  155. #define rIIS_SATR *((volatile unsigned int *)(0x40800080))
  156. #define I2S_DATA_FIFO 0x40800080
  157. static unsigned int get_audpll_freq(void)
  158. {
  159. unsigned int val;
  160. unsigned int ref_clk;
  161. unsigned int no, nf;
  162. val = rSYS_PLLRFCK_CTL;
  163. ref_clk = 12000000 * ((val >> 6) & 0x1);
  164. val = rSYS_AUDPLL_CFG;
  165. no = (val >> 12) & 0x03;
  166. no = (1 << no);
  167. nf = val & 0xff;
  168. return ref_clk * nf / no;
  169. }
  170. static void dac_init(void)
  171. {
  172. //reset
  173. rIIS_SACR0 |= (0x1 << 4 );
  174. rIIS_SACR0 &=~ (0x1 << 4 );
  175. rIIS_SACR0 = (0x10<<16) | (0xf<<8) | (0x0<<6) | (0x1<<3) | (0x1<<2) | (0x1<<1) | 0x1;
  176. rIIS_SACR0 &= ~(0x1 << 21);
  177. rIIS_SACR0 &= ~(0x1 << 22);
  178. rIIS_SACR0 &= ~(0x1 << 24); // 0:external i2s data
  179. rIIS_SACR0 |= (1 << 3);
  180. rIIS_SAIMR = 0x00;
  181. //set audpll clk source
  182. rSYS_DEVICE_CLK_CFG1 |= (1 << 24);
  183. //set rate 16k
  184. rSYS_I2S1_NCO_CFG = (512 << 16) | (get_audpll_freq() / 16000);
  185. //set volume
  186. rIIS_DACR0 = 0x6464;
  187. //mute off
  188. gpio_direction_output(104, 1);
  189. //start play
  190. rIIS_SACR1 = 0x1;
  191. }
  192. #define DMA_BASE 0x70020000
  193. /*Source Address Register*/
  194. #define rDMA_SAR0_L *((volatile unsigned int *)(DMA_BASE + 0x000))
  195. #define rDMA_SAR0_H *((volatile unsigned int *)(DMA_BASE + 0x004))
  196. /*Destination Address Register*/
  197. #define rDMA_DAR0_L *((volatile unsigned int *)(DMA_BASE + 0x008))
  198. #define rDMA_DAR0_H *((volatile unsigned int *)(DMA_BASE + 0x00c))
  199. /*Linked List Pointer Register*/
  200. #define rDMA_LLP0_L *((volatile unsigned int *)(DMA_BASE + 0x010))
  201. #define rDMA_LLP0_H *((volatile unsigned int *)(DMA_BASE + 0x014))
  202. /*Control Register*/
  203. #define rDMA_CTL0_L *((volatile unsigned int *)(DMA_BASE + 0x018))
  204. #define rDMA_CTL0_H *((volatile unsigned int *)(DMA_BASE + 0x01c))
  205. /*Configuration Register*/
  206. #define rDMA_CFG0_L *((volatile unsigned int *)(DMA_BASE + 0x040))
  207. #define rDMA_CFG0_H *((volatile unsigned int *)(DMA_BASE + 0x044))
  208. #define rDMA_CFG_L *((volatile unsigned int *)(DMA_BASE + 0x398))
  209. #define rDMA_CHEN_L *((volatile unsigned int *)(DMA_BASE + 0x3a0))
  210. #define I2S_DMA_TRANS_SIZE 4092
  211. #define I2S_DMA_TRANS_BYTES (I2S_DMA_TRANS_SIZE * 4)
  212. struct dw_lli {
  213. /* values that are not changed by hardware */
  214. u32 sar;
  215. u32 dar;
  216. u32 llp; /* chain to next lli */
  217. u32 ctllo;
  218. /* values that may get written back: */
  219. u32 ctlhi;
  220. /* sstat and dstat can snapshot peripheral register state.
  221. * silicon config may discard either or both...
  222. */
  223. u32 sstat;
  224. u32 dstat;
  225. };
  226. #define DMA_WIDTH_32 2
  227. #define DMA_BURST_SIZE_16 3
  228. #define M2P_DMAC 1
  229. #define REQ_I2S_TX 19
  230. #define I2S_TX_LLI_CTL_L ((1<<28)\
  231. |(1<<27)\
  232. |(0<<25)\
  233. |(1<<23)\
  234. |(M2P_DMAC<<20)\
  235. |(0<<18)\
  236. |(0<<17)\
  237. |(DMA_BURST_SIZE_16<<14)\
  238. |(DMA_BURST_SIZE_16<<11)\
  239. |(0<<9)\
  240. |(2<<7)\
  241. |(DMA_WIDTH_32<<4)\
  242. |(DMA_WIDTH_32<<1)\
  243. |(0<<0))
  244. #define I2S_TX_DMA_CFG_H ((REQ_I2S_TX<<12)\
  245. |(0<<7)\
  246. |(1<<6)\
  247. |(1<<5)\
  248. |(1<<1))
  249. static void dac_start_dma(void)
  250. {
  251. int lli_count = 0;
  252. int i;
  253. struct dw_lli *plli;
  254. int tfr_size = get_pcm_data_size();
  255. int ch = 0;
  256. lli_count = DIV_ROUND_UP(tfr_size, I2S_DMA_TRANS_BYTES);
  257. plli = (struct dw_lli *)IRAM_BASE;
  258. for (i = 0; i < lli_count; i++) {
  259. plli[i].sar = (u32)pcm_data + i * I2S_DMA_TRANS_BYTES;
  260. plli[i].dar = I2S_DATA_FIFO;
  261. plli[i].llp = (u32)&plli[i+1] & ~3;
  262. plli[i].ctllo = I2S_TX_LLI_CTL_L;
  263. plli[i].ctlhi = tfr_size > I2S_DMA_TRANS_BYTES ? I2S_DMA_TRANS_SIZE : tfr_size / 4;
  264. tfr_size -= I2S_DMA_TRANS_BYTES;
  265. }
  266. plli[i-1].llp = 0;
  267. flush_dcache_range(IRAM_BASE, IRAM_BASE + lli_count * sizeof(struct dw_lli));
  268. rDMA_CFG_L |= (1 << 0); //enable dma
  269. rDMA_SAR0_L = (u32)pcm_data;
  270. rDMA_DAR0_L = I2S_DATA_FIFO;
  271. rDMA_LLP0_L = (u32)&plli[0] & ~3;;
  272. rDMA_CTL0_L = plli[0].ctllo;
  273. rDMA_CTL0_H = plli[0].ctlhi;
  274. rDMA_CFG0_L = 0;
  275. rDMA_CFG0_H = I2S_TX_DMA_CFG_H;
  276. rDMA_CHEN_L = (1 << (8 + ch)) | (1 << ch);//channel enable
  277. }
  278. void play_audio(const unsigned int *data, int size)
  279. {
  280. printf("size=%d.\n", size);
  281. dac_init();
  282. dac_start_dma();
  283. }
  284. static int mcu_serial_send_and_check(unsigned char cmd)
  285. {
  286. unsigned char recv_buf[256];
  287. const unsigned char cmd_package[2][5] = {
  288. {0x55, 0x80, 0xA0, 0x0, 0x20}, //update cmd
  289. {0x55, 0x80, 0xA1, 0x0, 0x21} //update complete cmd
  290. };
  291. const unsigned char ack_package[2][6] = {
  292. {0x55, 0x80, 0xA0, 0x1, 0x0, 0x21},
  293. {0x55, 0x80, 0xA1, 0x1, 0x0, 0x20}
  294. };
  295. int timeout = 0;
  296. int cmd_id;
  297. int size;
  298. int i;
  299. size = sizeof(cmd_package)/sizeof(cmd_package[0]);
  300. for(i=0; i<size; i++) {
  301. if(cmd == cmd_package[i][2])
  302. break;
  303. }
  304. if(i == size)
  305. return -1;
  306. cmd_id = i;
  307. while(timeout++ <= 14){ //5s: 31
  308. mcu_serial_send(cmd_package[cmd_id], sizeof(cmd_package[cmd_id]));
  309. mdelay(10*timeout);
  310. #if 0
  311. size = mcu_serial_read(recv_buf);
  312. for(i=0; i<size; i+=sizeof(ack_package[cmd_id])) {
  313. if(((i+1)*sizeof(ack_package[cmd_id])) > size)
  314. break;
  315. if(memcmp(&recv_buf[i], ack_package[cmd_id], sizeof(ack_package[cmd_id])) == 0) {
  316. return 0;
  317. }
  318. }
  319. #else
  320. size = mcu_serial_receive(recv_buf, sizeof(recv_buf));
  321. for(i=0; i<size; i++) {
  322. if(recv_buf[i] == ack_package[cmd_id][0]) {
  323. if(memcmp(&recv_buf[i], ack_package[cmd_id], sizeof(ack_package[cmd_id])) == 0) {
  324. //printf("### timeout:%d\n", timeout);
  325. return 0;
  326. }
  327. }
  328. }
  329. #endif
  330. };
  331. return -1;
  332. }
  333. int board_late_init(void)
  334. {
  335. char cmd[128];
  336. char *need_update;
  337. unsigned int loadaddr;
  338. int update = 0;
  339. run_command("sf probe", 0);
  340. gpio_direction_output(2, 0); /* trigger low edge wakeup mcu(mcu in stand-by mode when system setup) */
  341. gpio_direction_input(32);
  342. if (!gpio_get_value(32)) {
  343. env_set("need_update", "yes");
  344. update = 1;
  345. }
  346. if (update) {
  347. int state = 0;
  348. int i,j;
  349. gpio_direction_output(30, 1);
  350. gpio_direction_output(31, 1);
  351. mdelay(500);
  352. for(i=1; i<=10; i++){
  353. mcu_serial_init();
  354. if(mcu_serial_send_and_check(0xA0) != 0) {
  355. printf("mcu ack timeout, retry(%d)...\n", i);
  356. uart_pad_gpio_mode_cfg(ARKN141_UART2, 1);
  357. state = 0;
  358. for(j=0; j<3; j++) {
  359. gpio_direction_output(2, state);
  360. state = !state;
  361. mdelay(i*100);
  362. }
  363. update = 0;
  364. continue;
  365. }
  366. update = 1;
  367. break;
  368. }
  369. if(update == 1) {
  370. printf("mcu wakeup success\n");
  371. } else if(update == 0) {
  372. printf("mcu wakeup failed\n");
  373. //env_set("need_update", "no");
  374. }
  375. }
  376. need_update = env_get("need_update");
  377. if (!strcmp(need_update, "yes")) {
  378. sprintf(cmd, "fatload %s %s %s update-magic", env_get("update_dev"),
  379. env_get("dev_part"), env_get("loadaddr"));
  380. run_command(cmd, 0);
  381. loadaddr = env_get_hex("loadaddr", 0);
  382. if (loadaddr && memcmp((void*)loadaddr, ARKN141_UPDATE_MAGIC,
  383. strlen(ARKN141_UPDATE_MAGIC))) {
  384. printf("Wrong update magic, do not update.\n");
  385. env_set("need_update", "no");
  386. } else {
  387. //run_command("sf erase reserve 0", 0);
  388. //run_command("sf erase customid 0", 0);
  389. //run_command("sf erase usrdata 0", 0);
  390. run_command("env default -f -a", 0);
  391. }
  392. }
  393. play_audio(pcm_data, get_pcm_data_size());
  394. return 0;
  395. }