嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit; B$ F( U$ {* U! a- M) |
核心板2:DDR2 256M Byte   NAND FLASH 8G bit5 Z$ [4 T8 X) T* g; H1 _0 P' X
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
( r9 d4 A* |3 c
8 k& P/ E0 z7 t是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 c9 _# R# v: @
* y$ R. f) B3 @, h. u* Z
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:" w4 N2 n6 S' O' b
/*% H2 @7 E! {+ `( K
* Check memory range for valid RAM. A simple memory test determines& z( M5 ]4 K- L8 A
* the actually available RAM size between addresses `base' and
6 _; Y$ b4 i( E9 h$ k' `* `base + maxsize'.3 G% ^: g  W* z$ Q2 E8 \0 A1 \
*/$ P( t* {1 d& X. g8 v8 @
long get_ram_size(long *base, long maxsize)$ W( {+ F2 w8 {+ Z
{/ Z% D2 u) j4 d7 {9 j9 B
        volatile long *addr;: ]/ h9 ~6 c  F# _" ~
        long           save[32];- O% `+ u8 S' c$ v, v( d
        long           cnt;. `/ t( E6 R+ v, C' |! K; Y6 X
        long           val;
, i" L% A$ C3 q/ u) B2 g" ^3 J: W        long           size;- `8 f1 Q2 g. q* v( g
        int            i = 0;
- @# G( F% u$ l& t3 Z5 }9 W
8 b; {0 i5 |" J' M& w* E6 u        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 d* q' G$ U7 }" `) r( r( \                addr = base + cnt;        /* pointer arith! */% }% n; C0 Y" y" _7 T9 l, y7 {" A
                sync ();* S6 `9 M" u: P/ }. w  e6 J
                save[i++] = *addr;
7 k- q2 }* Q# \" _0 p                sync ();
0 l& J+ K: ~! @* I- Z" I& d4 r                *addr = ~cnt;
2 L( I% U+ o  Q        }
' i% J. o) s' i4 T7 B& u
: y. q- z/ O% }; O        addr = base;
4 f+ K5 p4 \2 z- |  I        sync ();7 S  [* N) w& p
        save = *addr;, E7 W: O4 j- q9 b0 j
        sync ();& A$ y5 i6 t( C  K) I4 F
        *addr = 0;- w9 J" t: D& k( y! |& s

" ?. R5 u& S& f. ?) T) |        sync ();
* o2 d0 m2 Q' p* O. P        if ((val = *addr) != 0) {: K$ c, U8 R6 I4 y. g
                /* Restore the original data before leaving the function.
, C/ s& \) |4 T0 W8 ^- L2 g                 */  F' c3 v0 X8 K0 l) E
                sync ();
! ]8 I, E1 f5 p                *addr = save;
  n6 ?5 }. C$ X* r2 b# o2 N                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 Q7 x4 [. o$ i9 N3 g: w% O( f                        addr  = base + cnt;9 p, [. P+ [4 o3 h3 y. `8 p
                        sync ();
+ u( h$ p) p2 o                        *addr = save[--i];' Y, ?# X$ b7 ]7 y" b" O+ F1 B4 i$ N
                }
5 e5 i7 }9 e+ L2 o: g                return (0);
; a, T& I2 {7 G2 R/ [1 U$ i3 _: _        }& d/ ?" S5 W" u0 s2 E# F; A
$ _% Y& U+ W4 c; z
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 R  ^( x" G$ }
                addr = base + cnt;        /* pointer arith! */
1 L* W8 E0 Y: S                val = *addr;1 I) I( c4 _! Y: n1 @
                *addr = save[--i];6 k2 I( I% T4 t+ `9 o, W
                if (val != ~cnt) {- w+ C& f* b$ I# w! t
                        size = cnt * sizeof (long);% l9 E5 [, \! R, V
                        /* Restore the original data before leaving the function.
, K, _5 n" n' j) R$ ]1 f  t                         */* y; V# E* t; f" r/ m
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 u; S' r, M1 g
                                addr  = base + cnt;
5 D$ _0 f% a0 R3 Q% Z                                *addr = save[--i];
( g4 c1 h' {3 N4 R; z% ~; b* G                        }' w2 X8 v  f( H+ i+ k4 W
                        return (size);
- G% }. M8 K: A! J( e                }  R. G  D" \% i- c! K
        }, H  P! u5 t; }5 h
, p9 [( ~; n; V
        return (maxsize);+ I2 e# V, N4 o# {8 x3 Q
}5 B! g( F( _% A' E
int dram_init(void)
8 e& k) d. J+ f" T6 M& k# H+ h{
7 ]; L9 T- p4 v        /* dram_init must store complete ramsize in gd->ram_size */
* y& f) `$ g, o  _! m2 Z- c        gd->ram_size = get_ram_size(
5 W2 ]" q/ \+ ~0 E                        (void *)CONFIG_SYS_SDRAM_BASE,2 V/ H* u  O/ @7 h  J# k& w: w" k
                        CONFIG_MAX_RAM_BANK_SIZE);' q( `" }5 l4 s9 p8 K8 i
        return 0;
' v1 I: H7 f! s1 \/ \}: ]  A7 M2 b# c0 L

. u) S& l2 f1 k; O1 U5 f6 v) Q2 D. e' X, o- ^( s4 L; f2 s: k. B

! {8 ?3 z3 ]/ _8 b0 L, i* r% y
9 z' f3 Y) O  I, V, n2 k# YFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 l* ]( F9 H! [; J6 L! R, I' K' V4 j; v, e
" l8 ~8 @' Q0 F6 L' _5 ?

' q+ m. r% W2 g* O; C2 v




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