u-boot移植过程
目的:移植u-boot至FL2440开发板
操作系统:CentOS6.7(虚拟机)
开发板:FL2440开发板
交叉编译器:buildroot-2012.08
调试终端:SecureCRT
1.准备 u-boot 源码,U-boot 源码中添加 FL2440 开发板
-COBJS := smdk2410.o flash.o
+COBJS := fl2440.o flash.o
657 @@ -238,6 +238,7 @@
658 sbc2410x arm arm920t - - s3c24x0
659 smdk2400 arm arm920t - samsung s3c24x0
660 smdk2410 arm arm920t - samsung s3c24x0
661 +fl2440 arm arm920t fl2440 lingyun s3c24x0
662 voiceblue arm arm925t
663 omap1510inn arm arm925t - ti
664 afeb9260 arm arm926ejs - - at91
1.1 U-boot 初步编译测试
[luminqi@localhost u-boot-2010.09]$ vim Makefile
960 @@ -157,7 +157,7 @@
961
962 # set default to nothing for native builds
963 ifeq ($(HOSTARCH),$(ARCH))
964 -CROSS_COMPILE ?=
965 +CROSS_COMPILE ?== /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-
966 endif
967
968 # load other configuration
## 这里是交叉编译器的链路径,'=='后面不要留空格,否则找不到交叉编译器的路径##
进入顶层Makefile,有很多相对不同板子的配置,配置编译uboot第一步都是make *****_config。既然是make就得执行Makefile。Makefile就包括很多上面的语句,make *****_config,首先执行的就是上面的配置信息,这里即执行fl2440的配置。make xx_config会生成一个.config的隐藏文件。
这时候编译出来的 u-boot.bin 就是要烧到开发板上的 u-boot 文件,但这个代码是基于smdk2410 开发板的,我们并没有对这个代码作任何的修改,所以这个 bin 文件只能在smdk2410 这个开发板上跑。如果想运行在 FL2440 这个开发板上,接下来我们就要开始对源代码进行修改。
2.U-boot 移植之第一阶段汇编代码分析与修改
2.1 start.S 分析与修改
之前我们分析过 u-boot 是从 start.S 开始执行的,所以我们从 start.S 开始修改。
55 @@ -114,8 +114,8 @@
56 orr r0, r0, #0xd3
57 msr cpsr, r0
58
59 - bl coloured_LED_init
60 - bl red_LED_on
61 + @bl coloured_LED_init
62 + @bl red_LED_on
63
64 #if defined(CONFIG_AT91RM9200DK) || defined(CONFIG_AT91RM9200EK)
65 /*
66 @@ -159,13 +159,58 @@
67 ldr r1, =0x3ff
68 ldr r0, =INTSUBMSK
69 str r1, [r0]
70 -# endif
71
72 +#elif defined CONFIG_S3C2440
73 + ldr r1, =0x7fff
74 + ldr r0, =INTSUBMSK
75 + str r1, [r0]
76 +
77 +# endif
78 +# if defined(CONFIG_S3C2440)
79 +#define GPBCON 0x56000010
80 +#define GPBDAT 0x56000014
81 +#define GPBUP 0x56000018
82 +/*Set GPIO5, GPIO6, GPIO8, GPIO10 as GPIO OUTPUT mode*/
83 +ldr r0, =GPBCON
84 +ldr r1, [r0]
85 +bic r1, r1, #0x3c00 /*Set GPBCON for GPIO5,GPIO6 as 0x00 */
86 +orr r1, r1, #0x1400 /*Set GPBCON for GPIO5,GPIO6 as GPIOOUT, 0x01*/
87 +bic r1, r1, #0x00330000 /*Set GPBCON for GPIO8,GPIO10 as 0x00*/
88 +orr r1, r1, #0x00110000 /*Set GPBCON for GPIO8,GPIO10 as GPIOOUT, 0x01*/
89 +str r1, [r0]
90 +
91 +/*Set internal pullup resister*/
92 +ldr r0, =GPBUP
93 +ldr r1, [r0]
94 +orr r1, r1, #0x0560 /*Set bit 5,6,8,10, disable pullup resister*/
95 +str r1, [r0]
96 +ldr r2, =GPBDAT
97 +ldr r3, [r2]
98 +orr r3, r3, #0x0560 /*Set bit 5,6,8,10 as high level, Turn Off LED*/
99 +str r3, [r2]
100 +
101 +# define MPLLCON 0x4C000004
102 +# define MDIV_405 0x7f << 12
103 +# define PSDIV_405 0x21
104 +
105 +/* FCLK:HCLK:PCLK = 1:4:8 */
106 +ldr r0, =CLKDIVN
107 +mov r1, #0x05
108 +str r1, [r0]
109 +mrc p15, 0, r1, c1, c0, 0
110 +orr r1, r1, #0xc0000000
111 +mcr p15, 0, r1, c1, c0, 0
112 +Ldr r0,=MPLLCON
113 +mov r1, #MDIV_405
114 +add r1, r1, #PSDIV_405
115 +str r1, [r0]
116 +#else /*S3C2410, S3C2440 */
117 /* FCLK:HCLK:PCLK = 1:2:4 */
118 /* default FCLK is 120 MHz ! */
119 ldr r0, =CLKDIVN
120 mov r1, #3
121 str r1, [r0]
122 +#endif /* end of if defined(CONFIG_S3C2440) */
123 #endif /* CONFIG_S3C24X0 */
124
125 /*
126 @@ -183,6 +228,79 @@
127 cmp r0, r1 /* don't reloc during debug */
128 beq stack_setup
129
130 +judgment_norflash_nandflash_boot:
131 + ldr r1, =( (4<<28)|(3<<4)|(3<<2) )
132 + mov r0, #0
133 + str r0, [r1]
134 + mov r1, #0x3c
135 + ldr r0, [r1]
136 + cmp r0, #0
137 + bne norflash_boot
138 +/*Nandflash boot going here, recovery address 0x0000003C date*/
139 + ldr r0, =(0xdeadbeef)
140 + ldr r1, =( (4<<28)|(3<<4)|(3<<2) )
141 + str r0, [r1]
142 +
143 +nandflash_boot:
144 +#define LENGTH_UBOOT 0x60000
145 +#define NAND_CTL_BASE 0x4E000000
146 +/* Offset */
147 +#define oNFCONF 0x00
148 +#define oNFCONT 0x04
149 +#define oNFCMD 0x08
150 +#define oNFSTAT 0x20
151 + mov r1, #NAND_CTL_BASE
152 + ldr r2, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )
153 + str r2, [r1, #oNFCONF]
154 + ldr r2, [r1, #oNFCONF]
155 + ldr r2, =( (1<<4)|(0<<1)|(1<<0) ) @ Active low CE Control
156 + str r2, [r1, #oNFCONT]
157 + ldr r2, [r1, #oNFCONT]
158 + ldr r2, =(0x6) @ RnB Clear
159 + str r2, [r1, #oNFSTAT]
160 + ldr r2, [r1, #oNFSTAT]
161 + mov r2, #0xff @ RESET command
162 + strb r2, [r1, #oNFCMD]
163 + mov r3, #0 @ wait
164 +nand_delay:
165 + add r3, r3, #0x1
166 + cmp r3, #0xa
167 + blt nand_delay
168 +nand_wait:
169 + ldr r2, [r1, #oNFSTAT] @ wait ready
170 + tst r2, #0x4
171 + beq nand_wait
172 + ldr r2, [r1, #oNFCONT]
173 + orr r2, r2, #0x2 @ Flash Memory Chip Disable
174 + str r2, [r1, #oNFCONT]
175 + ldr sp, DW_STACK_START @ setup stack pointer
176 + mov fp, #0 @ no previous frame, so fp=0
177 + ldr r0, =TEXT_BASE
178 + mov r1, #0x0
179 + mov r2, #LENGTH_UBOOT
180 + bl nand_read_ll
181 + tst r0, #0x0
182 + beq ok_nand_read
183 +bad_nand_read:
184 +dead_loop:
185 + b dead_loop @ infinite loop
186 +ok_nand_read:
187 + @ verify
188 + mov r0, #0
189 + ldr r1, =TEXT_BASE
190 + mov r2, #0x400
191 +go_next:
192 + ldr r3, [r0], #4
193 + ldr r4, [r1], #4
194 + teq r3, r4
195 + bne notmatch
196 + subs r2, r2, #4
197 + beq stack_setup
198 + bne go_next
199 +notmatch:
200 +infinite_loop:
201 + b infinite_loop @ infinite loop
202 +norflash_boot:
203 ldr r2, _armboot_start
204 ldr r3, _bss_start
205 sub r2, r3, r2 /* r2 <- size of armboot */
206 @@ -215,12 +333,21 @@
207 add r0, r0, #4
208 cmp r0, r1
209 ble clbss_l
210 + ldr r1, =GPBDAT
211 + ldr r2, [r1]
212 + bic r2, r2, #(1<<5)
213 + str r2, [r1]
214
215 ldr pc, _start_armboot
216
217 _start_armboot: .word start_armboot
218
219 -
220 +#ifdef CONFIG_S3C24X0
221 +#define STACK_BASE 0x33f00000
222 +#define STACK_SIZE 0x10000
223 + .align 2
224 +DW_STACK_START: .word STACK_BASE+STACK_SIZE-4
225 +#endif
2.2 lowlevel_init.S 分析与修改
394 @@ -51,7 +51,7 @@
395 #define WAIT (0x1<<2)
396 #define UBLB (0x1<<3)
397
398 -#define B1_BWSCON (DW32)
399 +#define B1_BWSCON (DW16)
400 #define B2_BWSCON (DW16)
401 #define B3_BWSCON (DW16 + WAIT + UBLB)
402 #define B4_BWSCON (DW16)
403 @@ -120,10 +120,17 @@
404 /* REFRESH parameter */
405 #define REFEN 0x1 /* Refresh enable */
406 #define TREFMD 0x0 /* CBR(CAS before RAS)/Auto refresh */
407 +#if defined(CONFIG_S3C2440)
408 +#define Trp 0x2 /* 4clk */
409 +#define Trc 0x3 /* 7clk */
410 +#define Tchr 0x2
411 +#define REFCNT 1268
412 +#else
413 #define Trp 0x0 /* 2clk */
414 #define Trc 0x3 /* 7clk */
415 #define Tchr 0x2 /* 3clk */
416 #define REFCNT 1113 /* period=15.6us, HCLK=60Mhz, (2048+1-15.6*60) */
417 +#endif
418 /**************************************/
419
420 _TEXT_BASE:
421 @@ -135,8 +142,10 @@
422 /* make r0 relative the current location so that it */
423 /* reads SMRDATA out of FLASH rather than memory ! */
424 ldr r0, =SMRDATA
425 - ldr r1, _TEXT_BASE
426 + ldr r1, =lowlevel_init
427 sub r0, r0, r1
428 + adr r3, lowlevel_init /* r3 <- current position of code */
429 + add r0, r0, r3
430 ldr r1, =BWSCON /* Bus Width Status Controller */
431 add r2, r0, #13*4
432 0:
433 @@ -162,6 +171,6 @@
434 .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))
435 .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))
436 .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)
437 - .word 0x32
438 + .word 0xb2
439 .word 0x30
440 .word 0x30
2.3添加从 nandflash 拷贝 U-boot 到 SDRAM 中去的 SDRAM 的 C 代码源文件 nand_read.c
456 @@ -0,0 +1,197 @@
457 +/*
458 + *nand_read.c: Simple NAND read functions for booting from NAND
459 + *
460 + * This is used by cpu/arm920/start.S assembler code,
461 + * and the board-specific linker script must make sure this
462 + * file is linked within the first 4kB of NAND flash.
463 + *
464 + * Taken from GPLv2 licensed vivi bootloader,
465 + * Copyright (C) 2002 MIZI Research, Inc.
466 + * *
467 + * Author: Hwang, Chideok <hwang@mizi.com>
468 + * Date : $Date: 2004/02/04 10:37:37 $
469 + *
470 + * u-boot integration and bad-block skipping (C) 2006 by OpenMoko, Inc.
471 + * Author: Harald Welte <laforge@openmoko.org>
472 + */
473 +
474 +#include <common.h>
475 +#include <linux/mtd/nand.h>
476 +#define __REGb(x) (*(volatile unsigned char *)(x))
477 +#define __REGw(x) (*(volatile unsigned short *)(x))
478 +#define __REGi(x) (*(volatile unsigned int *)(x))
479 +#define NF_BASE 0x4e000000
480 +#if defined(CONFIG_S3C2410)
481 +#define NFCONF __REGi(NF_BASE + 0x0)
482 +#define NFCMD __REGb(NF_BASE + 0x4)
483 +#define NFADDR __REGb(NF_BASE + 0x8)
484 +#define NFDATA __REGb(NF_BASE + 0xc)
485 +#define NFSTAT __REGb(NF_BASE + 0x10)
486 +#define NFSTAT_BUSY 1
487 +#define nand_select() (NFCONF &= ~0x800)
488 +#define nand_deselect() (NFCONF |= 0x800)
489 +#define nand_clear_RnB() do {} while (0)
490 +#elif defined(CONFIG_S3C2440) || defined(CONFIG_S3C2442)
491 +#define NFCONF __REGi(NF_BASE + 0x0)
492 +#define NFCONT __REGi(NF_BASE + 0x4)
493 +#define NFCMD __REGb(NF_BASE + 0x8)
494 +#define NFADDR __REGb(NF_BASE + 0xc)
495 +#define NFDATA __REGb(NF_BASE + 0x10)
496 +#define NFDATA16 __REGw(NF_BASE + 0x10)
497 +#define NFSTAT __REGb(NF_BASE + 0x20)
498 +#define NFSTAT_BUSY 1
499 +#define nand_select() (NFCONT &= ~(1 << 1))
500 +#define nand_deselect() (NFCONT |= (1 << 1))
501 +#define nand_clear_RnB() (NFSTAT |= (1 << 2))
502 +#endif
503 +
504 +static inline void nand_wait(void)
505 +{
506 + int i;
507 + while (!(NFSTAT & NFSTAT_BUSY))
508 + for (i=0; i<10; i++);
509 +}
51511 +struct boot_nand_t {
512 + int page_size;
513 + int block_size;
514 + int bad_block_offset;
515 +};
516 +
517 +static int is_bad_block(struct boot_nand_t * nand, unsigned long i)
518 +{
519 + unsigned char data;
520 + unsigned long page_num;
521 + nand_clear_RnB();
522 + if (nand->page_size == 512) {
523 + NFCMD = NAND_CMD_READOOB; /* 0x50 */
524 + NFADDR = nand->bad_block_offset & 0xf;
525 + NFADDR = (i >> 9) & 0xff;
526 + NFADDR = (i >> 17) & 0xff;
527 + NFADDR = (i >> 25) & 0xff;
528 + } else if (nand->page_size == 2048) {
529 + page_num = i >> 11; /* addr / 2048 */
530 + NFCMD = NAND_CMD_READ0;
531 + NFADDR = nand->bad_block_offset & 0xff;
532 + NFADDR = (nand->bad_block_offset >> 8) & 0xff;
533 + NFADDR = page_num & 0xff;
534 + NFADDR = (page_num >> 8) & 0xff;
535 + NFADDR = (page_num >> 16) & 0xff;
536 + NFCMD = NAND_CMD_READSTART;
537 + } else {
538 + return -1;
539 + }
540 + nand_wait();
541 + data = (NFDATA & 0xff);
542 + if (data != 0xff)
543 + return 1;
544 + return 0;
545 +}
546 +
547 +static int nand_read_page_ll(struct boot_nand_t * nand, unsigned char *buf, unsigned long addr)
548 +{
549 + unsigned short *ptr16 = (unsigned short *)buf;
550 + unsigned int i, page_num;
551 + nand_clear_RnB();
552 + NFCMD = NAND_CMD_READ0;
553 + if (nand->page_size == 512) {
554 + /* Write Address */
555 + NFADDR = addr & 0xff;
556 + NFADDR = (addr >> 9) & 0xff;
557 + NFADDR = (addr >> 17) & 0xff;
558 + NFADDR = (addr >> 25) & 0xff;
559 + } else if (nand->page_size == 2048) {
560 + page_num = addr >> 11; /* addr / 2048 */
561 + /* Write Address */
562 + NFADDR = 0;
563 + NFADDR = 0;
564 + NFADDR = page_num & 0xff;
565 + NFADDR = (page_num >> 8) & 0xff;
566 + NFADDR = (page_num >> 16) & 0xff;
567 + NFCMD = NAND_CMD_READSTART;
568 + } else {
569 + return -1;
570 + }
571 + nand_wait();
572 +#if defined(CONFIG_S3C2410)
573 + for (i = 0; i < nand->page_size; i++) {
574 + *buf = (NFDATA & 0xff);
575 + buf++;
576 + }
577 +#elif defined(CONFIG_S3C2440) || defined(CONFIG_S3C2442)
578 + for (i = 0; i < (nand->page_size>>1); i++) {
579 + *ptr16 = NFDATA16;
580 + ptr16++;
581 + }
582 +#endif
583 + return nand->page_size;
584 +}
585 +
586 +static unsigned short nand_read_id()
587 +{
588 + unsigned short res = 0;
588 + unsigned short res = 0;
589 + NFCMD = NAND_CMD_READID;
590 + NFADDR = 0;
591 + res = NFDATA;
592 + res = (res << 8) | NFDATA;
593 + return res;
594 +}
595 +extern unsigned int dynpart_size[];
596 +
597 +/* low level nand read function */
598 +int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
599 +{
600 + int i, j;
601 + unsigned short nand_id;
602 + struct boot_nand_t nand;
603 +
604 + /* chip Enable */
605 + nand_select();
606 + nand_clear_RnB();
607 + for (i = 0; i < 10; i++)
608 + ;
609 + nand_id = nand_read_id();
610 + if (0) { /* dirty little hack to detect if nand id is misread */
611 + unsigned short * nid = (unsigned short *)0x31fffff0;
612 + *nid = nand_id;
613 + }
614 + if (nand_id == 0xec76 || /* Samsung K91208 on SD2410 board */
615 + nand_id == 0xad76 ) { /*Hynix HY27US08121A*/
616 + nand.page_size = 512;
617 + nand.block_size = 16 * 1024;
618 + nand.bad_block_offset = 5;
619 + // nand.size = 0x4000000;
620 + } else if (nand_id == 0xecf1 || /* Samsung K9F1G08U0B */
621 + nand_id == 0xadda || /* Hynix HY27UF082G2B on FL2440 board */
622 + nand_id == 0xecda || /* Samsung K9F2G08U0B on FL2440 board */
623 + nand_id == 0xecd3 ) { /* Samsung K9K8G08 */
624 + nand.page_size = 2048;
625 + nand.block_size = 128 * 1024;
626 + nand.bad_block_offset = nand.page_size;
627 + // nand.size = 0x8000000;
628 + } else {
629 + return -1; // hang
630 +}
631 + if ((start_addr & (nand.block_size-1)) || (size & ((nand.block_size-1))))
632 + return -1; /* invalid alignment */
633 + for (i=start_addr; i < (start_addr + size);) {
634 +#ifdef CONFIG_S3C2410_NAND_SKIP_BAD
635 + if (i & (nand.block_size-1)== 0) {
636 + if (is_bad_block(&nand, i) ||
637 + is_bad_block(&nand, i + nand.page_size)) {
638 + /* Bad block */
639 + i += nand.block_size;
640 + size += nand.block_size;
641 + continue;
642 + }
643 + }
644 +#endif
645 + j = nand_read_page_ll(&nand, buf, i);
646 + i += j;
647 + buf += j;
648 + }
649 +
650 + /* chip Disable */
651 + nand_deselect();
652 + return 0;
653 +}
//这里的nand_read.c是郭工给的,要自己添加
2.4修改 board/lingyun/fl2440/Makefile,添加 nand_read.c 文件的编译支持
COBJS := fl2440.o nand_read.o flash.o
//添加nand_read.o
2.5为了保证 nand_read.c 和 lowlevel_init.c 编译出来的代码在 u-boot.bin 的前 4K 位置,我们需要修改 u-boot 链接文件 arch/arm/cpu/arm920t/u-boot.lds
232 @@ -40,6 +40,8 @@
233 .text :
234 {
235 arch/arm/cpu/arm920t/start.o (.text)
236 + board/lingyun/fl2440/lowlevel_init.o (.text)
237 + board/lingyun/fl2440/nand_read.o (.text)
238 *(.text)
239 }
240
3.U-boot 移植之第二阶段 C 代码修改
添加 CONFIG_S3C2440 条件编译
对 于 S3C2440 , 很 多 代 码 是 借 用 S3C2410 的 , 所 以 要 在 所 有 条 件 编 译 中 有CONFIG_S3C2410 的地方添加 CONFIG_S3C2440,这样这些代码才会编译进来。一个简单的方法就是在代码中搜索出所有的 CONFIG_S3C2410,并根据实际情况修改。在有些地方不仅要加入 CONFIG_S3C2440,还必须根据两个芯片的不同来分布做出修改,比如 PLL 的操作代码。
3.1在前面我们是基于 SMDK2410 开发板的来建立的 FL2440 开发板代码,而 SMDK2410 使用的是 S3C2410,CONFIG_S3C2410 是定义在头文件 include/configs/smdk2410.h 中。而我们的 include/configs/fl2440.h 头文件是由它拷贝而来的,所以我们要对这个头文件做如下修改,添加 CONFIG_S3C2440 的定义:
修改串口代码,添加 CONFIG_S3C2440 的支持
830 @@ -35,8 +35,8 @@
831 */
832 #define CONFIG_ARM920T 1 /* This is an ARM920T Core */
833 #define CONFIG_S3C24X0 1 /* in a SAMSUNG S3C24x0-type SoC */
834 -#define CONFIG_S3C2410 1 /* specifically a SAMSUNG S3C2410 SoC */
835 -#define CONFIG_SMDK2410 1 /* on a SAMSUNG SMDK2410 Board */
836 +#define CONFIG_S3C2440 1 /* specifically a SAMSUNG S3C2440 SoC */
837 +#define CONFIG_FL2440 1 /* FL2440 board */
838
839 /* input clock of PLL */
840 #define CONFIG_SYS_CLK_FREQ 12000000/* the SMDK2410 has 12MHz input clock */
3.2修改串口代码,添加 CONFIG_S3C2440 的支持
[luminqi@centos6 u-boot-2010.09]$ vim include/serial.h
948 @@ -46,7 +46,7 @@
949 extern struct serial_device serial6_device;
950 #endif
951
952 -#if defined(CONFIG_S3C2410)
953 +#if defined(CONFIG_S3C2410)|| defined(CONFIG_S3C2440)
954 extern struct serial_device s3c24xx_serial0_device;
955 extern struct serial_device s3c24xx_serial1_device;
956 extern struct serial_device s3c24xx_serial2_device;
[lingyun@centos6 u-boot-2010.09]$ vim common/serial.c
683 @@ -68,7 +68,7 @@
684 #else
685 #error "Bad CONFIG_PSC_CONSOLE."
686 #endif
687 -#elif defined(CONFIG_S3C2410)
688 +#elif defined(CONFIG_S3C2410)|| defined(CONFIG_S3C2440)
689 #if defined(CONFIG_SERIAL1)
690 return &s3c24xx_serial0_device;
691 #elif defined(CONFIG_SERIAL2)
692 @@ -157,7 +157,7 @@
693 #if defined (CONFIG_STUART)
694 serial_register(&serial_stuart_device);
695 #endif
696 -#if defined(CONFIG_S3C2410)
697 +#if defined(CONFIG_S3C2410)|| defined(CONFIG_S3C2440)
698 serial_register(&s3c24xx_serial0_device);
699 serial_register(&s3c24xx_serial1_device);
700 serial_register(&s3c24xx_serial2_device);
3.3修改 arch/arm/include/asm/arch-s3c24x0/s3c24x0_cpu.h
244 @@ -20,7 +20,7 @@
245
246 #ifdef CONFIG_S3C2400
247 #include <asm/arch/s3c2400.h>
248 -#elif defined CONFIG_S3C2410
249 +#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
250 #include <asm/arch/s3c2410.h>
251 #else
252 #error Please define the s3c24x0 cpu type
3.4修改 arch/arm/include/asm/arch-s3c24x0/s3c24x0.h
256 @@ -78,7 +78,7 @@
257 u32 PRIORITY;
258 u32 INTPND;
259 u32 INTOFFSET;
260 -#ifdef CONFIG_S3C2410
261 +#if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
262 u32 SUBSRCPND;
263 u32 INTSUBMSK;
264 #endif
265 @@ -88,11 +88,11 @@
266 /* DMAS (see manual chapter 8) */
267 struct s3c24x0_dma {
268 u32 DISRC;
269 -#ifdef CONFIG_S3C2410
270 +#if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
271 u32 DISRCC;
272 #endif
273 u32 DIDST;
274 -#ifdef CONFIG_S3C2410
275 +#if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
276 u32 DIDSTC;
277 #endif
278 u32 DCON;
279 @@ -103,7 +103,7 @@
280 #ifdef CONFIG_S3C2400
281 u32 res[1];
282 #endif
283 -#ifdef CONFIG_S3C2410
284 +#if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
285 u32 res[7];
286 #endif
287 };
288 @@ -122,6 +122,9 @@
289 u32 CLKCON;
290 u32 CLKSLOW;
291 u32 CLKDIVN;
292 +#if defined (CONFIG_S3C2440)
293 + u32 CAMDIVN;
294 +#endif
295 };
296
297
298 @@ -141,7 +144,7 @@
299 u32 res[8];
300 u32 DITHMODE;
301 u32 TPAL;
302 -#ifdef CONFIG_S3C2410
303 +#if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
304 u32 LCDINTPND;
305 u32 LCDSRCPND;
306 u32 LCDINTMSK;
307 @@ -151,6 +154,7 @@
308
309
310 /* NAND FLASH (see S3C2410 manual chapter 6) */
311 +#if defined(CONFIG_S3C2410)
312 struct s3c2410_nand {
313 u32 NFCONF;
314 u32 NFCMD;
315 @@ -159,6 +163,26 @@
316 u32 NFSTAT;
317 u32 NFECC;
318 };
319 +#elif defined (CONFIG_S3C2440)
320 +struct s3c2410_nand {
321 +u32 NFCONF;
322 +u32 NFCONT;
323 +u32 NFCMD;
324 +u32 NFADDR;
325 +u32 NFDATA;
326 +u32 NFMECCD0;
327 +u32 NFMECCD1;
328 +u32 NFSECCD;
329 +u32 NFSTAT;
330 +u32 NFESTAT0;
331 +u32 NFESTAT1;
332 +u32 NFMECC0;
333 +u32 NFMECC1;
334 +u32 NFSECC;
335 +u32 NFSBLK;
336 +u32 NFEBLK;
337 +};
338 +#endif
339
340
341 /* UART (see manual chapter 11) */
342 @@ -397,7 +421,7 @@
343 u32 MISCCR;
344 u32 EXTINT;
345 #endif
346 -#ifdef CONFIG_S3C2410
347 +#if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
348 u32 GPACON;
349 u32 GPADAT;
350 u32 res1[2];
351 @@ -446,6 +470,13 @@
352 u32 GSTATUS2;
353 u32 GSTATUS3;
354 u32 GSTATUS4;
355 +#if defined (CONFIG_S3C2440)
356 + u32 res9[3];
357 + u32 MSLCON;
358 + u32 GPJCON;
359 + u32 GPJDAT;
360 + u32 GPJUP;
361 +#endif
362 #endif
363 };
364
3.5修改 arch/arm/cpu/arm920t/s3c24x0/timer.c
44 @@ -181,6 +181,7 @@
45 tbclk = timer_load_val * 100;
46 #elif defined(CONFIG_SBC2410X) || \
47 defined(CONFIG_SMDK2410) || \
48 + defined(CONFIG_FL2440) || \
49 defined(CONFIG_VCMA9)
50 tbclk = CONFIG_SYS_HZ;
51 #else
3.6 S3C2440 的时钟管理和 S3C2410 有很大区别,需要修改 arch/arm/cpu/arm920t/s3c24x0/speed.c源文件。
4 @@ -64,6 +64,12 @@
5 p = ((r & 0x003F0) >> 4) + 2;
6 s = r & 0x3;
7
8 +#if defined(CONFIG_S3C2440)
9 + if (pllreg == MPLL)
10 + return ((CONFIG_SYS_CLK_FREQ * m * 2) /(p << s));
11 + else if (pllreg == UPLL)
12 +#endif
13 +
14 return (CONFIG_SYS_CLK_FREQ * m) / (p << s);
15 }
16
17 @@ -77,8 +83,22 @@
18 ulong get_HCLK(void)
19 {
20 struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
21 -
22 +#if defined(CONFIG_S3C2440)
23 + if (readl(&clk_power->CLKDIVN) & 0x6)
24 + {
25 + if ((readl(&clk_power->CLKDIVN) & 0x6)==2)
26 + return(get_FCLK()/2);
27 + if ((readl(&clk_power->CLKDIVN) & 0x6)==6)
28 + return((readl(&clk_power->CAMDIVN) & 0x100) ? get_FCLK()/6 :get_FCLK()/3);
29 + if ((readl(&clk_power->CLKDIVN) & 0x6)==4)
30 + return((readl(&clk_power->CAMDIVN) & 0x200) ? get_FCLK()/8 :get_FCLK()/4);
31 + return(get_FCLK());
32 + }
33 + else
34 + return(get_FCLK());
35 +#else
36 return (readl(&clk_power->CLKDIVN) & 2) ? get_FCLK() / 2 : get_FCLK();
37 +#endif
38 }
39
4.添加网络支持
4.1修改 vim include/configs/fl2440.h 文件,设置 DM9000 网卡相关驱动:
830 @@ -35,8 +35,8 @@
831 */
832 #define CONFIG_ARM920T 1 /* This is an ARM920T Core */
833 #define CONFIG_S3C24X0 1 /* in a SAMSUNG S3C24x0-type SoC */
834 -#define CONFIG_S3C2410 1 /* specifically a SAMSUNG S3C2410 SoC */
835 -#define CONFIG_SMDK2410 1 /* on a SAMSUNG SMDK2410 Board */
836 +#define CONFIG_S3C2440 1 /* specifically a SAMSUNG S3C2440 SoC */
837 +#define CONFIG_FL2440 1 /* FL2440 board */
838
839 /* input clock of PLL */
840 #define CONFIG_SYS_CLK_FREQ 12000000/* the SMDK2410 has 12MHz input clock */
841 @@ -54,11 +54,22 @@
842 /*
843 * Hardware drivers
844 */
845 +#if 0
846 #define CONFIG_NET_MULTI
847 #define CONFIG_CS8900 /* we have a CS8900 on-board */
848 #define CONFIG_CS8900_BASE 0x19000300
849 #define CONFIG_CS8900_BUS16 /* the Linux driver does accesses as shorts */
850 -
851 +#else
852 +#define CONFIG_NET_MULTI 1
853 +#define CONFIG_NET_RETRY_COUNT 20
854 +#define CONFIG_DRIVER_DM9000 1
855 +#define CONFIG_DM9000_BASE 0x20000300 /* nGCS4 */
856 +#define DM9000_IO CONFIG_DM9000_BASE
857 +#define DM9000_DATA (CONFIG_DM9000_BASE+4)
858 +#define CONFIG_DM9000_USE_16BIT 1
859 +#define CONFIG_DM9000_NO_SROM 1
860 +#undef CONFIG_DM9000_DEBUG
861 +#endif
862 /*
863 * select serial console configuration
864 */
865 @@ -93,14 +104,18 @@
866 #define CONFIG_CMD_CACHE
867 #define CONFIG_CMD_DATE
868 #define CONFIG_CMD_ELF
869 +#define CONFIG_CMD_PING
870 +#define CONFIG_CMD_NAND
871 +#define CONFIG_SYS_NO_FLASH 1
872 +#undef CONFIG_CMD_IMLS
873
874
875 #define CONFIG_BOOTDELAY 3
876 /*#define CONFIG_BOOTARGS "root=ramfs devfs=mount console=ttySA0,9600" */
877 -/*#define CONFIG_ETHADDR 08:00:3e:26:0a:5b */
878 +#define CONFIG_ETHADDR 00:11:22:33:44:55
879 #define CONFIG_NETMASK 255.255.255.0
880 -#define CONFIG_IPADDR 10.0.0.110
881 -#define CONFIG_SERVERIP 10.0.0.1
882 +#define CONFIG_IPADDR 192.168.1.18
883 +#define CONFIG_SERVERIP 192.168.1.2
884 /*#define CONFIG_BOOTFILE "elinos-lart" */
885 /*#define CONFIG_BOOTCOMMAND "tftp; bootm" */
886
887 @@ -114,7 +129,7 @@
888 * Miscellaneous configurable options
889 */
890 #define CONFIG_SYS_LONGHELP /* undef to save memory */
891 -#define CONFIG_SYS_PROMPT "SMDK2410 # " /* Monitor Command Prompt */
892 +#define CONFIG_SYS_PROMPT "[fl2440@lingyun]# " /* Monitor Command Prompt */
893 #define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */
894 #define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16) /* Print Buffer Size */
895 #define CONFIG_SYS_MAXARGS 16 /* max number of command args */
896 @@ -155,9 +170,8 @@
897 /*-----------------------------------------------------------------------
898 * FLASH and environment organization
899 */
900 -
901 -#define CONFIG_AMD_LV400 1 /* uncomment this if you have a LV400 flash */
902 #if 0
903 +#define CONFIG_AMD_LV400 1 /* uncomment this if you have a LV400 flash */
904 #define CONFIG_AMD_LV800 1 /* uncomment this if you have a LV800 flash */
905 #endif
906
907 @@ -176,8 +190,36 @@
908 /* timeout values are in ticks */
909 #define CONFIG_SYS_FLASH_ERASE_TOUT (5*CONFIG_SYS_HZ) /* Timeout for Flash Erase */
910 #define CONFIG_SYS_FLASH_WRITE_TOUT (5*CONFIG_SYS_HZ) /* Timeout for Flash Write */
911 -
912 +#ifndef CONFIG_SYS_NO_FLASH
913 #define CONFIG_ENV_IS_IN_FLASH 1
914 #define CONFIG_ENV_SIZE 0x10000 /* Total Size of Environment Sector */
915 +#endif
916 +
917 +#if defined(CONFIG_CMD_NAND)
918 +#define CONFIG_NAND_S3C2410
919 +#define CONFIG_S3C2410_NAND_SKIP_BAD 1
920 +#define CONFIG_SYS_NAND_BASE 0x4E000000
921 +#define CONFIG_SYS_MAX_NAND_DEVICE 1 /* Max number of NAND devices */
922 +#define CONFIG_SYS_NAND_MAX_CHIPS 1
923 +#define CONFIG_MTD_NAND_VERIFY_WRITE
924 +
925 +#define CONFIG_ENV_IS_IN_NAND 1
926 +#define CONFIG_ENV_OFFSET 0X60000
927 +#define CONFIG_ENV_SIZE 0x20000 /* Total Size of Environment Sector */
928 +#endif /* CONFIG_CMD_NAND */
929 +
930 +#define CONFIG_SETUP_MEMORY_TAGS
931 +#define CONFIG_INITRD_TAG
932 +#define CONFIG_CMDLINE_TAG
933 +
934 +#define CONFIG_SYS_HUSH_PARSER
935 +#define CONFIG_SYS_PROMPT_HUSH_PS2 "> "
936 +
937 +#define CONFIG_CMDLINE_EDITING
938 +#ifdef CONFIG_CMDLINE_EDITING
939 +#undef CONFIG_AUTO_COMPLETE
940 +#else
941 +#define CONFIG_AUTO_COMPLETE
942 +#endif
943
944 #endif /* __CONFIG_H */
4.2修改 board/lingyun/fl2440/fl2440.c,添加 dm9000 网卡的初始化
381 @@ -131,6 +134,9 @@
382 #ifdef CONFIG_CS8900
383 rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
384 #endif
385 +#ifdef CONFIG_DRIVER_DM9000
386 + rc = dm9000_initialize(bis);
387 +#endif
388 return rc;
389 }
390 #endif
对 DM9000 网卡驱动作一些小的修改
815 @@ -364,9 +364,9 @@
816 while (!(phy_read(1) & 0x20)) { /* autonegation complete bit */
817 udelay(1000);
818 i++;
819 - if (i == 10000) {
820 + if (i == 2000) {
821 printf("could not establish link\n");
822 - return 0;
823 + break;
824 }
825 }
826
5.添加 Nandflash 支持
5.1因为我们的开发板只有一片 256M 的 Nandflash,而没有 Norflash。所以我们接下来要在u-boot 代码中去掉 Norflash 的支持,添加 Nandflash。首先修改 board/lingyun/fl2440/Makefile文件,去掉 Norflash 的编译。将 COBJS := fl2440.o nand_read.o flash.o 中的 flash.o 删掉,即改成:COBJS := fl2440.o nand_read.o
5.2修改 include/configs/fl2440.h 头文件
5.3修改 drivers/mtd/nand/s3c2410_nand.c 文件
704 @@ -24,6 +24,7 @@
705 #include <asm/arch/s3c24x0_cpu.h>
706 #include <asm/io.h>
707
708 +#if defined(CONFIG_S3C2410)
709 #define S3C2410_NFCONF_EN (1<<15)
710 #define S3C2410_NFCONF_512BYTE (1<<14)
711 #define S3C2410_NFCONF_4STEP (1<<13)
712 @@ -36,6 +37,19 @@
713 #define S3C2410_ADDR_NALE 4
714 #define S3C2410_ADDR_NCLE 8
715
716 +#elif defined(CONFIG_S3C2440)
717 +#define S3C2410_NFCONT_EN (1<<0)
718 +#define S3C2410_NFCONT_INITECC (1<<4)
719 +#define S3C2410_NFCONT_nFCE (1<<1)
720 +#define S3C2410_NFCONT_MAINECCLOCK (1<<5)
721 +#define S3C2410_NFCONF_TACLS(x) ((x)<<12)
722 +#define S3C2410_NFCONF_TWRPH0(x) ((x)<<8)
723 +#define S3C2410_NFCONF_TWRPH1(x) ((x)<<4)
724 +
725 +#define S3C2410_ADDR_NALE 0x08
726 +#define S3C2410_ADDR_NCLE 0x0c
727 +#endif
728 +ulong IO_ADDR_W = CONFIG_SYS_NAND_BASE;
728 +ulong IO_ADDR_W = CONFIG_SYS_NAND_BASE;
729 #ifdef CONFIG_NAND_SPL
730
731 /* in the early stage of NAND flash booting, printf() is not available */
732 @@ -59,25 +73,34 @@
733 debugX(1, "hwcontrol(): 0x%02x 0x%02x\n", cmd, ctrl);
734
735 if (ctrl & NAND_CTRL_CHANGE) {
736 - ulong IO_ADDR_W = (ulong)nand;
737 + IO_ADDR_W = (ulong)nand;
738
739 if (!(ctrl & NAND_CLE))
740 IO_ADDR_W |= S3C2410_ADDR_NCLE;
741 if (!(ctrl & NAND_ALE))
742 IO_ADDR_W |= S3C2410_ADDR_NALE;
743
744 - chip->IO_ADDR_W = (void *)IO_ADDR_W;
745 + //chip->IO_ADDR_W = (void *)IO_ADDR_W;
746
747 if (ctrl & NAND_NCE)
748 +#if defined(CONFIG_S3C2410)
749 writel(readl(&nand->NFCONF) & ~S3C2410_NFCONF_nFCE,
750 &nand->NFCONF);
751 +#elif defined(CONFIG_S3C2440)
752 + writel(readl(&nand->NFCONT) & ~S3C2410_NFCONT_nFCE,
753 +&nand->NFCONT);
754 +#endif
755 else
756 +#if defined(CONFIG_S3C2410)
757 writel(readl(&nand->NFCONF) | S3C2410_NFCONF_nFCE,
758 &nand->NFCONF);
759 +#elif defined(CONFIG_S3C2440)
760 + writel(readl(&nand->NFCONT) | S3C2410_NFCONT_nFCE, &nand->NFCONT);
761 +#endif
762 }
763
764 if (cmd != NAND_CMD_NONE)
765 - writeb(cmd, chip->IO_ADDR_W);
766 + writeb(cmd, (void *)IO_ADDR_W);
767 }
768
769 static int s3c2410_dev_ready(struct mtd_info *mtd)
770 @@ -92,7 +115,11 @@
771 {
772 struct s3c2410_nand *nand = s3c2410_get_base_nand();
773 debugX(1, "s3c2410_nand_enable_hwecc(%p, %d)\n", mtd, mode);
774 +#if defined(CONFIG_S3C2410)
775 writel(readl(&nand->NFCONF) | S3C2410_NFCONF_INITECC, &nand->NFCONF);
776 +#elif defined(CONFIG_S3C2440)
777 + writel(readl(&nand->NFCONT) | S3C2410_NFCONT_INITECC, &nand->NFCONT);
778 +#endif
779 }
780
781 static int s3c2410_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat,
782 @@ -132,6 +159,7 @@
783
784 writel(readl(&clk_power->CLKCON) | (1 << 4), &clk_power->CLKCON);
785
786 +#if defined(CONFIG_S3C2410)
787 /* initialize hardware */
788 twrph0 = 3;
789 twrph1 = 0;
790 @@ -145,7 +173,20 @@
791
792 /* initialize nand_chip data structure */
793 nand->IO_ADDR_R = nand->IO_ADDR_W = (void *)&nand_reg->NFDATA;
794 -
795 +#elif defined(CONFIG_S3C2440)
796 + twrph0 = 4;
797 + twrph1 = 2;
798 + tacls = 0;
799 + cfg = 0;
800 + cfg |= S3C2410_NFCONF_TACLS(tacls - 1);
801 + cfg |= S3C2410_NFCONF_TWRPH0(twrph0 - 1);
802 + cfg |= S3C2410_NFCONF_TWRPH1(twrph1 - 1);
803 + writel(cfg, &nand_reg->NFCONF);
804 + cfg = (0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(0<<6)|(0<<5)|(1<<4)|(0<<1)|(1<<0);
805 + writel(cfg, &nand_reg->NFCONT);
806 + /* initialize nand_chip data structure */
807 + nand->IO_ADDR_R = nand->IO_ADDR_W = (void *)&nand_reg->NFDATA;
808 +#endif
809 nand->select_chip = NULL;
810
811 /* read_buf and write_buf are default */
5.4修改文件 common/cmd_nand.c
668 @@ -148,6 +148,11 @@
669 #if defined(CONFIG_CMD_MTDPARTS)
670 out:
671 #endif
672 + /* If the size is not aligment, then let it's page alignment */
673 + if(0 != (*size%nand->writesize))
674 + {
675 + *size = (*size / nand->writesize + 1) * nand->writesize;
676 + }
677 printf("device %d ", idx);
678 if (*size == nand->size)
679 puts("whole chip\n");
5.5上边的 u-boot 并不能启动我们移植的内核,所以修改 board/lingyun/fl2440/fl2440.c
368 @@ -105,8 +105,11 @@
369 gpio->GPHUP = 0x000007FF;
370
371 /* arch number of SMDK2410-Board */
372 +#if defined(CONFIG_FL2440)
373 + gd->bd->bi_arch_number = MACH_TYPE_MINI2440;
374 +#else
375 gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
376 -
377 +#endif
378 /* adress of boot parameters */
379 gd->bd->bi_boot_params = 0x30000100;
380
5.6修改 include/configs/fl2440.h 文件
到这里u-boot基本改好了,再make fl2440_config,接着make,生成的u-boot.bin就是我们的最终文件。
6.将u-boot移植到开发板上
6.1 准备的工具:fl2440开发板,j-link,网线,串口,win上安装串口驱动、tftpd32
6.2 烧录u-boot:这里使用j-link,下面是在J-link上的操作
6.3 u-boot在SecureCRT的COM4端口运行(我这里是COM4,至于是哪个端口,可以查看我的电脑的设备管理器,看看COM选项,就可以知道哪个端口),这时可以将u-boot写入开发板的nand上,相关操作如下
到这里,u-boot移植结束,最后用reset命令测试u-boot能否重启,若能,说明移植成功!
需要注意的问题:
1.
make clean:清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件。
make distclean:make distclean类似make clean,但同时也将configure生成的文件全部删除掉,包括Makefile。
有时候第一次make fl2440_config、make之后(这时生成.config文件),我们还需要修改Makefile文件,当下一次make 时,由于.config没有改变,可能得不到我们需要的编译效果,这时我们可以尝试下面的命令:先make distclean,再make fl2440_config,最后make.
2.
将u-boot写入nand时,severip要与win上有线网卡的ip(一般是以太网中的ipv4)一样,并与开发板的ip在同一网段,使用tftp时要关掉防火墙,360安全卫士最好也关掉。
tftpd32.exe 上的目录要设置成要烧录文件所在的位置。
3.
J-link只是用来加载前4K代码,若已经将u-boot写入nand上,则下次启动开发板时不要再使用J-link。
4.
修改代码时
在vim命令模式下,使用'/+关键字'命令查找关键字,如:要查找关键字‘cbb’所在处,则命令为:/cbb 接着按enter键,按N键可以查找下一处的'cbb'.
有时候注意用Tab键补齐。
5.
fl2440开发板不支持热拔插,所以先关闭开发板的电源再拔出串口、电源线,避免开发板烧坏。
6.关于u-boot的相关连接
u-boot的目录结构 http://m.blog.csdn.net/article/details?id=8135931
http://m.blog.csdn.net/article/details?id=6554038
u-boot移植过程相关推荐
- U-Boot 之三 U-Boot 源码文件解析及移植过程详解
在之前的博文 Linux 之八 完整嵌入式 Linux 环境介绍及搭建说明 中我们说了要一步步搭建整个嵌入式 Linux 运行环境.我所使用的硬件平台及整个要搭建的嵌入式 Linux 环境见博文 ...
- AT91SAM9G45上电启动和bootstrap移植过程
猛一回头,觉得笔记不能断掉,所以趁空好好整理一下思路. 最近做了什么?从9月底到今天约20天三周的时间里,基本就是:熟悉canopen协议栈,熟悉bootstrap,uboot源码及其移植,期间了解了 ...
- NDK/JNI demo ( 五 ) ORB_SLAM2在Android上的移植过程
Android平台搭建和NDK环境配置 Android移植基础 NDK是集成的Android中调用C++代码的工具包,核心是JNI(Java Native Interface)技术,具体这里略过不表. ...
- .NET应用迁移到.NET Core(三)从商业角度看移植过程
2016年12月1日下午微软技术大会Microsoft Ignite China,有幸和大家分享一门课程,课程信息如下,欢迎大家到时来捧场.本文介绍下从商业角度看移植过程. . 创建项目移植进度表 创 ...
- 嵌入式linux python移植过程_嵌入式linux项目开发(一)——BOA移植
嵌入式linux项目开发(一)--BOA移植 项目目标:使用BOA.CGIC.SQLite搭建嵌入式web服务器 一.嵌入式web服务器BOA简介 在嵌入式设备的管理与交互中,基于Web方式的应用成为 ...
- u-boot移植随笔:移植过程问题及解决(本文章不时更新)
这个文章主要记录移植过程中出现的问题及解决方法,但不涉及问题背景. 1.unkown FLASH on Bank 0 A:芯片ID不正确,找啊找啊(我使用SI),终于在M5253DEMO.h这个文件中 ...
- MiniGUI移植过程
此次miniGUI的移植是移植的比较老的版本,用于性能较弱的嵌入式系统中,移植的minigui版本为MiniGUI 3.0.12,在此将移植过程记录下来,方便以后取用. 前言:嵌入式芯片采用的是全志科 ...
- RTL8821CS移植过程记录
RK3308B+RTL8821CS移植 在rk3308b平台移植rtl8821cs,rlt8821cs是wifi+bt一体的模组,主要记录下移植过程中需要注意的地方 移植驱动 将rtl8821cs的驱 ...
- [Spring Boot] 2. Spring Boot 启动过程定制化
在上一篇文章中,从源码角度介绍了Spring Boot的启动过程.启动的代码虽然只有短短的一行,但是背后所做的工作还真不少,其中有一些可以定制化的部分,主要分为以下几个方面: 初始化器(Initial ...
- miniGUI移植过程大致如下
miniGUI移植过程大致如下 移植过程大致如下(由于存在依赖关系,顺序不能错): –prefix 为生成库文件目录: –host 指定目标板编译器: LDFLAGS 为动态库路径 CFLAGS 为头 ...
最新文章
- java培训:什么是抽象类?怎么定义?
- 青云八核服务器无限申请教程,零云旗下快速开发框架lyadmin映像使用指南(青云服务器版)...
- Spring注解标签详解@Autowired @Qualifier等
- 事件过滤器及不规则窗体
- 神盾局特工第四季/全集Agents Of SHIELD迅雷下载
- MTK 8127平台使用busybox
- 贪心整理一本通1431:钓鱼题解
- clickhouse创建外部字典表
- 四年的自学,通过这些学习工具拿到了大厂offer,分享给大家
- 【原】win 7 屏幕旋转问题的解决
- 如何把录音生成二维码,用微信扫一下就能听?分享语音音频转二维码的方法和技术原理
- Linux安装glassfish、利用glassfish部署应用
- 漏洞复现——Chrome 浏览器的 0day 远程代码执行漏洞 (附poc)
- UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xb5 in position 63绝对有效
- 机器学习算法 01 —— K-近邻算法(数据集划分、归一化、标准化)
- [Android]小米5刷root过程记录
- 手机测试属于硬件测试还是软件测试6,红米手机的硬件测试的2种基本操作
- Canvas学习:绘制圆和圆弧
- MySQL索引机制(详细+原理+解析)
- 基于微信小程序的食堂订餐-计算机毕业设计
热门文章
- /mnt/share 下无法修改权限
- 从键盘输入某同学的英文名(小写输入,假设学生的英文名只包含3个字母。如: tom),编写程序在屏幕上输出该同学的英文名,且首字母大写(如: Tom)。同时输出组成该英文名的所有英文字符在26个英文字母
- 计算机软件质测试标准,GB/T 15532-2008
- Java期末复习题 超级无敌全
- easy_crypto
- THINPAD E480可以支持超过32G内存,最大可以64G?
- 我所理解的生成器(其他)(关键词:生成器/generator/yield)
- 我妈这是怎么了!谁来帮帮我。
- 飞行堡垒FX80GM,温度墙,锁频,游戏掉帧问题解决
- 如何建设一个属于自己的网站