嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
9 a2 O) V$ x4 \" i' X8 @5 D" {, t核心板2:DDR2 256M Byte   NAND FLASH 8G bit! k( f9 s# [9 k' K4 z+ d* i
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
6 b# e  K( W+ w, k& {, J% d- b6 E
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 P3 \* w4 a$ X& u" r% e5 T
2 e/ n1 L! J- ?0 A
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, q4 s, O& e$ c) ~/ r0 R
/*
0 C5 A: e, D: Y  k* Check memory range for valid RAM. A simple memory test determines
3 K* p5 ]5 ?; r( ^2 g  G( P3 {. k( j5 L* the actually available RAM size between addresses `base' and
( s  J" X$ Q8 b& e6 O5 F4 M3 e* `base + maxsize'./ A, q  T# ]8 i$ H: o& H; Y
*/
$ G# [: q! V( v) x: k- @' r4 ^long get_ram_size(long *base, long maxsize); |/ x; V; s& I; S$ Q+ L
{5 q4 ^' f( K  t8 ^
        volatile long *addr;: u' V; I  N. p6 C
        long           save[32];$ G! L' o8 b  N6 p, h
        long           cnt;
* j9 r9 |2 f* d! w        long           val;
0 f7 c6 i( [& {; A/ V, M7 W        long           size;
/ t) ?* D  Z# [# H        int            i = 0;+ t+ R' U1 f8 v- I! \* j( C
/ ]5 j8 M# ~5 X1 e4 g* s( j
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: [1 M$ V  z  {3 ]) m                addr = base + cnt;        /* pointer arith! */
* i2 R9 N" i: d( d5 y                sync ();/ b  G6 o$ g* Y- y
                save[i++] = *addr;
6 k# V; _9 w, Y% R) H4 Z0 U                sync ();
; P: q8 r2 p  z6 x+ _& W; V                *addr = ~cnt;7 ^+ v5 `# s% a; w( i! K
        }
6 f) m9 r7 `: U7 ~) q1 X7 g2 y. w
        addr = base;0 U& @  L9 @4 m% g% \' M  p
        sync ();
0 |0 k$ x6 ?8 p; D) B1 j        save = *addr;% F8 [0 N( h6 X4 F/ n- ^3 Q: m
        sync ();
- e5 p! ~; z; l' \( e8 |: y0 X/ O        *addr = 0;" h3 n" @% a6 X8 k2 Q, x

4 V/ A* Y7 |+ |5 x        sync ();6 ?. M, d- x0 a9 P1 |
        if ((val = *addr) != 0) {% C/ c; M) t/ g' K* X+ v
                /* Restore the original data before leaving the function.1 {$ ?8 J  q4 \8 ]+ H
                 */
* u- u  ^2 I" Z7 Z                sync ();9 ]! D8 d5 o, B
                *addr = save;/ S( s1 ]7 ^8 R7 r' O
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* ~3 ]) `/ r8 V; s                        addr  = base + cnt;. b( U; U: N5 M
                        sync ();7 D) u* C2 m/ t8 k0 a% I
                        *addr = save[--i];
( ^9 t' u" i/ M+ ?5 v# f                }1 `  L7 \$ C) B- N
                return (0);
/ T$ Y/ B" Q9 u+ E        }9 X" a9 ~2 _/ Z

; y; B1 r! a! J9 w. ^# x  v        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 P- G1 q8 Y7 r. L  ?3 L4 m                addr = base + cnt;        /* pointer arith! */
7 P$ W8 @6 m( n0 P) J8 h                val = *addr;
- ]3 T$ ^9 P$ X! a) v! N                *addr = save[--i];
0 [6 W# W( R8 w8 N5 r% E* a& u8 p                if (val != ~cnt) {
+ j6 j- Z  ]% m' e% O0 }/ @2 q                        size = cnt * sizeof (long);
( i/ v) A$ N/ ^3 K. u                        /* Restore the original data before leaving the function.7 F$ Y# f5 p( b4 H
                         */
5 @3 n* [2 N, _3 |* z' J, M                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 `. o3 _- R% W
                                addr  = base + cnt;
" `8 Z8 N( G4 \4 V3 O% F) \$ V0 L                                *addr = save[--i];1 o9 t5 ^$ ]! n5 A# t* h5 H& D
                        }
$ @- e1 Y" O6 h- c6 ]8 o                        return (size);
% o/ ~4 O% w# ?1 U0 L' [% u9 F$ q6 x                }. X' P) C) C2 a$ k# V% x
        }6 a8 N8 s& Q7 u! n- L$ u

, _( m5 |# K' G7 g% N0 C0 M        return (maxsize);
3 W8 X" F# C" c}* j6 |% a6 S" u& U5 P
int dram_init(void)& v$ Q' \  [( K2 B! P3 f
{8 ]! {( h6 i6 M8 D- f
        /* dram_init must store complete ramsize in gd->ram_size */) Z+ U. Z0 X$ m% G
        gd->ram_size = get_ram_size(
7 T1 z* R  z/ c* D6 i- V1 f3 O  ]& {; `                        (void *)CONFIG_SYS_SDRAM_BASE,! q% Z9 H- B: s0 x! u' ~
                        CONFIG_MAX_RAM_BANK_SIZE);
1 q7 v6 C' P* v$ ?        return 0;
- G. k0 M: L- Q' C( ~# D& u}" w% U* y2 Z1 b

4 u% ^0 F3 f( [2 m2 z4 D( @8 {  I! ~8 u. F$ O

* }, t+ M2 I1 O: g; O6 V* {3 Z) F3 H( S, j; W+ s6 t
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!* }& M# ^- ?0 Y9 u+ z
8 q, f( ?  }6 B: h8 e. e- r

+ i" _, |4 N$ d0 @' T" w

/ x9 o; u9 O  ~; {8 Z- Q' G




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