嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
1 q- q! t  |; x7 Z0 E6 ]" Z核心板2:DDR2 256M Byte   NAND FLASH 8G bit
9 s+ |: `4 L. p这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?( n4 }" W5 A7 S9 L$ E

& X4 z0 h$ P0 R* F& e是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?9 o; \2 i- @9 f. E4 F3 x  ^- O$ {

5 T9 M$ O7 J- r+ a" T! V
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: K) v" G$ b8 Q7 |4 W4 P% _/*
3 h. }; T7 Q1 e* Check memory range for valid RAM. A simple memory test determines
- q! h* \1 c4 T8 l* the actually available RAM size between addresses `base' and
6 M- i. R( \% N. K4 ]* `base + maxsize'.
( o+ a3 ]1 a. Y- i6 J$ v*/9 Z2 H/ B& o! v9 f1 q
long get_ram_size(long *base, long maxsize)0 I5 `4 p9 D# Y
{( q7 S: V1 C' c  l& J+ Z/ M8 W
        volatile long *addr;
: }# @, b' f5 \! E( W        long           save[32];
" M9 {6 J& P0 E4 y; }        long           cnt;1 t* u: J+ Z! J* x2 v9 h. s6 F
        long           val;5 Q. Y0 H9 L) N3 g4 {; M3 B. w
        long           size;
  c5 q6 F4 d# p5 \7 ^& @4 O, {+ I- j; o        int            i = 0;. y) I% C6 b3 J8 r' Q* X
8 S6 z2 z. q8 L6 l4 X1 u
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {7 n; `: @5 u1 S. I" j
                addr = base + cnt;        /* pointer arith! */
( \' Z' n5 G  z                sync ();$ Q5 K5 m1 i* S% ~
                save[i++] = *addr;
' C" N3 w; e, g6 R8 l3 o# p% }                sync ();
+ I# [5 v. g) Q- U& c                *addr = ~cnt;
9 K/ t3 T, a# {* z6 [) z' O. _        }
" L' T/ a" r4 O& d2 o3 D. p# M( Y0 ^, A3 U3 |* ^! C9 _6 r
        addr = base;1 u, L( Q/ l2 o3 N  o) ?, K+ f; M
        sync ();& Y9 w4 d2 {0 O$ w2 n* g
        save = *addr;
) p6 d/ B. ]5 k6 @        sync ();
5 }' t$ \7 t3 c& e8 _7 X) d        *addr = 0;. M( G! F8 G2 ~" @1 c* |

, Z& F; q3 g: i4 p        sync ();3 W) g7 y6 D3 O8 B/ L
        if ((val = *addr) != 0) {9 z" ^- V/ I8 s( `+ Z: b+ S
                /* Restore the original data before leaving the function.
+ s. L& _, O/ K  r) [+ f- ]! z) x                 */
5 S3 P& \1 I$ w. \5 `5 l, T* S. u                sync ();8 t  m' b# _! g* n5 _
                *addr = save;
6 E' G6 g8 |0 Y. _" F! \; Y# S                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# B: ^! ~( _9 T                        addr  = base + cnt;
+ z7 I1 ~6 t5 v0 x- m5 U$ Z2 L                        sync ();" n* n) r+ Y! D. j" a
                        *addr = save[--i];; h& D8 h/ p  x# F5 _) F1 a
                }
" m2 [3 {- S2 i% m) F5 ?                return (0);8 p: e8 |* a1 x* \% Z
        }, W; j9 k3 f9 l* x5 V

; o) K7 h% b6 b1 A        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 H  q$ l: F* X
                addr = base + cnt;        /* pointer arith! */
1 U+ S$ q& T& x  d% z$ p                val = *addr;  S. n* }: [0 T% E- E, z* n
                *addr = save[--i];) t2 T; E* }8 ~$ M/ e/ @
                if (val != ~cnt) {% ^8 E5 E0 l/ h6 }' u
                        size = cnt * sizeof (long);  \$ h: A* f$ {
                        /* Restore the original data before leaving the function.( I* X- q9 Y$ j7 d- |4 o
                         */
" Q0 b3 {+ _( i9 M2 a" j( N& F                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {% H0 w2 A2 x' |( v' @
                                addr  = base + cnt;" w, G9 K9 s! P! N. O1 s2 o( |
                                *addr = save[--i];9 f4 i5 ^7 W4 C7 D
                        }1 `' T  u3 P5 x5 ?
                        return (size);
  O0 T9 l- a* t                }6 |  N5 `$ ]+ U0 }9 P+ ?
        }" s4 \& i4 c: [

2 t6 D1 B4 V+ f7 Y) {% X; V2 Y        return (maxsize);
% ^. |8 {2 k4 U8 O+ y- d, w}
/ j$ q% h! k1 `" W7 i# {. Mint dram_init(void)
8 i2 o- J& n# N* Q8 M! ~{( N" P9 Y2 f1 p/ P) }
        /* dram_init must store complete ramsize in gd->ram_size */, Q# }, c  p1 r' i
        gd->ram_size = get_ram_size(
, F8 Y- a) M7 `  B                        (void *)CONFIG_SYS_SDRAM_BASE,9 B" T! s9 W) l& ?; i- w
                        CONFIG_MAX_RAM_BANK_SIZE);+ \, U. X, }: f4 m; A
        return 0;
. ^) ^5 f9 E5 H* B7 A}4 Q% z4 J! n) K) V8 N7 k7 ~
5 t8 D- R% z# I9 e, M

: K2 I  @, p2 Y6 {1 ?# L, B
% N8 o* v( X  C7 ^" j& a) E1 r: w8 G1 a7 f8 h& t9 W, f
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& O- a) v0 c& w- I" P0 I7 w' f: O/ F" X

3 [/ O& F7 n. ~/ o
  f. Z( u) v& _  e





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