嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit$ k! `6 v5 B0 w$ K) P
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
! S0 @; Z% U! r2 b" a这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- j0 t5 i/ D" Z/ i1 a. m7 `3 v% O* \3 b' s( D
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?3 Y; |, H4 Q5 Y. b
" }8 p7 Z! R8 z4 O" e

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:- G; ^; Y" n# p+ Z4 O+ ~( ]+ f  I1 j
/*
. ?% `5 f+ Y3 V* Check memory range for valid RAM. A simple memory test determines9 m7 D/ ?0 q+ t
* the actually available RAM size between addresses `base' and
$ S: ~* Q, @+ w+ ?9 `1 r* `base + maxsize'.0 A2 G' g# x4 p. f. t
*/+ [# O. t! ^$ }# g2 i2 j3 ^0 B
long get_ram_size(long *base, long maxsize)
$ M6 S/ X1 e" X0 j{6 _6 i& c; {9 L1 x) g5 \; X" ~
        volatile long *addr;0 E5 L& l  P+ N
        long           save[32];
6 U9 U7 @7 W% \        long           cnt;, q; J, B5 V/ g5 ^
        long           val;
* c  v$ ^) K3 T7 x' Q  u3 j        long           size;; s4 k8 Q& G, |& s. {5 a9 f
        int            i = 0;
1 T$ Y! l( S  Y6 P" c# _9 b& z* L7 x, z5 F! s0 i
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {8 [. G, A5 w) a8 S) t8 y% F: T
                addr = base + cnt;        /* pointer arith! */
0 ~. J1 s2 \8 y                sync ();% h* X+ l4 k$ a  S1 D4 A5 ^% K
                save[i++] = *addr;' |  Z& ^6 S4 }; Y: \3 j. {- n
                sync ();
) J: `1 o& ?# P+ j0 T8 W                *addr = ~cnt;
! ^1 ?& I& p$ v( q        }: W6 e  A7 A4 V8 P: S
; X6 y( s$ x* M; J! F
        addr = base;) m# \; _$ _; x
        sync ();
3 n3 d. o* u1 u1 U4 F( n        save = *addr;
+ ~- c9 ]5 d- v5 Y        sync ();5 x. [) E  O* P& W
        *addr = 0;
6 g$ i; |; t) Q1 r2 n4 T1 H' E, n$ i! i& o  a" S, E
        sync ();
* [1 P/ i+ Y1 Y' R        if ((val = *addr) != 0) {
  B9 ^% o7 T; e/ d                /* Restore the original data before leaving the function.
- O# S' K/ c) }4 U$ d2 u                 */
4 U, P" n, I8 G/ S! p                sync ();6 l2 u7 A3 N7 C5 X, B
                *addr = save;7 n" t; c* a+ F8 j/ o
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# Y& n# ]: \: N                        addr  = base + cnt;
4 n. J7 l2 ^; g7 H) L                        sync ();/ I8 ^( l8 }4 m* f; k, M
                        *addr = save[--i];0 R7 @5 R+ D' r. o5 o
                }  e0 o2 v+ H, T- ?0 C, ]
                return (0);
7 J& U6 \  o) H3 x, A8 O" _+ I' A6 Y        }
2 q. P9 g2 S. u! v5 n( ~  k3 u
1 f* ^; q7 D+ _* ?) Q        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {1 j/ q6 j& l, s2 {0 G
                addr = base + cnt;        /* pointer arith! */
% p/ Y, t: Z1 }                val = *addr;
7 e. K  K* ^( G7 A6 t                *addr = save[--i];1 Y7 E9 l& D2 m$ S/ Y
                if (val != ~cnt) {- K: F+ }3 H& R
                        size = cnt * sizeof (long);4 w5 }. i3 Q6 l9 [, R
                        /* Restore the original data before leaving the function.3 J! }) T! Q/ Z: j
                         */
5 ?) b" ~7 }) E. P& R                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- J  ?" V1 @0 m( H9 ~% ]* x4 C
                                addr  = base + cnt;
0 K) J; r* [- O                                *addr = save[--i];( D; I9 i7 \* @+ s- x
                        }
$ g* R# ]$ ]& Q- {- s' V1 K* e                        return (size);/ k; Q. A* Q6 o# v! x- |
                }8 f' E1 x$ `7 M
        }
$ _/ |" V; g% r: T: e
* a3 [& h8 ?% w! F" T        return (maxsize);0 B3 L0 @4 y8 T' c+ T8 D
}) y2 h1 c5 H  N3 C% D$ \
int dram_init(void)& A3 I0 J6 J$ S) v' P
{
( }  q4 \9 w' K! L8 ]6 Y        /* dram_init must store complete ramsize in gd->ram_size */
/ R. a( y  y  B        gd->ram_size = get_ram_size(
1 d" Y2 r: C* J7 {/ p, t7 L: [                        (void *)CONFIG_SYS_SDRAM_BASE,
2 e' g2 U% C% a6 V- K- ]( D5 X                        CONFIG_MAX_RAM_BANK_SIZE);
6 I" V1 X. `4 w5 E2 N# M* v        return 0;+ _! S7 }. L  I% C) _6 G# \
}
/ O' Z" W3 |% D3 `+ T
" O% P: Y" q# `& a% U) d" x3 T: W9 [( _0 L
4 L& D' W! A; T" C* n6 p6 i
1 t8 {% r2 _$ g9 j5 t6 K0 _
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- h. b) ?/ q/ v) q0 F8 F4 Y0 b/ _  _2 x

* d/ K2 I5 g2 z; E

' M; Q  S* ^! |  p  ]




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