嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit9 a: o: h) ]% C" D) l
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
- h' O2 V1 C3 C2 \这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?1 R0 f  }, P4 o0 h* t* z$ a; R

" m* p& v" ]* i, F" \1 ^是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& b" p- `' f  ]
! c" x5 t; D: A- I' \6 ^
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% t; s5 u. v; t5 u1 u8 v/ P/*
# L# M3 |- ?) k; @+ S+ p4 _% {- {* Check memory range for valid RAM. A simple memory test determines
. x7 S! S, z* ?+ U$ b* the actually available RAM size between addresses `base' and
3 h7 b9 T* Z1 f* `base + maxsize'.* |  z1 e7 f9 s
*/( f$ l7 ~1 I  }% R
long get_ram_size(long *base, long maxsize)$ @1 O( d% f5 c- e$ L
{
& m+ Z( m# I2 U- y# I: m% a        volatile long *addr;% I/ m) S- w' l: `
        long           save[32];, C' o4 w& E2 M3 m  t
        long           cnt;
: d0 R6 W' U! R* C* J; ~! L6 X, ~        long           val;
2 O1 A) ^) ^, z  \0 y        long           size;
4 ?5 T0 U5 H/ Q: N2 x        int            i = 0;7 |9 A+ ?5 O: F3 N! r

5 {% c! a! W8 M7 L( N6 w/ R        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {! _( f% t2 X$ z( B# J8 ]( A
                addr = base + cnt;        /* pointer arith! *// b6 j. ?3 T; Z& w; j
                sync ();" m" I- p, a5 _! G: t+ K4 U
                save[i++] = *addr;
5 u) P  e9 u! K/ ^                sync ();
  b* W1 H( N/ H0 c4 t                *addr = ~cnt;
/ x0 G- I+ v- r4 k        }
- {8 q2 z0 Z* j! v/ b& k3 X
1 U( `8 _0 P; U. o# I        addr = base;, v: q( ]+ Q$ r. v3 o+ `+ U
        sync ();3 ~; X; _6 @9 E
        save = *addr;! I/ b) M6 s1 |
        sync ();- b+ n, x, `- ]( D, v4 C
        *addr = 0;
7 z  V: O& [. Y0 C) K1 k, n1 J: O& u9 V+ y% _
        sync ();
# v5 h- e% H/ H        if ((val = *addr) != 0) {
4 e% V$ _% a% t3 V: `6 F* N6 V5 W                /* Restore the original data before leaving the function.9 T- d/ M' S, x0 \' L
                 */! Z# }8 c" B$ T- k6 F* F
                sync ();
# m, b- W: @/ u  e4 z* ^. @                *addr = save;
( n- p7 A% E+ Y% U! \9 d                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; ?  T0 V$ v  e                        addr  = base + cnt;
  `6 i. a8 ^  G* q; o1 f& {                        sync ();
$ p& Q2 x& {0 A' @                        *addr = save[--i];; u4 k; |* J6 a% V
                }! t6 l4 K0 W3 W7 E/ u- T+ y) c2 a5 O
                return (0);9 \" ^7 ?  N% c
        }
% C% h6 X8 s1 H. W: F0 H; _! X/ ^3 P6 Q
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( q+ S8 t4 W! d% U4 ]* d: h  L
                addr = base + cnt;        /* pointer arith! */
2 j+ K" H" p% A' G5 E                val = *addr;6 V0 g! ?5 o9 F7 Y/ W& x
                *addr = save[--i];* R5 ?; H% F1 g. x
                if (val != ~cnt) {8 b' H1 i( c+ w4 Q& N
                        size = cnt * sizeof (long);2 m, {5 B+ H# K( R5 @5 r
                        /* Restore the original data before leaving the function.' [- \( k! I/ \+ i& P' b
                         */
% y  g8 w; `6 _5 d/ n; L                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: C, O; w5 R* V9 m! t
                                addr  = base + cnt;- a: z  q5 F2 L1 j) u  p' k" E" Q
                                *addr = save[--i];
  ]8 v; E! l  `$ \4 V                        }6 b- t+ V& T1 L- F! l
                        return (size);
% ?2 f' d# g- q- h# ?% }2 M                }
' e0 t8 i5 w. N0 s        }
  E8 K8 f2 V1 [( ~/ V! n7 t8 ^" Z( q8 }2 W8 d, O
        return (maxsize);1 q: @5 i8 z* _( j% O
}
: D( I" t4 |- p: V; G6 Sint dram_init(void)* a$ D* d# [% \$ v6 {- k& P
{
/ c9 G, b, B; b, E0 q$ [8 M, ~        /* dram_init must store complete ramsize in gd->ram_size */
1 ^; a# X9 a5 O; y; u1 I        gd->ram_size = get_ram_size(+ J+ Q" @5 c' W& n
                        (void *)CONFIG_SYS_SDRAM_BASE,4 x6 G8 J2 l/ L# y4 M
                        CONFIG_MAX_RAM_BANK_SIZE);
" _; @; Z) S' D6 B: S" z        return 0;
5 d: I: F! Z0 ~+ Y) @}
8 y6 @+ S6 j6 H# M  o1 d
8 T) e0 @' ~/ e3 c0 j- @) x$ N, t4 \: t1 B& s: J
( k. c+ k; j/ z( G4 o( Y7 \
+ t2 k- v$ x" q/ f2 o, a
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( [9 a4 M8 K* @3 X! B% b* h6 h# e3 }

! i* h5 h2 e; _$ t; }: E

% m8 t' i& S: }" M5 G' [% c/ B1 q




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