嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit" F- \) [7 Q% P9 t* D! S2 N
核心板2:DDR2 256M Byte   NAND FLASH 8G bit, F: x5 J6 T, H
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" o" X8 y, D  A
, _/ V8 G% \+ ?  P' @& n  p$ d" V是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?5 ^5 G/ }8 r6 @% i) w6 Z% z
9 b6 n6 q  X, ?9 r% y, V

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, ~  k1 `( `: i, C" @# z- K/*
* [+ S/ Q9 E' @$ a! {8 f* Check memory range for valid RAM. A simple memory test determines9 s2 h! E& n$ X
* the actually available RAM size between addresses `base' and
5 ~8 e1 @& C. J0 o* `base + maxsize'.
5 f' R1 Q' F  a7 C7 }: x$ P*/
- o# b: Q, e' x' J5 u" |0 blong get_ram_size(long *base, long maxsize)
$ v0 S% k( Q* I( I{# f! m* f( C- b& A4 c" B0 R3 b) e
        volatile long *addr;" S5 S6 A* i7 c3 m9 R: W
        long           save[32];
8 ]) W3 ]# a; D        long           cnt;& c9 w' q# |+ y' K% `: Q2 y0 ^* D  B
        long           val;
: L( z" j4 `( U, v" o& }# A2 b: ^/ c        long           size;
' w' B6 B0 k; K& p. I        int            i = 0;
; k! V" v! n% d! B, ~9 I$ Y% F
3 V# h/ Z% b- w  Z        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 Y- W8 Z$ u8 B5 H* B& H                addr = base + cnt;        /* pointer arith! */
& r1 k' r0 A; J# \$ L                sync ();' M+ s9 f* B6 V9 ]+ F4 p1 Z
                save[i++] = *addr;
3 `+ J  j! u' R  W6 X' l( `* _9 |9 l                sync ();
5 E. ?5 ]& C( x2 u! N                *addr = ~cnt;( |% M: d" X: N; J5 a1 B
        }
& E, X! b9 i% C3 E- m$ E3 m1 j
8 F& K$ x7 Q# x        addr = base;
0 W& c4 a, H. z+ V        sync ();
+ E2 }1 i7 r* r+ a! J        save = *addr;. W; @$ Y6 K7 ]( I/ E1 [
        sync ();" C! G+ `: V, W/ ]6 R
        *addr = 0;2 w  H! H* v% H2 E  h, C4 @0 [- A

' b, C! O( E  r6 E( S1 S/ D7 s        sync ();
0 O0 u4 g9 f$ h9 j0 x        if ((val = *addr) != 0) {
( V* A1 p" ?; z) n, c  I$ l                /* Restore the original data before leaving the function.
2 K4 B( ?) Q& N. T  p2 W! _- |; B4 Q                 */; n1 X% n' {  L* ]: p. X
                sync ();9 K& S% J; J( H& Q0 }/ H1 w; n
                *addr = save;  |" @8 }4 Z9 F9 d9 p3 Q9 ]
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, ]2 t% ~+ s; b6 A                        addr  = base + cnt;
& R2 Y( G2 x0 C* _& m                        sync ();+ m3 V7 Q" Z4 [3 w& w( ^& _
                        *addr = save[--i];1 v: C1 I8 y# Y  r  c
                }
6 c8 f7 J  @) l- ]+ X, C+ ~                return (0);: `& {, X) b' f5 P
        }& f5 v1 g' s" E1 C$ P# B6 k% l
, }9 Q7 l; _) Y/ k1 N
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  P( i+ M" u5 K2 O& W  ^
                addr = base + cnt;        /* pointer arith! */; E3 F! c5 y2 k) L9 A& [
                val = *addr;
# w' i0 s! p$ b                *addr = save[--i];
* `) T, F1 K5 F% w' s( R                if (val != ~cnt) {: s6 `( a# ^7 n! k
                        size = cnt * sizeof (long);; {( K5 Z8 [" X: i1 v$ X# `
                        /* Restore the original data before leaving the function.
+ A: E7 S5 L5 x2 w                         */- q+ Z/ D* i9 L4 p5 c! _
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* s9 E! f4 B% j. W/ [. X+ O                                addr  = base + cnt;
) A- R. u$ W' o/ K5 R                                *addr = save[--i];( @/ A8 O8 g- i3 x7 ?, b
                        }
" o; g% m- _% r* j5 N( P! C                        return (size);$ @9 @) V0 R3 r1 {
                }  @$ _( x0 X9 _5 V3 ~. @% C( M( F% v
        }
, Y. t# `1 V! C7 F: b) @8 R/ {5 ?1 I
$ x) _4 |! E6 C        return (maxsize);
1 x* \+ \; r! G}
2 y) b1 v1 |- ^- ]& N# |5 Dint dram_init(void)
: V6 ?  X( X( a  A( ]{
" t) s* }8 l( j+ q        /* dram_init must store complete ramsize in gd->ram_size *// v9 }' A0 f2 A. j# Z- d
        gd->ram_size = get_ram_size(
- I6 D- S* L. h                        (void *)CONFIG_SYS_SDRAM_BASE,# I+ _7 M/ L& h0 \$ Z
                        CONFIG_MAX_RAM_BANK_SIZE);
9 D5 I# x+ ~2 g( x; T  r        return 0;
: f- y* N/ \1 @8 O1 s+ U3 H}4 w& F/ s/ c8 p- j% O' U" X

! Z  F; b7 I2 f+ `2 W7 e- r; s7 y. P, ]; U7 U4 Z

) x* Q4 e: I! C* R8 y/ d/ R+ h4 @
" W7 W; w9 e8 ]  W9 T1 SFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. C5 T/ W1 `: |1 N, Z: b2 h' J( }6 X9 `, Q
1 F- E# ^1 J; x" I5 T% X: k

7 V  l2 S9 d7 t. B6 l9 e8 E- y- {$ e




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