嵌入式开发者社区

标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页]

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit  Z, R$ u! Y5 i) m9 i
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
& y4 E! v) p  Y这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?) k+ w: t# m9 r6 N" m0 [7 o7 T
" U9 }6 E/ ?' s2 c9 W4 ^1 @
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
9 E) @" S7 y  V- i0 i6 J5 T( q/ ?( o8 {* H8 O; R* Y2 F9 a# _/ D8 \& ^

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& W6 b! o3 h3 b0 D/*
& E0 f1 P7 g" E* Check memory range for valid RAM. A simple memory test determines1 l& M) m1 n" V% l4 H# o" n
* the actually available RAM size between addresses `base' and
8 ]: q- F! \  j3 Y# x! z' y* `base + maxsize'.2 f. o! k; x6 f  i
*/" B* b  A! E4 ]
long get_ram_size(long *base, long maxsize). x  w# j2 F0 ^( [% j' P
{, C/ z' S$ g4 Y" z; Z
        volatile long *addr;0 g$ i8 s/ Z- O- d9 j
        long           save[32];
& }( |# K, U# o5 P        long           cnt;  x% j5 D* Z* C7 a8 b
        long           val;+ g- A5 @9 k. G  y
        long           size;1 H! O5 M; O# P+ U: O0 Q
        int            i = 0;2 ^0 i! B7 c2 r4 C# w3 V- z
5 s5 Q. k; k% S0 T2 M2 S  }
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# s# D! \; {6 C0 E+ e( m* ]                addr = base + cnt;        /* pointer arith! */3 O8 Q: Q2 {) E) X; l9 g
                sync ();
5 v+ y3 o  S& h# A4 P                save[i++] = *addr;
$ C* u- z# F4 t+ Z) Q! }                sync ();
* N  a% v, h. h. K8 c5 M                *addr = ~cnt;
; g1 g7 L& _8 t9 M0 t/ Q9 _9 `        }
; F& E) u% W: x' q2 L7 [" {+ J9 }. V+ i$ h$ ?) i# z0 J
        addr = base;
9 ^9 N/ E% j" R3 V6 d        sync ();
) h# L& B  N* @5 Q: `) v        save = *addr;7 b- u8 j) I  _+ a3 J2 w
        sync ();
4 n2 V* e! U' W+ p1 X        *addr = 0;& g. w7 m: L1 D) q/ |/ j2 y

$ v. P1 g! H8 z6 v8 b+ f        sync ();
0 D9 ]8 ?6 w$ v9 X) H! \        if ((val = *addr) != 0) {2 C$ q1 B: {" }
                /* Restore the original data before leaving the function.
$ b( c8 Y$ l" K* b$ F8 e( E# X                 */0 R: X9 u: _  r1 T1 r
                sync ();  w0 f* B6 h9 v- a& `5 Z  P
                *addr = save;
+ }, |/ z$ H3 R, B: Q4 W0 S                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ U+ ?( n4 E+ k: K7 k                        addr  = base + cnt;$ ^2 `6 g' y2 Z6 N" C
                        sync ();
. v! H5 M! f" p, e3 _                        *addr = save[--i];
2 z4 @, K2 a1 v8 s                }
, G+ E) D9 G: s) R) n                return (0);
; M" r5 |& W2 l* X6 o% }8 r1 H/ e        }# F/ Z+ q, M: {( C+ g" V1 c
: g& U. D. n8 s* g6 g8 i1 K
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% N/ m- m7 y4 \! q6 l5 h8 A" z  H1 k                addr = base + cnt;        /* pointer arith! */, K$ b/ }9 |) ?7 @1 N3 F) g1 `
                val = *addr;9 ~* W' X7 k; Y: {
                *addr = save[--i];* B6 `7 e+ ]+ Q
                if (val != ~cnt) {
0 z/ s" S, [! b5 ^                        size = cnt * sizeof (long);
! [. E  _. u8 Z$ I0 ]1 F                        /* Restore the original data before leaving the function.
2 Y: Q3 k6 Z# }+ {: ~! e0 s                         */
4 l3 }" Y: |! t                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 E& M$ L7 J; j! `5 E                                addr  = base + cnt;, Z( N" O+ d6 G: y( G+ ]# x
                                *addr = save[--i];8 Y9 ]3 d/ ^9 o9 I. w1 s
                        }# e2 F7 O9 G+ y) T) G: s/ v
                        return (size);( ~0 _  j( L8 b, a; g& M
                }% g1 C9 v- y* ?6 D& C+ ~/ ]
        }% G" U+ x% E" U. E, r
' k! ~" J, g1 D# Z3 @1 @
        return (maxsize);
4 I; p' e! F3 h}
  l; z6 N3 D4 R; ]: r0 n- sint dram_init(void)
* O% Y) D# E. [% ^{
$ L2 a( _, Q! u/ ^4 g, ?        /* dram_init must store complete ramsize in gd->ram_size */
+ B" k, k% c7 F        gd->ram_size = get_ram_size(( ?0 W% p& T3 s0 T! ^- J+ ]
                        (void *)CONFIG_SYS_SDRAM_BASE,0 d. ~9 h! Q+ r% E) X
                        CONFIG_MAX_RAM_BANK_SIZE);
5 a( `- ]6 W3 C; S* R0 j        return 0;
8 @; M/ A1 X5 S  C& l}
# H( V) B* o& V, B5 W+ g) L3 X2 i5 s; o  g! F  o

  c5 c  @7 r' a9 e7 u  F2 Z0 z) z5 d" f; t
* P' R8 H' N& z( o: x& o- `
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
3 U/ ?6 d$ N% a+ U) u8 A
) a8 |9 |5 D/ u! V' Q8 W
( h$ D4 Q/ n8 M5 T' X5 g/ @! P
6 H6 z# ]- Y4 ?4 r6 U* G





欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4