嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit# g4 Q: r6 G+ C
核心板2:DDR2 256M Byte   NAND FLASH 8G bit/ T  J" r1 z: o. q; s
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?7 i! [. U: ^; j5 v0 }; O

: F* x" B6 P& W+ `* |是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?, u7 n$ i6 V7 _% I7 z( H9 {5 E

/ \6 c4 W7 M6 X4 |
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" t' ?* B0 ^0 t8 e7 N/*$ H# b. b2 l/ u5 w+ I
* Check memory range for valid RAM. A simple memory test determines+ R  i  P9 G2 q" T% ]3 h8 O
* the actually available RAM size between addresses `base' and
0 h% z' X1 p3 n* O$ ]- S! h5 `* `base + maxsize'.8 J8 R2 ~; {' T( m, c* C/ ~
*/. S4 B+ K  n# T& L; l& J. R# g: N% t9 }
long get_ram_size(long *base, long maxsize)
: h9 b. O3 l3 b7 [' P# j9 e8 b{
, R1 m( W6 h1 ]  }" V8 u        volatile long *addr;
; l; O! R5 ?! V* _3 n$ t& E        long           save[32];9 W* E2 D& s- y% L7 B
        long           cnt;
  E/ {! f3 _$ w6 w        long           val;! ]4 D. W! Q8 y/ V  S6 U9 p
        long           size;8 X8 r) B; j" b  S
        int            i = 0;! y0 ]* R; ^) k' x3 q
6 _1 b) v  m) F3 B& {1 x. i8 n
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" f- h+ `; ~% N: h  r1 K9 Z                addr = base + cnt;        /* pointer arith! *// i) V" B+ u: U( X2 b% O% S
                sync ();
0 s' ^4 v  O( h) x' D+ `2 N                save[i++] = *addr;
. C! q" V0 I& T/ p6 U3 i2 ?' n                sync ();0 t2 n$ a0 ~  R% e
                *addr = ~cnt;1 Y% |4 |# b- {0 d- P! s9 y/ ^
        }& r. Y% y: {3 w( n8 i. V/ }
6 q# m7 t9 e" u: ?. b
        addr = base;$ F0 ]3 `! f$ S, T, I
        sync ();
" k' X6 X  v) @) ?' h: s; x- s        save = *addr;( C/ |3 G1 r/ b9 Q
        sync ();
$ z, S' A! \9 C9 W* H0 x" G        *addr = 0;
3 Q# I7 C* s& ]& c0 B7 x: E  b  k; M2 x0 y
        sync ();# b# _; m* L2 Z9 z7 z
        if ((val = *addr) != 0) {# u0 L  R# E/ s/ `( p" O
                /* Restore the original data before leaving the function.+ f+ C8 S& ?5 C
                 */
/ c; r8 D& w4 ~; {: P                sync ();
; b1 j( l* M2 J3 F                *addr = save;
9 |4 V8 i- \; o9 b                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {, M3 k0 f; C: [1 v; I
                        addr  = base + cnt;
+ g) J* M8 g$ [, W; S+ s$ T) E                        sync ();2 K+ @9 u, s2 L1 @8 E
                        *addr = save[--i];
" _7 [) N7 j! K; h" N/ o                }
& |5 ~  R' ~. J( R; t( y% |) F# S: y                return (0);' j$ l: d7 x" |, `8 Z  o
        }& E& w; W( C% Q) B  H# [

0 n4 s" k& X  Y2 Q$ s        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ m9 j: X8 Y% C( q  M1 l
                addr = base + cnt;        /* pointer arith! */( N+ v- P$ u' ^, e& L
                val = *addr;4 [; v% ]& U. Z5 F5 N8 i
                *addr = save[--i];
6 D- u7 _5 Z. M& |) h9 l                if (val != ~cnt) {! A0 a& {# y$ O: F
                        size = cnt * sizeof (long);  T5 W$ e5 F0 w. R2 M6 w
                        /* Restore the original data before leaving the function.
& b' R4 l6 Y& H% C$ ^                         */4 A0 w' w& a0 m: t: y  X1 Y2 ]; b
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 m4 s4 Z* f1 W2 o, c7 \- P
                                addr  = base + cnt;( e; x; o6 S& k9 b. b! X% ^
                                *addr = save[--i];
  n  V8 f! {" P/ u' d                        }
6 c2 a: p2 a5 Q) e                        return (size);3 Q. _% x/ _# y) n
                }$ J% e, _, W4 A8 S5 T; @( m
        }$ v) z! W2 j' S' y2 u3 A; M

7 L2 S, Y. I; w3 w- G5 i/ e& u        return (maxsize);% q( \! v9 @. C7 U3 s
}
8 v/ k& _9 Q' T( K" h+ Q4 oint dram_init(void)9 Y: y8 Z; F5 f6 j6 |
{
/ b% G. k6 P% a4 p% @* c        /* dram_init must store complete ramsize in gd->ram_size */
3 R, v* ?' p8 ]5 R: d        gd->ram_size = get_ram_size() N  a# _0 `+ t" ]: l
                        (void *)CONFIG_SYS_SDRAM_BASE,8 o. I2 X* k5 w4 a' G8 z5 M2 L
                        CONFIG_MAX_RAM_BANK_SIZE);$ e2 g$ J3 L9 \4 \: h
        return 0;6 B9 ^# j" B$ Q1 L- C$ j% D& _( T
}& x0 Q6 m* v9 A5 m% ~& v/ M" u9 X
& W; D$ ]& X  f/ G; ~
2 h, K! S, z7 o( ^8 t; ^6 ?

" D8 ^8 ^4 c/ U: N# p6 d2 U" l% V3 F: n0 ]  x8 }. U( }2 W) e
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!* }! T$ d  c, z1 u; N

' Z. ^; n* r7 {, S( p7 |
6 ?" L* w/ f8 Q; D) y
- W/ D" i, ^( t8 y% s% L# k





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