pm9261.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. /*
  2. * (C) Copyright 2007-2008
  3. * Stelian Pop <stelian.pop@leadtechdesign.com>
  4. * Lead Tech Design <www.leadtechdesign.com>
  5. * Copyright (C) 2008 Ronetix Ilko Iliev (www.ronetix.at)
  6. * Copyright (C) 2009 Jean-Christopher PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
  7. *
  8. * See file CREDITS for list of people who contributed to this
  9. * project.
  10. *
  11. * This program is free software; you can redistribute it and/or
  12. * modify it under the terms of the GNU General Public License as
  13. * published by the Free Software Foundation; either version 2 of
  14. * the License, or (at your option) any later version.
  15. *
  16. * This program is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU General Public License
  22. * along with this program; if not, write to the Free Software
  23. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  24. * MA 02111-1307 USA
  25. */
  26. #include <common.h>
  27. #include <asm/sizes.h>
  28. #include <asm/arch/at91sam9261.h>
  29. #include <asm/arch/at91sam9261_matrix.h>
  30. #include <asm/arch/at91sam9_smc.h>
  31. #include <asm/arch/at91_common.h>
  32. #include <asm/arch/at91_pmc.h>
  33. #include <asm/arch/at91_rstc.h>
  34. #include <asm/arch/clk.h>
  35. #include <asm/arch/gpio.h>
  36. #include <asm/arch/io.h>
  37. #include <asm/arch/hardware.h>
  38. #include <lcd.h>
  39. #include <atmel_lcdc.h>
  40. #include <dataflash.h>
  41. #if defined(CONFIG_RESET_PHY_R) && defined(CONFIG_DRIVER_DM9000)
  42. #include <net.h>
  43. #endif
  44. #include <netdev.h>
  45. DECLARE_GLOBAL_DATA_PTR;
  46. /* ------------------------------------------------------------------------- */
  47. /*
  48. * Miscelaneous platform dependent initialisations
  49. */
  50. #ifdef CONFIG_CMD_NAND
  51. static void pm9261_nand_hw_init(void)
  52. {
  53. unsigned long csa;
  54. /* Enable CS3 */
  55. csa = at91_sys_read(AT91_MATRIX_EBICSA);
  56. at91_sys_write(AT91_MATRIX_EBICSA,
  57. csa | AT91_MATRIX_CS3A_SMC_SMARTMEDIA);
  58. /* Configure SMC CS3 for NAND/SmartMedia */
  59. at91_sys_write(AT91_SMC_SETUP(3),
  60. AT91_SMC_NWESETUP_(1) | AT91_SMC_NCS_WRSETUP_(0) |
  61. AT91_SMC_NRDSETUP_(1) | AT91_SMC_NCS_RDSETUP_(0));
  62. at91_sys_write(AT91_SMC_PULSE(3),
  63. AT91_SMC_NWEPULSE_(3) | AT91_SMC_NCS_WRPULSE_(3) |
  64. AT91_SMC_NRDPULSE_(3) | AT91_SMC_NCS_RDPULSE_(3));
  65. at91_sys_write(AT91_SMC_CYCLE(3),
  66. AT91_SMC_NWECYCLE_(5) | AT91_SMC_NRDCYCLE_(5));
  67. at91_sys_write(AT91_SMC_MODE(3),
  68. AT91_SMC_READMODE | AT91_SMC_WRITEMODE |
  69. AT91_SMC_EXNWMODE_DISABLE |
  70. #ifdef CONFIG_SYS_NAND_DBW_16
  71. AT91_SMC_DBW_16 |
  72. #else /* CONFIG_SYS_NAND_DBW_8 */
  73. AT91_SMC_DBW_8 |
  74. #endif
  75. AT91_SMC_TDF_(2));
  76. /* Configure RDY/BSY */
  77. at91_set_gpio_input(AT91_PIN_PA16, 1);
  78. /* Enable NandFlash */
  79. at91_set_gpio_output(AT91_PIN_PC14, 1);
  80. at91_set_A_periph(AT91_PIN_PC0, 0); /* NANDOE */
  81. at91_set_A_periph(AT91_PIN_PC1, 0); /* NANDWE */
  82. }
  83. #endif
  84. #ifdef CONFIG_DRIVER_DM9000
  85. static void pm9261_dm9000_hw_init(void)
  86. {
  87. /* Configure SMC CS2 for DM9000 */
  88. at91_sys_write(AT91_SMC_SETUP(2),
  89. AT91_SMC_NWESETUP_(2) | AT91_SMC_NCS_WRSETUP_(0) |
  90. AT91_SMC_NRDSETUP_(2) | AT91_SMC_NCS_RDSETUP_(0));
  91. at91_sys_write(AT91_SMC_PULSE(2),
  92. AT91_SMC_NWEPULSE_(4) | AT91_SMC_NCS_WRPULSE_(8) |
  93. AT91_SMC_NRDPULSE_(4) | AT91_SMC_NCS_RDPULSE_(8));
  94. at91_sys_write(AT91_SMC_CYCLE(2),
  95. AT91_SMC_NWECYCLE_(16) | AT91_SMC_NRDCYCLE_(16));
  96. at91_sys_write(AT91_SMC_MODE(2),
  97. AT91_SMC_READMODE | AT91_SMC_WRITEMODE |
  98. AT91_SMC_EXNWMODE_DISABLE |
  99. AT91_SMC_BAT_WRITE | AT91_SMC_DBW_16 |
  100. AT91_SMC_TDF_(1));
  101. /* Configure Interrupt pin as input, no pull-up */
  102. at91_set_gpio_input(AT91_PIN_PA24, 0);
  103. }
  104. #endif
  105. #ifdef CONFIG_LCD
  106. vidinfo_t panel_info = {
  107. vl_col: 240,
  108. vl_row: 320,
  109. vl_clk: 4965000,
  110. vl_sync: ATMEL_LCDC_INVLINE_INVERTED |
  111. ATMEL_LCDC_INVFRAME_INVERTED,
  112. vl_bpix: 3,
  113. vl_tft: 1,
  114. vl_hsync_len: 5,
  115. vl_left_margin: 1,
  116. vl_right_margin:33,
  117. vl_vsync_len: 1,
  118. vl_upper_margin:1,
  119. vl_lower_margin:0,
  120. mmio: AT91SAM9261_LCDC_BASE,
  121. };
  122. void lcd_enable(void)
  123. {
  124. at91_set_gpio_value(AT91_PIN_PA22, 0); /* power up */
  125. }
  126. void lcd_disable(void)
  127. {
  128. at91_set_gpio_value(AT91_PIN_PA22, 1); /* power down */
  129. }
  130. static void pm9261_lcd_hw_init(void)
  131. {
  132. at91_set_A_periph(AT91_PIN_PB1, 0); /* LCDHSYNC */
  133. at91_set_A_periph(AT91_PIN_PB2, 0); /* LCDDOTCK */
  134. at91_set_A_periph(AT91_PIN_PB3, 0); /* LCDDEN */
  135. at91_set_A_periph(AT91_PIN_PB4, 0); /* LCDCC */
  136. at91_set_A_periph(AT91_PIN_PB7, 0); /* LCDD2 */
  137. at91_set_A_periph(AT91_PIN_PB8, 0); /* LCDD3 */
  138. at91_set_A_periph(AT91_PIN_PB9, 0); /* LCDD4 */
  139. at91_set_A_periph(AT91_PIN_PB10, 0); /* LCDD5 */
  140. at91_set_A_periph(AT91_PIN_PB11, 0); /* LCDD6 */
  141. at91_set_A_periph(AT91_PIN_PB12, 0); /* LCDD7 */
  142. at91_set_A_periph(AT91_PIN_PB15, 0); /* LCDD10 */
  143. at91_set_A_periph(AT91_PIN_PB16, 0); /* LCDD11 */
  144. at91_set_A_periph(AT91_PIN_PB17, 0); /* LCDD12 */
  145. at91_set_A_periph(AT91_PIN_PB18, 0); /* LCDD13 */
  146. at91_set_A_periph(AT91_PIN_PB19, 0); /* LCDD14 */
  147. at91_set_A_periph(AT91_PIN_PB20, 0); /* LCDD15 */
  148. at91_set_B_periph(AT91_PIN_PB23, 0); /* LCDD18 */
  149. at91_set_B_periph(AT91_PIN_PB24, 0); /* LCDD19 */
  150. at91_set_B_periph(AT91_PIN_PB25, 0); /* LCDD20 */
  151. at91_set_B_periph(AT91_PIN_PB26, 0); /* LCDD21 */
  152. at91_set_B_periph(AT91_PIN_PB27, 0); /* LCDD22 */
  153. at91_set_B_periph(AT91_PIN_PB28, 0); /* LCDD23 */
  154. at91_sys_write(AT91_PMC_SCER, AT91_PMC_HCK1);
  155. gd->fb_base = AT91SAM9261_SRAM_BASE;
  156. }
  157. #ifdef CONFIG_LCD_INFO
  158. #include <nand.h>
  159. #include <version.h>
  160. extern flash_info_t flash_info[];
  161. void lcd_show_board_info(void)
  162. {
  163. ulong dram_size, nand_size, flash_size, dataflash_size;
  164. int i;
  165. char temp[32];
  166. lcd_printf ("%s\n", U_BOOT_VERSION);
  167. lcd_printf ("(C) 2009 Ronetix GmbH\n");
  168. lcd_printf ("support@ronetix.at\n");
  169. lcd_printf ("%s CPU at %s MHz",
  170. AT91_CPU_NAME,
  171. strmhz(temp, get_cpu_clk_rate()));
  172. dram_size = 0;
  173. for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++)
  174. dram_size += gd->bd->bi_dram[i].size;
  175. nand_size = 0;
  176. for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++)
  177. nand_size += nand_info[i].size;
  178. flash_size = 0;
  179. for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i++)
  180. flash_size += flash_info[i].size;
  181. dataflash_size = 0;
  182. for (i = 0; i < CONFIG_SYS_MAX_DATAFLASH_BANKS; i++)
  183. dataflash_size += (unsigned int) dataflash_info[i].Device.pages_number *
  184. dataflash_info[i].Device.pages_size;
  185. lcd_printf ("%ld MB SDRAM, %ld MB NAND\n%ld MB NOR Flash\n"
  186. "%ld MB DataFlash\n",
  187. dram_size >> 20,
  188. nand_size >> 20,
  189. flash_size >> 20,
  190. dataflash_size >> 20);
  191. }
  192. #endif /* CONFIG_LCD_INFO */
  193. #endif /* CONFIG_LCD */
  194. int board_init(void)
  195. {
  196. /* Enable Ctrlc */
  197. console_init_f();
  198. at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9261_ID_PIOA);
  199. at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9261_ID_PIOC);
  200. /* arch number of PM9261-Board */
  201. gd->bd->bi_arch_number = MACH_TYPE_PM9261;
  202. /* adress of boot parameters */
  203. gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
  204. at91_serial_hw_init();
  205. #ifdef CONFIG_CMD_NAND
  206. pm9261_nand_hw_init();
  207. #endif
  208. #ifdef CONFIG_HAS_DATAFLASH
  209. at91_spi0_hw_init(1 << 0);
  210. #endif
  211. #ifdef CONFIG_DRIVER_DM9000
  212. pm9261_dm9000_hw_init();
  213. #endif
  214. #ifdef CONFIG_LCD
  215. pm9261_lcd_hw_init();
  216. #endif
  217. return 0;
  218. }
  219. int dram_init(void)
  220. {
  221. gd->bd->bi_dram[0].start = PHYS_SDRAM;
  222. gd->bd->bi_dram[0].size = PHYS_SDRAM_SIZE;
  223. return 0;
  224. }
  225. #ifdef CONFIG_RESET_PHY_R
  226. void reset_phy(void)
  227. {
  228. #ifdef CONFIG_DRIVER_DM9000
  229. /*
  230. * Initialize ethernet HW addr prior to starting Linux,
  231. * needed for nfsroot
  232. */
  233. eth_init(gd->bd);
  234. #endif
  235. }
  236. #endif
  237. #ifdef CONFIG_DISPLAY_BOARDINFO
  238. int checkboard (void)
  239. {
  240. char buf[32];
  241. printf ("Board : Ronetix PM9261\n");
  242. printf ("Crystal frequency: %8s MHz\n",
  243. strmhz(buf, get_main_clk_rate()));
  244. printf ("CPU clock : %8s MHz\n",
  245. strmhz(buf, get_cpu_clk_rate()));
  246. printf ("Master clock : %8s MHz\n",
  247. strmhz(buf, get_mck_clk_rate()));
  248. return 0;
  249. }
  250. #endif