嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
% X3 A/ Y3 z, y2 Y核心板2:DDR2 256M Byte   NAND FLASH 8G bit! y6 u: Z  a/ I8 Z  v$ B( |1 A8 G
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?$ B0 d8 B  [0 f* v
! T* X: u( Q+ [5 e  D
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& Z. r) C  K* R, Q
0 F* l* T7 X' R. N9 \6 ^6 c- H
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 ^7 p9 Y8 N$ a5 @7 U5 M/*
. I. d3 }: L1 o' P; a* Check memory range for valid RAM. A simple memory test determines3 }# t% J0 q' T3 L3 G
* the actually available RAM size between addresses `base' and- Q; Q+ @6 p  Z+ E% P
* `base + maxsize'.
3 m# I3 I  P6 X. O0 m# l# K7 K*/4 z, w. H9 @9 F1 V* u/ k$ G! K  ^% ?
long get_ram_size(long *base, long maxsize)5 [) \- D: J# m2 A4 b  W
{# k' t! s3 u: I) p. ?7 S& z* a
        volatile long *addr;: g1 h+ e% c. D8 G! ?7 e' ?
        long           save[32];
  K" Z% r2 e# j) R        long           cnt;
3 d2 y. a; t( Z4 T9 t& k$ R        long           val;8 V8 |% k( a! _5 M# v  D# i2 Y& K
        long           size;
% B" Z. \. W( a/ q0 D3 J8 C! D        int            i = 0;
4 E$ U7 z7 g; e% x3 A! t& e$ A! b
. F$ {& I5 s( y0 {1 E! g        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {' c) `# G. N1 v$ K6 q. ?% V$ D
                addr = base + cnt;        /* pointer arith! */: S5 h; N* n* j, ^. W
                sync ();8 E: v0 A1 p7 B* r: Y6 I* t
                save[i++] = *addr;) @0 m4 A# v1 A9 w
                sync ();  }: D+ V6 ^6 I6 I: ~) D
                *addr = ~cnt;# F4 |8 R# j( o
        }
' ~& A" N) Q, c# A' \9 p: Y% J. n; a
        addr = base;; o/ t8 k' h9 j$ Y5 ^& q* {
        sync ();
' g7 M8 K$ g4 g3 O        save = *addr;
2 O' j% U5 e) A& y" M2 p        sync ();
# i6 c7 h1 _5 r; ?9 j        *addr = 0;( W3 l# f8 k% C' T9 }. }8 T
( w) n& L0 K7 y. M: M( F# w
        sync ();
3 ~; F! _$ @3 z& s% {        if ((val = *addr) != 0) {
& z: g* w& s, C& C: d3 O                /* Restore the original data before leaving the function.
4 P% `) l; b( l9 h" p; h8 u9 Q* K                 */
! P. }" f+ f( }  X                sync ();
) k; C% c3 I1 c: V                *addr = save;
/ z3 @: @$ H# N7 ^4 h& @; {5 o                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 c0 Q. u* |5 E/ f) Q$ |& ?* U8 d* B                        addr  = base + cnt;
: ^5 @% d; y+ s5 e                        sync ();
" b3 ?! ^7 j- r' ^: @5 |                        *addr = save[--i];
' a! s2 \' B2 h) V" C0 w% H' o! O                }/ c( [8 S: J. }' g- A
                return (0);9 Z9 _) M: M- i9 q) r
        }. Y" C! |% K2 `# G
+ O: K8 C# r* C0 k
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 B0 A' [5 i: I0 {. w$ i6 W                addr = base + cnt;        /* pointer arith! */
2 k& s9 w9 p7 x6 s" a                val = *addr;
' }# A# s* ^4 p7 ]                *addr = save[--i];5 n0 X3 K7 A2 M
                if (val != ~cnt) {3 d: P. k9 p( D, P, w$ q
                        size = cnt * sizeof (long);! Z9 S8 `, k; G3 x4 t$ g$ N9 {
                        /* Restore the original data before leaving the function.. l# ?" U/ g; Q) d
                         */8 `9 K1 K& z* Z6 j- _: m5 F) |+ o
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, `7 ?, B8 i5 E: B+ k3 _; [
                                addr  = base + cnt;8 L$ a9 d" i! K0 I6 F& D1 i
                                *addr = save[--i];) n" H6 u: o5 k9 X4 |) ]
                        }* R7 I+ w( g9 ~
                        return (size);
. U; w2 \6 U1 o' w                }
/ p- o+ Q' u* B4 k4 n& u        }
$ T6 H/ Z. H* ^% [( G  p
# f. s3 j8 Q- G* X        return (maxsize);& h$ f0 o- f! T/ m* G" ~: L
}$ Q+ h6 Q7 z; q! y
int dram_init(void)( W% @: S! ?7 t) @! Z) D
{
/ o. ^, p! B! l- X        /* dram_init must store complete ramsize in gd->ram_size */1 B2 Y! ]% a2 _1 I1 j
        gd->ram_size = get_ram_size(
2 e+ n1 Q2 K0 c! }                        (void *)CONFIG_SYS_SDRAM_BASE,
: Y& }& F8 ]2 o3 v; Y                        CONFIG_MAX_RAM_BANK_SIZE);
7 A: I- |4 f3 G' T  b' U$ ]        return 0;4 O7 t! [; r7 h8 S3 E
}
+ t+ i) P! U+ t- T6 `
; c9 {8 ]! K6 q  j4 ?2 P6 E
9 _- h! Q6 B. y, P  u3 N1 h  d1 v  P9 e

$ U& s' g7 O. f6 A6 s  _1 HFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' C5 i0 Y1 P- w' v3 I; c  _3 r
* n* u) M* r8 w* f4 f, a% v, q0 N8 s

, h" k- }2 o9 S




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