一、第一階段,無修改
二、第二階段
u-boot-1.3.4\lib_arm\board.c
1.增加頭文件
2.增加版本號
3.start_armboot中初始化部分
板級初始化部分init_sequence->board_init
3.1創(chuàng)建新單板資源頭文件include\asm-arm\arch-at91sam9\at91sam9m10g45ek.h(地址與中斷號)
文件書寫思路:
1.參考同系列芯片的at91sam9263.h文件
2.外設(shè)標識符
3.用戶外圍物理基地址
4.系統(tǒng)外設(shè)物理基地址(基于系統(tǒng)控制寄存器)
5.內(nèi)部存儲基地址
參照圖表:
附上源代碼:
?at91sam9m10g45ek.h
3.2 創(chuàng)建單板總線矩陣頭文件include\asm-arm\arch-at91sam9\at91sam9g45_matrix.h(地址)
文件書寫思路:
1.參考同系列芯片的at91sam9263_matrix.h文件
2.寄存器映射表
參照圖表:
附上源代碼:
?at91sam9g45_matrix.h
3.3 創(chuàng)建單板初始化文件u-boot-1.3.4/board/atmel/at91sam9m10g45ek/at91sam9m10g45ek.c
文件書寫思路:
1)參考同系列芯片的at91sam9263ek.c文件
2)初始化隊列中board_init()
2.1)控制臺初始化
2.2)機器ID初始化
2.3)啟動參數(shù)存儲地址初始化
2.4)串口硬件初始化
2.4.1)設(shè)置復用GPIO口為A設(shè)備
2.4.2)寫寄存器,使能時鐘開啟(參數(shù)是外設(shè)標識符)
2.5)nandflash硬件初始化
2.5.1) 讀取片選寄存器
2.5.2) 設(shè)置EBI片選3分配給靜態(tài)存儲控制器
2.5.3) 設(shè)置靜態(tài)存儲控制器
2.5.4) 外設(shè)時鐘開啟寄存器,并行IO控制器C
2.5.5) C8初始化為輸入
2.5.6) C14初始化為輸出
2.6)spi硬件初始化
2.6.1) 設(shè)置B3為復用GPIO口B設(shè)備,用作NPCS0
2.6.2) 設(shè)置B0為復用GPIO口B設(shè)備,用作MISO0
2.6.3) 設(shè)置B1為復用GPIO口B設(shè)備,用作MOSI0
2.6.4) 設(shè)置B2為復用GPIO口B設(shè)備,用作SPCK0
2.6.5)?寫寄存器,使能時鐘開啟(參數(shù)是外設(shè)標識符SPI0)?
2.7)macb硬件初始化
2.7.1) 禁止上拉A15 A12 A13
2.7.2)?讀取復位寄存模式寄存器
2.7.3) 設(shè)置復位寄存器周期,允許復位
2.7.4) 設(shè)置外部復位
2.7.5) 等待硬件復位結(jié)束
2.7.6) 設(shè)置允許復位
2.7.7) 使能上拉A15 A12 A13
2.7.8)?復用IO A10-19 為A設(shè)備 功能:ETXCK_EREFCK、ERXDV、ERX0、ERX1、ERXER、ETXEN、ETX0、ETX1、EMDIO、EMDC
2.7.9)?復用IO A6-9 A27-30 為B設(shè)備 功能:ECRS、ECOL、ERX2、ERX3、ERXCK、ETX2、ETX3、ETXER
2.7.10) D5引腳復位
2.8)lcd硬件初始化
2.8.1)?復用IO E0 E4-30 為A設(shè)備 功能:LCDDPWR、LCDHSYNC、LCDDOTCK、LCDDEN、LCDD0-23
2.8.1)?外設(shè)時鐘開啟寄存器,LCD
3) 初始化隊列中dram_init()
3.1) 初始化RAM起始地址0x70000000
3.2) 初始化RAM大小0x08000000
附上源碼:
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 //#include //have udelay() 12 #include 13 #if defined(CONFIG_RESET_PHY_R) && defined(CONFIG_MACB) 14 #include 15 #endif 16 17 DECLARE_GLOBAL_DATA_PTR; 18 19 /* ------------------------------------------------------------------------- */ 20 /* 21 * Miscelaneous platform dependent initialisations 22 */ 23 24 static void at91samm10g45ek_serial_hw_init(void) 25 { 26 #ifdef CONFIG_USART0 27 at91_set_A_periph(AT91_PIN_PB19, 1); /* TXD0 */ 28 at91_set_A_periph(AT91_PIN_PB18, 0); /* RXD0 */ 29 at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9G45_ID_US0); 30 #endif 31 32 #ifdef CONFIG_USART1 33 at91_set_A_periph(AT91_PIN_PB4, 1); /* TXD1 */ 34 at91_set_A_periph(AT91_PIN_PB5, 0); /* RXD1 */ 35 at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9G45_ID_US1); 36 #endif 37 38 #ifdef CONFIG_USART2 39 at91_set_A_periph(AT91_PIN_PD6, 1); /* TXD2 */ 40 at91_set_A_periph(AT91_PIN_PD7, 0); /* RXD2 */ 41 at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9G45_ID_US2); 42 #endif 43 44 #ifdef CONFIG_USART3 /* DBGU */ 45 at91_set_A_periph(AT91_PIN_PB12, 0); /* DRXD */ 46 at91_set_A_periph(AT91_PIN_PB13, 1); /* DTXD */ 47 at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_SYS); 48 #endif 49 } 50 51 #ifdef CONFIG_CMD_NAND 52 static void at91samm10g45ek_nand_hw_init(void) 53 { 54 unsigned long csa; 55 56 /* Enable CS3 */ 57 //EBI 片選 3 分配給靜態(tài)存儲控制器 58 csa = at91_sys_read(AT91_MATRIX_EBICSA); 59 at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_EBI_CS3A_SMC_SMARTMEDIA); 60 61 /* Configure SMC CS3 for NAND/SmartMedia */ 62 //NWE 建立時長=(128 X NWE_SETUP[5] + NWE_SETUP[4:0])時鐘周期 63 //NCS 建立時長=(128 X NCS_WR_SETUP[5] + NCS_WR_SETUP[4:0])時鐘周期 64 //NRD 建立時長=(128 X NRD_SETUP[5] + NRD_SETUP[4:0])時鐘周期 65 //NCS 建立時長=(128 X NCS_RD_SETUP[5] + NCS_RD_SETUP[4:0])時鐘周期 66 at91_sys_write(AT91_SMC_SETUP(3), 67 AT91_SMC_NWESETUP_(1) | AT91_SMC_NCS_WRSETUP_(0) | 68 AT91_SMC_NRDSETUP_(1) | AT91_SMC_NCS_RDSETUP_(0)); 69 //NWE 脈寬=(256 X NWE_PULSE[6] + NWE_PULSE[5:0])時鐘周期 70 //NCS 脈寬=(256 X NCS_WR_PULSE[6] + NCS_WR_PULSE[5:0])時鐘周期 71 //NRD 脈寬=(256 X NRD_PULSE[6] + NRD_PULSE[5:0])時鐘周期 72 //NCS 脈寬=(256 X NCS_RD_PULSE[6] + NCS_RD_PULSE[5:0])時鐘周期 73 at91_sys_write(AT91_SMC_PULSE(3), 74 AT91_SMC_NWEPULSE_(4) | AT91_SMC_NCS_WRPULSE_(3) | 75 AT91_SMC_NRDPULSE_(3) | AT91_SMC_NCS_RDPULSE_(2)); 76 //寫周期長度=(NWE_CYCLE[8:7] X 256 + NWE_CYCLE[6:0])時鐘周期 77 //讀周期長度=(NRD_CYCLE[8:7] X 256 + NRD_CYCLE[6:0])時鐘周期 78 at91_sys_write(AT91_SMC_CYCLE(3), 79 AT91_SMC_NWECYCLE_(7) | AT91_SMC_NRDCYCLE_(4)); 80 //讀操作是由 NRD 信號來控制的。 81 //寫操作是由 NWE 信號控制的 82 //NWAIT 是用來擴展當前的讀或?qū)懶盘柕?,它只在讀和寫控制信號的脈寬才會被考慮。如果NWAIT 啟用了,在讀和寫控制信號中必須設(shè)置至少一個周期。 83 //數(shù)據(jù)總線寬度8-位總線 84 //數(shù)據(jù)浮動時間: 外部設(shè)備在讀控制信號上升沿后釋放數(shù)據(jù)的整數(shù)個周期時間 85 at91_sys_write(AT91_SMC_MODE(3), 86 AT91_SMC_READMODE | AT91_SMC_WRITEMODE | 87 AT91_SMC_EXNWMODE_DISABLE | 88 #ifdef CFG_NAND_DBW_16 89 AT91_SMC_DBW_16 | 90 #else /* CFG_NAND_DBW_8 */ 91 AT91_SMC_DBW_8 | 92 #endif 93 AT91_SMC_TDF_(3)); 94 //外設(shè)時鐘開啟寄存器 并行IO控制器C 95 at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9G45_ID_PIOC); 96 97 /* Configure RDY/BSY */ 98 //輸入初始化 99 at91_set_gpio_input(AT91_PIN_PC8, 1);100 101 /* Enable NandFlash */102 //輸出初始化103 at91_set_gpio_output(AT91_PIN_PC14, 1);104 }105 #endif106 107 #ifdef CONFIG_HAS_DATAFLASH108 static void at91samm10g45ek_spi_hw_init(void)109 {110 at91_set_B_periph(AT91_PIN_PB3, 0); /* SPI0_NPCS0 */111 112 at91_set_B_periph(AT91_PIN_PB0, 0); /* SPI0_MISO */113 at91_set_B_periph(AT91_PIN_PB1, 0); /* SPI0_MOSI */114 at91_set_B_periph(AT91_PIN_PB2, 0); /* SPI0_SPCK */115 116 /* Enable clock */117 at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9G45_ID_SPI0);118 }119 #endif120 121 #ifdef CONFIG_MACB122 /***********md9161 reset test****************/123 //D5腳復位網(wǎng)卡124 static void macb_reset(void)125 {126 int i;127 128 at91_set_gpio_output(AT91_PIN_PD5,0);129 130 //puts("macb_reset... \n");131 for(i=0;i<500000;i++)132 {133 ;134 }135 136 // udelay(200*1000);137 138 at91_set_gpio_output(AT91_PIN_PD5,1);139 140 }141 142 /***************************************/143 static void at91samm10g45ek_macb_hw_init(void)144 {145 unsigned long rstc;146 147 // macb_reset();//reset dm9161148 149 /* Enable clock */150 at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9G45_ID_EMAC);151 152 /*153 * Disable pull-up on:154 * RXDV (PA15) => PHY normal mode (not Test mode)155 * ERX0 (PA12) => PHY ADDR0156 * ERX1 (PA13) => PHY ADDR1 => PHYADDR = 0x0157 *158 * PHY has internal pull-down159 */160 161 /*AC97*/162 //at91_set_A_periph(AT91_PIN_PD8, 0); /* AC97FS */163 //at91_set_A_periph(AT91_PIN_PD7, 0); /* AC97TX */164 //禁止上拉 A15 A12 A13165 writel(pin_to_mask(AT91_PIN_PA15) |166 pin_to_mask(AT91_PIN_PA12) |167 pin_to_mask(AT91_PIN_PA13),168 pin_to_controller(AT91_PIN_PA0) + PIO_PUDR);169 //讀取復位寄存模式寄存器170 rstc = at91_sys_read(AT91_RSTC_MR);171 172 /* Need to reset PHY -> 500ms reset */173 //KEY:應(yīng)該設(shè)為 0xA5。如果設(shè)成其他值,會中止寫操作174 //外部復位的時長,這個值為 2 (ERSTL+1) 個低速時鐘周期。所以這個值的范圍175 //檢測到 NRST (復位)引腳一個 low 電平,觸發(fā)一個用戶復位176 at91_sys_write(AT91_RSTC_MR, AT91_RSTC_KEY |177 (AT91_RSTC_ERSTL & (0x0D << 8)) |178 AT91_RSTC_URSTEN);179 // 復位控制器控制寄存器180 //外部復位:如果 KEY 正確,插入 NRST (復位)引腳181 at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_EXTRST);182 183 //復位控制器狀態(tài)寄存器184 //讀取以主控制器時鐘頻率(MCK)鎖存 NRST (復位)引腳的電平 目的:等待硬件復位結(jié)束185 while (!(at91_sys_read(AT91_RSTC_SR) & AT91_RSTC_NRSTL));186 187 /* Restore NRST value */188 //如果檢測到 NRST (復位)引腳一個 low 電平,觸發(fā)一個用戶復位189 at91_sys_write(AT91_RSTC_MR, AT91_RSTC_KEY |190 (rstc) |191 AT91_RSTC_URSTEN);192 //使能上拉 A15 A12 A13193 /* Re-enable pull-up */194 writel(pin_to_mask(AT91_PIN_PA15) |195 pin_to_mask(AT91_PIN_PA12) |196 pin_to_mask(AT91_PIN_PA13),197 pin_to_controller(AT91_PIN_PA0) + PIO_PUER);198 199 //at91_set_gpio_output(AT91_PIN_PA30,1); //pull up PA30200 //復用IO A10-19 為A設(shè)備201 at91_set_A_periph(AT91_PIN_PA17, 0); /* ETXCK_EREFCK */202 at91_set_A_periph(AT91_PIN_PA15, 0); /* ERXDV */203 at91_set_A_periph(AT91_PIN_PA12, 0); /* ERX0 */204 at91_set_A_periph(AT91_PIN_PA13, 0); /* ERX1 */205 at91_set_A_periph(AT91_PIN_PA16, 0); /* ERXER */206 at91_set_A_periph(AT91_PIN_PA14, 0); /* ETXEN */207 at91_set_A_periph(AT91_PIN_PA10, 0); /* ETX0 */208 at91_set_A_periph(AT91_PIN_PA11, 0); /* ETX1 */209 at91_set_A_periph(AT91_PIN_PA19, 0); /* EMDIO */210 at91_set_A_periph(AT91_PIN_PA18, 0); /* EMDC */211 212 #ifndef CONFIG_RMII213 //復用IO A6-9 A27-30 為B設(shè)備214 at91_set_B_periph(AT91_PIN_PA29, 0); /* ECRS */215 at91_set_B_periph(AT91_PIN_PA30, 0); /* ECOL */216 at91_set_B_periph(AT91_PIN_PA8, 0); /* ERX2 */217 at91_set_B_periph(AT91_PIN_PA9, 0); /* ERX3 */218 at91_set_B_periph(AT91_PIN_PA28, 0); /* ERXCK */219 at91_set_B_periph(AT91_PIN_PA6, 0); /* ETX2 */220 at91_set_B_periph(AT91_PIN_PA7, 0); /* ETX3 */221 at91_set_B_periph(AT91_PIN_PA27, 0); /* ETXER */222 #endif223 macb_reset();//reset dm9161224 //printf("macb_reset...\n");225 }226 #endif227 228 #ifdef CONFIG_LCD229 vidinfo_t panel_info = {230 vl_col: 480,231 vl_row: 272,232 vl_clk: 125000,233 vl_sync: ATMEL_LCDC_INVLINE_NORMAL |234 ATMEL_LCDC_INVFRAME_NORMAL,235 vl_bpix: 3,236 vl_tft: 1,237 vl_hsync_len: 41,238 vl_left_margin: 2,239 vl_right_margin:2,240 vl_vsync_len: 1,241 vl_upper_margin:2,242 vl_lower_margin:2,243 mmio: AT91SAM9G45_LCDC_BASE,244 };245 246 void lcd_enable(void)247 {248 at91_set_gpio_value(AT91_PIN_PE6, 1); /* power up */249 }250 251 void lcd_disable(void)252 {253 at91_set_gpio_value(AT91_PIN_PE6, 0); /* power down */254 }255 256 static void at91samm10g45ek_lcd_hw_init(void)257 {258 at91_set_A_periph(AT91_PIN_PE0, 0); /* LCDDPWR */259 260 at91_set_A_periph(AT91_PIN_PE4, 0); /* LCDHSYNC */261 at91_set_A_periph(AT91_PIN_PE5, 0); /* LCDDOTCK */262 263 at91_set_gpio_input(AT91_PIN_PE6, 0); /* LCDDEN */264 265 at91_set_A_periph(AT91_PIN_PE7, 0); /* LCDD0 */266 at91_set_A_periph(AT91_PIN_PE8, 0); /* LCDD1 */267 at91_set_A_periph(AT91_PIN_PE9, 0); /* LCDD2 */268 at91_set_A_periph(AT91_PIN_PE10, 0); /* LCDD3 */269 at91_set_A_periph(AT91_PIN_PE11, 0); /* LCDD4 */270 at91_set_A_periph(AT91_PIN_PE12, 0); /* LCDD5 */271 at91_set_A_periph(AT91_PIN_PE13, 0); /* LCDD6 */272 at91_set_A_periph(AT91_PIN_PE14, 0); /* LCDD7 */273 at91_set_A_periph(AT91_PIN_PE15, 0); /* LCDD8 */274 at91_set_A_periph(AT91_PIN_PE16, 0); /* LCDD9 */275 at91_set_A_periph(AT91_PIN_PE17, 0); /* LCDD10 */276 at91_set_A_periph(AT91_PIN_PE18, 0); /* LCDD11 */277 at91_set_A_periph(AT91_PIN_PE19, 0); /* LCDD12 */278 at91_set_B_periph(AT91_PIN_PE20, 0); /* LCDD13 */279 at91_set_A_periph(AT91_PIN_PE21, 0); /* LCDD14 */280 at91_set_A_periph(AT91_PIN_PE22, 0); /* LCDD15 */281 at91_set_A_periph(AT91_PIN_PE23, 0); /* LCDD16 */282 at91_set_A_periph(AT91_PIN_PE24, 0); /* LCDD17 */283 at91_set_A_periph(AT91_PIN_PE25, 0); /* LCDD18 */284 at91_set_A_periph(AT91_PIN_PE26, 0); /* LCDD19 */285 at91_set_A_periph(AT91_PIN_PE27, 0); /* LCDD20 */286 at91_set_B_periph(AT91_PIN_PE28, 0); /* LCDD21 */287 at91_set_A_periph(AT91_PIN_PE29, 0); /* LCDD22 */288 at91_set_A_periph(AT91_PIN_PE30, 0); /* LCDD23 */289 290 at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9G45_ID_LCDC);291 292 gd->fb_base = AT91SAM9G45_SRAM_BASE;293 }294 #endif295 296 #if defined(CONFIG_MACB) && defined(CONFIG_CMD_NET)297 extern int macb_eth_initialize(int id, void *regs, unsigned int phy_addr);298 299 int board_eth_init(bd_t *bis)300 {301 macb_eth_initialize(0, (void *)AT91SAM9G45_BASE_EMAC, 0x00);302 }303 #endif304 305 int board_init(void)306 {307 /* Enable Ctrlc */308 console_init_f();309 /* arch number of AT91SAM9M10G45EK-Board */310 #ifdef CONFIG_AT91SAM9M10G45EK311 gd->bd->bi_arch_number = MACH_TYPE_AT91SAM9M10G45EK;312 #elif defined CONFIG_AT91SAM9G45EKES313 gd->bd->bi_arch_number = MACH_TYPE_AT91SAM9G45EKES;314 #elif defined CONFIG_AT91SAM9M10EKES315 gd->bd->bi_arch_number = MACH_TYPE_AT91SAM9M10EKES;316 #endif317 /* adress of boot parameters */318 gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;//啟動參數(shù)地址,DDR內(nèi)存位置319 320 at91samm10g45ek_serial_hw_init();321 #ifdef CONFIG_CMD_NAND322 at91samm10g45ek_nand_hw_init();323 #endif324 #ifdef CONFIG_HAS_DATAFLASH325 at91samm10g45ek_spi_hw_init();326 #endif327 #ifdef CONFIG_MACB328 at91samm10g45ek_macb_hw_init();329 #endif330 331 #ifdef CONFIG_LCD332 at91samm10g45ek_lcd_hw_init();333 #endif334 return 0;335 }336 337 int dram_init(void)338 {339 gd->bd->bi_dram[0].start = PHYS_SDRAM;340 gd->bd->bi_dram[0].size = PHYS_SDRAM_SIZE;341 printf("\n++++++++++++++++++++++++++++++++++++++++++++\n");342 return 0;343 }344 345 #ifdef CONFIG_RESET_PHY_R346 void reset_phy(void)347 {348 #ifdef CONFIG_MACB349 /*350 * Initialize ethernet HW addr prior to starting Linux,351 * needed for nfsroot352 */353 //puts("reset_phy \n");354 eth_init(gd->bd);355 #endif356 }357 #endif
3.4 board.c中NAND初始化
1)?drivers\mtd\nand\nand.c標準函數(shù)nand_init->nand_init_chip->board_nand_init
2) 增加nand文件board\atmel\at91sam9m10g45ek\nand.c
2.1)?board_nand_init初始化函數(shù)
2.1.1) 初始化eccmode 軟件ECC對應(yīng)字節(jié)數(shù)
2.1.2) 初始化options 總線寬度
2.1.3) 初始化hwcontrol?硬件控制函數(shù)
2.1.4) 初始化dev_ready 準備就緒函數(shù)
2.1.5) 初始化chip_delay?芯片時序延遲參數(shù)
2.2)?hwcontrol?硬件控制函數(shù)
2.3)?dev_ready 準備就緒函數(shù)
3.5 board.c中NOR初始化 使用的AT45DB161 2M NOR Flash
1) drivers\mtd\dataflash.c標準函數(shù)AT91F_DataflashInit->AT91F_SpiInit->AT91F_DataflashProbe 得到ID=c2 即AT45DB161
2) 依據(jù)ID初始化頁數(shù)量、頁大小、頁偏移、基地址
?
評論