嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
* V  w3 P% |  \, F/ z+ e/ X5 N核心板2:DDR2 256M Byte   NAND FLASH 8G bit
: C3 M3 i/ n5 {3 `- g/ x5 m. y  Z这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?2 Z5 a' s0 L& C+ {/ Z$ L+ u  R8 c
% G# c3 d8 @& g, N" A% n) l9 U$ q
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 t( e! V4 ^8 s. U+ ^& h( I* r# @, y$ d, h! }) G0 h* b7 l; U

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ u; W6 A4 {. i% p/ b1 x9 @/*
! |3 n% F* [4 E; ]7 r$ B& C* Check memory range for valid RAM. A simple memory test determines; K+ w) ^$ Q# U5 W
* the actually available RAM size between addresses `base' and" l% q$ w0 ^% k. x, _0 w3 I
* `base + maxsize'.( f4 o$ T8 J. y) p. R. \% x
*/
* G# _/ ^2 J, |3 @4 Xlong get_ram_size(long *base, long maxsize)
$ Y5 }6 s' x! R+ j{) J' ^$ {# _7 j1 ~
        volatile long *addr;( A0 D5 {# l9 y+ R
        long           save[32];" A- p# s, v7 p9 y
        long           cnt;5 R% C) y. a; L0 m/ F2 ]
        long           val;8 G8 ^$ k, L* \( P, Z, `
        long           size;0 O% K) P% b( ^; F0 A
        int            i = 0;/ D- Y3 t" F5 [8 ?0 M

0 I  c* I5 r0 }! x2 ^0 ]2 C        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% ^" e0 W9 I3 g                addr = base + cnt;        /* pointer arith! */
! K# U# L) z( S' ~) ~0 h                sync ();
- i; y8 D) f. _' e& \% G                save[i++] = *addr;
: \4 t- y, e  l7 V                sync ();
7 T: d% H- v0 x: E7 G/ W; |! T                *addr = ~cnt;* {$ C0 [5 `' F: B& y+ w
        }5 F4 e3 b7 D& X& e

% D3 D5 t1 v7 Y8 x! k/ V        addr = base;3 Q9 k  C7 M% Q
        sync ();
+ K; _' j- k3 D3 K2 n3 p( H) y        save = *addr;; ]1 d% }1 Q" g' ^; l3 J
        sync ();
: a7 }2 g/ G, y  i: y        *addr = 0;2 J, D& W8 G2 K' b( R

. \+ r8 n+ D$ a        sync ();
, ^! V/ B) }5 w! t7 h        if ((val = *addr) != 0) {
2 v& P: i3 r- v; v3 R                /* Restore the original data before leaving the function." s1 u: m7 o# l  c
                 */9 ?/ b! d* V5 H) D: N4 V
                sync ();
! ?+ z6 w; n7 U; j* Q8 v9 e( F4 D                *addr = save;( V' s6 z1 u) }5 c: m0 ^
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: P+ d& t% F" B1 J3 Z' ?                        addr  = base + cnt;1 q( U4 ~) o2 D* y9 c: x; Q* }! K0 K
                        sync ();
' T$ n: n; S8 M. c  }                        *addr = save[--i];
8 C; w" c2 @1 a! B' y0 n. ]2 V6 X                }
/ o, C5 ?1 v; A, j                return (0);
! l2 p: ^: j$ s( y2 P& G        }. ]0 W) w! S) y7 A$ h8 {
. E% F3 @- L, c& r4 {) V4 w
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 H  b$ b! n  z& b' t# ?) r                addr = base + cnt;        /* pointer arith! */
5 ^8 U, A, y( ~+ T0 U, H$ D                val = *addr;
. S. @! z: ^7 o* A7 G6 v0 S                *addr = save[--i];0 x  F# h/ P0 I5 z; b5 F
                if (val != ~cnt) {5 J* X- n: D( z$ L: k* }
                        size = cnt * sizeof (long);
$ J2 G9 k$ I$ N6 C/ t0 N" n) t                        /* Restore the original data before leaving the function.
* B, V; ^  i2 D2 u  t/ @                         */0 J7 k1 J4 M+ D1 O* u- r
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
  U+ h% k( O& g; r2 M3 ~- {                                addr  = base + cnt;% ?; ~( ^* K% B
                                *addr = save[--i];
6 Y# _5 X; f3 O                        }3 U  \$ ^/ v) v0 B# W/ C4 Q
                        return (size);
: K3 X2 ?: ~7 ^1 K( ?# R                }4 a) `1 p5 a  Y0 A0 S: w1 F
        }
( o( I( l. k% U0 z& u! b1 i2 S( O
% |2 F) d" x" D$ o5 V; `# H        return (maxsize);7 h& @3 q$ C" }* U
}
2 T3 }) \; e9 z# o0 N& Zint dram_init(void)
1 r2 T  O8 t2 P# {/ `' n{5 K8 D* Y" {6 V! ?3 b( ^3 V- T* \
        /* dram_init must store complete ramsize in gd->ram_size */
! o! H" ?: O1 j% o; e        gd->ram_size = get_ram_size(
# g; b! @. J* \" f2 M% b                        (void *)CONFIG_SYS_SDRAM_BASE,
- ~! U6 m) z+ D& t! {0 j4 s                        CONFIG_MAX_RAM_BANK_SIZE);
" d( X2 d& d1 o9 W* Y2 T1 e) r        return 0;. A; r' I) f9 z+ O  Y
}( |$ C- E( a9 ?4 F8 e/ x
8 W" [: }9 w" G) T/ k9 J" r! C: M" F
; S* Q/ ]1 M5 ?  i' E; w, d& j

+ n4 N) e+ C  g2 r4 O% b. q5 f( P" A6 ^
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!7 @! f4 i& E9 G5 `

/ n# w: Y8 D, \2 C$ R8 H
0 X4 H- k. X' @" S
$ V" U3 |8 O; j* T9 Y: C. ~3 q3 Y  m5 W





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