嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
: @5 F# q; B1 X. Q7 P核心板2:DDR2 256M Byte   NAND FLASH 8G bit
% M+ \" f$ `9 Y这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 s  G; s$ F$ \5 |; C3 x: P: M/ `' R) A4 m- Y/ ^6 o
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
- F! Q: F; K- C$ f% e
5 a6 B+ y2 @8 [; X
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( Q+ w5 ~. X# p0 R0 f- X: a/*
: ?7 ^$ V6 ]% @' V4 F; k* Check memory range for valid RAM. A simple memory test determines
0 p0 E6 {" h1 d/ }7 x+ h' W* the actually available RAM size between addresses `base' and. a( m* u$ Z% W2 S
* `base + maxsize'.: \' J' R# v( ?2 h$ h
*/3 I4 O/ I/ t5 s4 |
long get_ram_size(long *base, long maxsize)+ e, N3 R  |; S2 a: D8 p: i
{
; ]" R1 ]" }: h, o1 X. h! x        volatile long *addr;5 [$ [: }9 o- {7 g  [( \3 L2 M
        long           save[32];6 [; E  N+ k2 v3 G5 |/ X9 {2 r9 f: Z
        long           cnt;
3 Q$ `+ o$ E. Q) }" q/ Z        long           val;
- }; O! r3 H" E) ?7 B+ ~% t+ R* D        long           size;4 {$ C# w. y5 d+ E2 F$ \
        int            i = 0;
1 [5 `6 e7 {( v# ?, N; t! N- b7 A/ V5 v0 J& r# U
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {0 `' m! }/ W3 Z" M+ U$ I' j
                addr = base + cnt;        /* pointer arith! */# P2 x8 E+ n& Z; n# V8 m! J- s
                sync ();" `2 T" H' X( Y4 X- q
                save[i++] = *addr;
; P- D1 a/ B% \' ]                sync ();" R' L1 V0 D/ r- A: K4 @
                *addr = ~cnt;$ S! h# J& B8 o0 r% R
        }
4 y- A. [+ P6 C2 W
# g9 X# L% o5 ^% [# E  Q( r' B7 n) A        addr = base;+ H6 B; U% @, x
        sync ();) I, i# A: Y6 S1 J. \/ x4 P) `
        save = *addr;
! V  D/ \9 [1 R- N/ N8 {! E3 x. e+ _        sync ();
3 ]2 x5 C0 K( N% ^        *addr = 0;& e8 W5 k6 N) O8 N
( K) O& r7 z5 v* r/ A" a
        sync ();
* O+ k* H4 d' Q6 B# Z        if ((val = *addr) != 0) {# E1 A* M/ ?! R+ |: N( @8 J# \1 h. G
                /* Restore the original data before leaving the function.
3 e2 Z% b' O: I                 */
5 n- B5 `6 ~: q/ ^9 n% H# K. m+ x                sync ();
+ D* S1 ?+ _; V. u+ g                *addr = save;
) E/ {9 E6 C, `9 M                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {% d+ b1 `: }' R" `( `; L0 Y* Z
                        addr  = base + cnt;( {" x( N2 D: }& x$ M
                        sync ();8 q7 C' N* l( R
                        *addr = save[--i];
9 ?' \) ?( E+ B# b                }' b/ B/ i& H8 _& @& `* w4 \2 i
                return (0);
' ]2 M% O# B* |) _# C, g+ A        }
  f  F7 Z5 ^3 ~: y/ z) s- |, M2 W1 H% g8 ]* N& S6 Y
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 K" V& ~0 x! J                addr = base + cnt;        /* pointer arith! */, g1 L- r1 H& ?, ^
                val = *addr;
+ G3 a' J4 L  U1 ]7 ~& ]                *addr = save[--i];
& L! K! R: @0 A/ _4 C; A                if (val != ~cnt) {9 w% D  c/ m3 G6 m; @* o2 Q
                        size = cnt * sizeof (long);
4 n3 ^2 B: r. l1 `: B" ~                        /* Restore the original data before leaving the function.
( w' i1 ]5 C$ e' ~0 W4 J                         */9 d' y8 H& n  i/ \
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ m& X9 Y3 d, C' }( M5 _/ L
                                addr  = base + cnt;: O! ~/ w6 o% L* b3 ]
                                *addr = save[--i];
3 n3 V: U8 g7 ^* i5 d0 q  T. B                        }8 I( D0 n; @+ Q6 C
                        return (size);* c% i: G. L) }
                }8 i% ~6 \. R  I+ T
        }
/ }9 P' W0 j7 A9 I$ R# T, y: p" v) j4 }( ?. A0 {, \
        return (maxsize);/ I" }% F( r$ C+ I- X
}, |# \2 X; M+ L$ Y& y. E+ V  S
int dram_init(void)
" Y* U2 X6 g$ f& p/ D{
4 |1 y3 E% x: H  o+ Q6 `        /* dram_init must store complete ramsize in gd->ram_size */
4 _. z  \- Y3 ~, Z6 ]        gd->ram_size = get_ram_size(
2 f5 T) E. T) F                        (void *)CONFIG_SYS_SDRAM_BASE,
2 T1 D( M/ G+ |, z8 U* \+ Q1 B                        CONFIG_MAX_RAM_BANK_SIZE);
* R. n  Y; }: \% u        return 0;8 I* a0 f) b' ^. N
}
  c5 Y* J3 n2 _8 w' S! v  z/ A& ]- I- M8 l
( N/ y5 w2 D! K

) c" n- _7 s- B$ b$ l
" b1 u! k" k/ D; z- T- KFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 U) j/ I$ |: ~) }+ n9 w
, A$ J' e' V5 }) g# |" P: y! @$ K+ F4 r7 ]1 h9 d% W1 q

+ P& H& r7 c+ o' `# ]$ h




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