目的:移植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移植过程相关推荐

  1. U-Boot 之三 U-Boot 源码文件解析及移植过程详解

      在之前的博文 Linux 之八 完整嵌入式 Linux 环境介绍及搭建说明 中我们说了要一步步搭建整个嵌入式 Linux 运行环境.我所使用的硬件平台及整个要搭建的嵌入式 Linux 环境见博文 ...

  2. AT91SAM9G45上电启动和bootstrap移植过程

    猛一回头,觉得笔记不能断掉,所以趁空好好整理一下思路. 最近做了什么?从9月底到今天约20天三周的时间里,基本就是:熟悉canopen协议栈,熟悉bootstrap,uboot源码及其移植,期间了解了 ...

  3. NDK/JNI demo ( 五 ) ORB_SLAM2在Android上的移植过程

    Android平台搭建和NDK环境配置 Android移植基础 NDK是集成的Android中调用C++代码的工具包,核心是JNI(Java Native Interface)技术,具体这里略过不表. ...

  4. .NET应用迁移到.NET Core(三)从商业角度看移植过程

    2016年12月1日下午微软技术大会Microsoft Ignite China,有幸和大家分享一门课程,课程信息如下,欢迎大家到时来捧场.本文介绍下从商业角度看移植过程. . 创建项目移植进度表 创 ...

  5. 嵌入式linux python移植过程_嵌入式linux项目开发(一)——BOA移植

    嵌入式linux项目开发(一)--BOA移植 项目目标:使用BOA.CGIC.SQLite搭建嵌入式web服务器 一.嵌入式web服务器BOA简介 在嵌入式设备的管理与交互中,基于Web方式的应用成为 ...

  6. u-boot移植随笔:移植过程问题及解决(本文章不时更新)

    这个文章主要记录移植过程中出现的问题及解决方法,但不涉及问题背景. 1.unkown FLASH on Bank 0 A:芯片ID不正确,找啊找啊(我使用SI),终于在M5253DEMO.h这个文件中 ...

  7. MiniGUI移植过程

    此次miniGUI的移植是移植的比较老的版本,用于性能较弱的嵌入式系统中,移植的minigui版本为MiniGUI 3.0.12,在此将移植过程记录下来,方便以后取用. 前言:嵌入式芯片采用的是全志科 ...

  8. RTL8821CS移植过程记录

    RK3308B+RTL8821CS移植 在rk3308b平台移植rtl8821cs,rlt8821cs是wifi+bt一体的模组,主要记录下移植过程中需要注意的地方 移植驱动 将rtl8821cs的驱 ...

  9. [Spring Boot] 2. Spring Boot 启动过程定制化

    在上一篇文章中,从源码角度介绍了Spring Boot的启动过程.启动的代码虽然只有短短的一行,但是背后所做的工作还真不少,其中有一些可以定制化的部分,主要分为以下几个方面: 初始化器(Initial ...

  10. miniGUI移植过程大致如下

    miniGUI移植过程大致如下 移植过程大致如下(由于存在依赖关系,顺序不能错): –prefix 为生成库文件目录: –host 指定目标板编译器: LDFLAGS 为动态库路径 CFLAGS 为头 ...

最新文章

  1. java培训:什么是抽象类?怎么定义?
  2. 青云八核服务器无限申请教程,零云旗下快速开发框架lyadmin映像使用指南(青云服务器版)...
  3. Spring注解标签详解@Autowired @Qualifier等
  4. 事件过滤器及不规则窗体
  5. 神盾局特工第四季/全集Agents Of SHIELD迅雷下载
  6. MTK 8127平台使用busybox
  7. 贪心整理一本通1431:钓鱼题解
  8. clickhouse创建外部字典表
  9. 四年的自学,通过这些学习工具拿到了大厂offer,分享给大家
  10. 【原】win 7 屏幕旋转问题的解决
  11. 如何把录音生成二维码,用微信扫一下就能听?分享语音音频转二维码的方法和技术原理
  12. Linux安装glassfish、利用glassfish部署应用
  13. 漏洞复现——Chrome 浏览器的 0day 远程代码执行漏洞 (附poc)
  14. UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xb5 in position 63绝对有效
  15. 机器学习算法 01 —— K-近邻算法(数据集划分、归一化、标准化)
  16. [Android]小米5刷root过程记录
  17. 手机测试属于硬件测试还是软件测试6,红米手机的硬件测试的2种基本操作
  18. Canvas学习:绘制圆和圆弧
  19. MySQL索引机制(详细+原理+解析)
  20. 基于微信小程序的食堂订餐-计算机毕业设计

热门文章

  1. /mnt/share 下无法修改权限
  2. 从键盘输入某同学的英文名(小写输入,假设学生的英文名只包含3个字母。如: tom),编写程序在屏幕上输出该同学的英文名,且首字母大写(如: Tom)。同时输出组成该英文名的所有英文字符在26个英文字母
  3. 计算机软件质测试标准,GB/T 15532-2008
  4. Java期末复习题 超级无敌全
  5. easy_crypto
  6. THINPAD E480可以支持超过32G内存,最大可以64G?
  7. 我所理解的生成器(其他)(关键词:生成器/generator/yield)
  8. 我妈这是怎么了!谁来帮帮我。
  9. 飞行堡垒FX80GM,温度墙,锁频,游戏掉帧问题解决
  10. 如何建设一个属于自己的网站