at91sam9n12ek.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. /*
  2. * (C) Copyright 2013 Atmel Corporation
  3. * Josh Wu <josh.wu@atmel.com>
  4. *
  5. * See file CREDITS for list of people who contributed to this
  6. * project.
  7. *
  8. * This program is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU General Public License as
  10. * published by the Free Software Foundation; either version 2 of
  11. * the License, or (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  21. * MA 02111-1307 USA
  22. */
  23. #include <common.h>
  24. #include <asm/io.h>
  25. #include <asm/arch/at91sam9x5_matrix.h>
  26. #include <asm/arch/at91sam9_smc.h>
  27. #include <asm/arch/at91_common.h>
  28. #include <asm/arch/at91_pmc.h>
  29. #include <asm/arch/at91_rstc.h>
  30. #include <asm/arch/at91_pio.h>
  31. #include <asm/arch/clk.h>
  32. #include <lcd.h>
  33. #include <atmel_hlcdc.h>
  34. #include <atmel_mci.h>
  35. #ifdef CONFIG_LCD_INFO
  36. #include <nand.h>
  37. #include <version.h>
  38. #endif
  39. DECLARE_GLOBAL_DATA_PTR;
  40. /* ------------------------------------------------------------------------- */
  41. /*
  42. * Miscelaneous platform dependent initialisations
  43. */
  44. #ifdef CONFIG_NAND_ATMEL
  45. static void at91sam9n12ek_nand_hw_init(void)
  46. {
  47. struct at91_smc *smc = (struct at91_smc *)ATMEL_BASE_SMC;
  48. struct at91_matrix *matrix = (struct at91_matrix *)ATMEL_BASE_MATRIX;
  49. unsigned long csa;
  50. /* Assign CS3 to NAND/SmartMedia Interface */
  51. csa = readl(&matrix->ebicsa);
  52. csa |= AT91_MATRIX_EBI_CS3A_SMC_SMARTMEDIA;
  53. /* Configure databus */
  54. csa &= ~AT91_MATRIX_NFD0_ON_D16; /* nandflash connect to D0~D15 */
  55. /* Configure IO drive */
  56. csa &= ~AT91_MATRIX_EBI_EBI_IOSR_NORMAL;
  57. writel(csa, &matrix->ebicsa);
  58. /* Configure SMC CS3 for NAND/SmartMedia */
  59. writel(AT91_SMC_SETUP_NWE(1) | AT91_SMC_SETUP_NCS_WR(0) |
  60. AT91_SMC_SETUP_NRD(2) | AT91_SMC_SETUP_NCS_RD(0),
  61. &smc->cs[3].setup);
  62. writel(AT91_SMC_PULSE_NWE(3) | AT91_SMC_PULSE_NCS_WR(5) |
  63. AT91_SMC_PULSE_NRD(4) | AT91_SMC_PULSE_NCS_RD(6),
  64. &smc->cs[3].pulse);
  65. writel(AT91_SMC_CYCLE_NWE(5) | AT91_SMC_CYCLE_NRD(7),
  66. &smc->cs[3].cycle);
  67. writel(AT91_SMC_MODE_RM_NRD | AT91_SMC_MODE_WM_NWE |
  68. AT91_SMC_MODE_EXNW_DISABLE |
  69. #ifdef CONFIG_SYS_NAND_DBW_16
  70. AT91_SMC_MODE_DBW_16 |
  71. #else /* CONFIG_SYS_NAND_DBW_8 */
  72. AT91_SMC_MODE_DBW_8 |
  73. #endif
  74. AT91_SMC_MODE_TDF_CYCLE(1),
  75. &smc->cs[3].mode);
  76. /* Configure RDY/BSY pin */
  77. at91_set_pio_input(AT91_PIO_PORTD, 5, 1);
  78. /* Configure ENABLE pin for NandFlash */
  79. at91_set_pio_output(AT91_PIO_PORTD, 4, 1);
  80. at91_set_a_periph(AT91_PIO_PORTD, 0, 1); /* NAND OE */
  81. at91_set_a_periph(AT91_PIO_PORTD, 1, 1); /* NAND WE */
  82. at91_set_a_periph(AT91_PIO_PORTD, 2, 1); /* ALE */
  83. at91_set_a_periph(AT91_PIO_PORTD, 3, 1); /* CLE */
  84. }
  85. #endif
  86. #ifdef CONFIG_LCD
  87. vidinfo_t panel_info = {
  88. .vl_col = 480,
  89. .vl_row = 272,
  90. .vl_clk = 9000000,
  91. .vl_bpix = LCD_BPP,
  92. .vl_sync = 0,
  93. .vl_tft = 1,
  94. .vl_hsync_len = 5,
  95. .vl_left_margin = 8,
  96. .vl_right_margin = 43,
  97. .vl_vsync_len = 10,
  98. .vl_upper_margin = 4,
  99. .vl_lower_margin = 12,
  100. .mmio = ATMEL_BASE_LCDC,
  101. };
  102. void lcd_enable(void)
  103. {
  104. at91_set_pio_output(AT91_PIO_PORTC, 25, 0); /* power up */
  105. }
  106. void lcd_disable(void)
  107. {
  108. at91_set_pio_output(AT91_PIO_PORTC, 25, 1); /* power down */
  109. }
  110. #ifdef CONFIG_LCD_INFO
  111. void lcd_show_board_info(void)
  112. {
  113. ulong dram_size, nand_size;
  114. int i;
  115. char temp[32];
  116. lcd_printf("%s\n", U_BOOT_VERSION);
  117. lcd_printf("ATMEL Corp\n");
  118. lcd_printf("at91@atmel.com\n");
  119. lcd_printf("%s CPU at %s MHz\n",
  120. ATMEL_CPU_NAME,
  121. strmhz(temp, get_cpu_clk_rate()));
  122. dram_size = 0;
  123. for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++)
  124. dram_size += gd->bd->bi_dram[i].size;
  125. nand_size = 0;
  126. for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++)
  127. nand_size += nand_info[i].size;
  128. lcd_printf(" %ld MB SDRAM, %ld MB NAND\n",
  129. dram_size >> 20,
  130. nand_size >> 20);
  131. }
  132. #endif /* CONFIG_LCD_INFO */
  133. #endif /* CONFIG_LCD */
  134. /* SPI chip select control */
  135. #ifdef CONFIG_ATMEL_SPI
  136. #include <spi.h>
  137. int spi_cs_is_valid(unsigned int bus, unsigned int cs)
  138. {
  139. return bus == 0 && cs < 2;
  140. }
  141. void spi_cs_activate(struct spi_slave *slave)
  142. {
  143. switch (slave->cs) {
  144. case 0:
  145. at91_set_pio_output(AT91_PIO_PORTA, 14, 0);
  146. break;
  147. case 1:
  148. at91_set_pio_output(AT91_PIO_PORTA, 7, 0);
  149. break;
  150. }
  151. }
  152. void spi_cs_deactivate(struct spi_slave *slave)
  153. {
  154. switch (slave->cs) {
  155. case 0:
  156. at91_set_pio_output(AT91_PIO_PORTA, 14, 1);
  157. break;
  158. case 1:
  159. at91_set_pio_output(AT91_PIO_PORTA, 7, 1);
  160. break;
  161. }
  162. }
  163. #endif /* CONFIG_ATMEL_SPI */
  164. #ifdef CONFIG_GENERIC_ATMEL_MCI
  165. int board_mmc_init(bd_t *bd)
  166. {
  167. at91_mci_hw_init();
  168. return atmel_mci_init((void *)ATMEL_BASE_HSMCI0);
  169. }
  170. #endif
  171. int board_early_init_f(void)
  172. {
  173. /* Enable clocks for all PIOs */
  174. struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
  175. writel((1 << ATMEL_ID_PIOAB) | (1 << ATMEL_ID_PIOCD), &pmc->pcer);
  176. at91_seriald_hw_init();
  177. return 0;
  178. }
  179. int board_init(void)
  180. {
  181. /* adress of boot parameters */
  182. gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
  183. #ifdef CONFIG_NAND_ATMEL
  184. at91sam9n12ek_nand_hw_init();
  185. #endif
  186. #ifdef CONFIG_ATMEL_SPI
  187. at91_spi0_hw_init(1 << 0);
  188. #endif
  189. #ifdef CONFIG_LCD
  190. at91_lcd_hw_init();
  191. #endif
  192. return 0;
  193. }
  194. int dram_init(void)
  195. {
  196. gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE,
  197. CONFIG_SYS_SDRAM_SIZE);
  198. return 0;
  199. }