嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit6 @# E' e8 N' `& H
核心板2:DDR2 256M Byte   NAND FLASH 8G bit/ ]7 P( r* w$ K
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
1 l7 _' ~! W" t9 @3 b: J6 X  ?' F- G" @
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! w) i: r! u# U0 }. e9 T; n! ?; k+ \% r% I

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, J4 l+ B. t, J. z
/*
+ ^# [) f' P0 p) W0 Y. j* Check memory range for valid RAM. A simple memory test determines
3 O, E: \" F3 q3 A* the actually available RAM size between addresses `base' and
/ t0 p4 Z% s( ~- t+ h  G+ X* `base + maxsize'.+ H# m, F% S0 l3 O. W0 U7 r
*/6 ~  T! Z; M& P- t
long get_ram_size(long *base, long maxsize). q+ r. M" [0 }3 e: e4 i
{
. X6 v& N% K, }  h1 p1 O* o; q* Z        volatile long *addr;2 C% p7 p1 ]' L' P1 v; A
        long           save[32];
5 w7 p% X" V0 U. u. U, u        long           cnt;
$ n4 F/ D0 i& Q3 @4 D        long           val;4 S" l* u. Y1 q+ p) D
        long           size;
$ M. `( o  Q1 m/ W$ R- G3 X        int            i = 0;
; A. l$ G3 Y' a5 \% M  M" v; b' x5 p9 |+ Y7 ?3 s
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {. q; w- x* {0 g0 Q3 Q
                addr = base + cnt;        /* pointer arith! */0 f: `9 ~4 j0 J# ]. C
                sync ();9 Y3 i7 F' |- |, ~+ m9 ]) c
                save[i++] = *addr;
1 i* I* H+ V( h' |! D                sync ();
+ i8 q8 _/ s: [, n                *addr = ~cnt;
! U4 w/ U- o  m  m% V: e) e7 O& ~        }
* h) i* B# G- m
% ^/ K. I% Z) a3 [5 E* H$ t        addr = base;5 t4 X& f+ v5 {0 M
        sync ();6 O7 e% ]! v# R
        save = *addr;
4 _7 h5 Q1 b) J, b# {1 [        sync ();1 [* w: }) L1 _1 T) U
        *addr = 0;
7 ~5 }$ {6 B) X7 }, z2 R+ _  c
4 X) C! C0 Q/ L  }* A) L( w        sync ();" E4 }' x6 d# a
        if ((val = *addr) != 0) {  @0 h- S* p( p( G3 ~
                /* Restore the original data before leaving the function.
6 x8 Z$ D  U  x1 ]) v2 j. l6 \( W                 */- r3 O/ F0 S7 Z/ o' ]  {( ~
                sync ();
) s2 _: w8 T7 ^. g+ I                *addr = save;
; [" A6 r6 p  f0 m' {# e. K                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( {5 t% X# J: M; I' r! R                        addr  = base + cnt;
5 @6 [1 c/ \2 r; _. @                        sync ();
( g* S6 V$ }. ~3 \9 y& D/ i. I- p                        *addr = save[--i];
* b+ r* Z6 q' a* j: E9 k                }
2 G% k2 P! {# M; o, v+ `                return (0);) Q8 a6 x) b! d
        }4 ^; f# _4 O6 x+ E1 ]; z; |5 A$ ^9 a
6 o7 P# T' M* k& i+ H$ y, h
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" d* A1 E( w. ~. w- H9 j                addr = base + cnt;        /* pointer arith! */
7 E3 I' k, p( T2 M/ U7 T                val = *addr;
  a% E; u1 M/ Y. i* H% e4 m: E9 Q                *addr = save[--i];
& ~! P) A2 h* V' W. J. s( V                if (val != ~cnt) {$ q* A9 A5 {* d; p4 E+ o2 L, ]
                        size = cnt * sizeof (long);
( ?& ?. s7 {8 s                        /* Restore the original data before leaving the function.3 ~" ^0 ?0 y/ k, b
                         */8 U$ o0 A4 H' C) U$ x- R  g
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {" q. y9 @% r! E: A  ]9 f' z
                                addr  = base + cnt;
: f, A8 y6 L# r9 \1 ~                                *addr = save[--i];' R1 T) {/ C) X( h( g' R; x" z
                        }4 M4 `3 X5 Z% s" J! P7 y
                        return (size);' L& V( }  z# G3 ^# P# \* `/ q
                }! S7 |! w" [# l+ W7 n# U
        }
7 P1 G  U$ M) Y& C  h% P
" ]& P! z, W0 I% q# k5 R        return (maxsize);1 C# d1 g0 V4 C. e2 N- E
}
* c8 r! r2 [, D5 J7 N- k3 P0 J, oint dram_init(void)
: e4 u9 P5 c6 z{
  `- Y& z6 i4 I- f* o0 c4 {5 r        /* dram_init must store complete ramsize in gd->ram_size */9 j- R- \4 H" w* ]. R
        gd->ram_size = get_ram_size(
9 m3 _$ s8 D0 x, s: B2 f                        (void *)CONFIG_SYS_SDRAM_BASE,3 A# z0 O3 Y5 B' Q( z+ k
                        CONFIG_MAX_RAM_BANK_SIZE);
4 Q0 i) r, B- e& H4 r& y        return 0;5 a. @* v7 w1 ?3 _" H' h. g* G
}: j3 N+ N, M2 F9 I6 g- R& `
; l3 v& j: `9 [- t/ y

/ F: `' |; R. f; f" M8 v# ~8 X. m9 R* d. W! {( X0 ~% a

4 |, n2 ]0 I* J  c7 MFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!8 f; X$ Z4 t- P& e0 z5 _* p3 ]; q

+ s% V8 B$ d8 o5 A" s
/ t- O0 K4 V0 t6 P

+ ?# w1 \1 W- [* x! @, b, _7 H




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