嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit/ L5 \; s' k0 @0 w3 ~# h( N
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
' b6 w% A- d: l; C; w2 W; U+ @这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& Y# u+ p6 X) t8 v/ y7 O6 e& c0 Z0 }/ \$ F8 c
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 ~% A; o0 @6 o3 A& w4 [" |  ~  f% G8 H1 C0 P8 u/ E/ W- h

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: w8 ?3 R/ ^; [0 P! T/*
/ I* Q7 w% i! W& ]3 A# Q* Check memory range for valid RAM. A simple memory test determines3 ]( u+ g8 K- M4 t: G
* the actually available RAM size between addresses `base' and
4 L- L3 B3 X, t6 V7 O: k5 ~* `base + maxsize'.  A1 _. s1 P$ A( p4 ~+ _
*/
# y5 Q" q" t# h0 d( flong get_ram_size(long *base, long maxsize)3 z' r+ S' M5 [9 Q1 j/ C" n
{( C- Z- M. s8 h) z
        volatile long *addr;7 r" V% G/ T0 {% O0 Q" J7 g
        long           save[32];- }1 I2 j1 D/ j3 q* \' ~( c
        long           cnt;
8 I; ?5 \& r: V& \$ D        long           val;, C) y+ |1 K( a5 {' t
        long           size;
- m! ?9 N* q/ u, v        int            i = 0;
' |  ]9 Q3 h) a( l! N; E* a+ o- w' E) M+ o$ m
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {& \: l7 |4 N9 E$ C3 }
                addr = base + cnt;        /* pointer arith! */. e) ]5 ?5 ~. Q8 s# p7 s
                sync ();0 g- b( Q4 f+ C+ d
                save[i++] = *addr;
. P6 }/ E  q. h4 {                sync ();
6 j* d8 M4 Q8 K( b/ c                *addr = ~cnt;
. T1 f$ L0 v; e: a        }* A4 W, p2 |- [# U6 Y( h" u) v4 ^
- s) }! [: H) [! T# ~5 z
        addr = base;
9 }5 N+ S9 E! g( O3 O        sync ();
2 i! y" V  z, p& ]. ?* o' W        save = *addr;1 o* S% l' _7 B
        sync ();
! @. G+ {& g* N, x, B2 m        *addr = 0;
7 i2 v/ @2 I; P9 `! z6 m9 @/ b8 z8 b# U% `$ u4 g0 U
        sync ();; R( b1 ^# k! @. \6 e; _
        if ((val = *addr) != 0) {' l! U/ s1 l5 [1 K+ W
                /* Restore the original data before leaving the function.. N3 p6 c& {" z3 _" A
                 */
# W2 v) }1 H1 P) X7 ~+ s                sync ();3 M* ]% X- a8 G6 G+ `
                *addr = save;
; n- {3 k) b$ K( O6 W                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 u+ F; [" Y0 M' j/ N1 c6 r                        addr  = base + cnt;
( y% m1 Y2 a  l                        sync ();* Q: S9 \. W8 z
                        *addr = save[--i];
* [/ u5 G% E  |! ?2 o                }1 c& o2 f/ D( s( j, {4 [7 r
                return (0);  h8 ]; }  v9 E- ]0 T: K7 I, W1 i
        }
# b2 @! u1 K" L3 n. N& S/ x. j( }5 m" y* Z' k
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ P  b, P' k! G% a' b9 O1 O) D
                addr = base + cnt;        /* pointer arith! */& y# N2 |2 T& w8 }6 a
                val = *addr;+ `- @8 T" v8 t0 m, `' z! _
                *addr = save[--i];
& K# Q1 _# z+ q4 j; s                if (val != ~cnt) {
1 h, Z6 x4 O# q$ T% X                        size = cnt * sizeof (long);
& g+ i9 z/ n  x7 c2 g3 C                        /* Restore the original data before leaving the function.
5 _% @4 M3 r3 y1 E+ P( y3 d                         */
( T! }4 a) f$ f+ y8 |                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- o; h9 W  I& `$ e- a# Z& S- C
                                addr  = base + cnt;
( r: s- _6 T2 n                                *addr = save[--i];
0 b) L& u% s4 ~& l' y                        }
; k$ ?+ {  `9 H                        return (size);
6 [/ }5 C  H9 i  R0 {& e                }7 E) J! u% Y3 E9 ]
        }
: x0 W% D/ ^% D+ ~5 f" s/ {/ ~5 R. c2 V2 ~' O
        return (maxsize);
0 _) U' C) ^; f5 w& ~}  W1 k" Z9 V6 G% T
int dram_init(void)
/ R* N& y; i1 j. b+ C/ v0 d{. {9 u; X  i  `. e4 W; C
        /* dram_init must store complete ramsize in gd->ram_size */( C  h( s/ O$ A; R& t5 r! r& s1 i
        gd->ram_size = get_ram_size(
/ J) M3 e3 J6 O' A! Z) t5 Y( \                        (void *)CONFIG_SYS_SDRAM_BASE,! q0 D8 S4 m: y  ~0 Q+ q
                        CONFIG_MAX_RAM_BANK_SIZE);
& @: k" u4 B: A& S$ j6 }- W( g        return 0;% ~. M$ F4 U3 c5 ~. A
}
% P5 {; Z" f1 h
' [% H6 r6 ?( [3 B( {4 P6 @. b8 x4 X5 s* }
' K* n2 W9 u" k) ]

- P* b  o  a  W/ m" r* AFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!, ]" M% U- ?. i% M: H* i
# O% U. g: H; L+ N7 I8 y1 E
" N' I/ J6 L0 `* p9 z5 u2 y7 M9 E8 v

3 ?: \: t* P5 Z5 ]; T




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