嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit/ `" i! K! |* o2 G
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
, ^8 o0 G9 U2 \( M这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?( u8 P9 }7 L6 ?6 @# T
& y* q1 \+ D" ?. U
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% p: |+ I3 A$ g! |; q. ~' Y6 `% a1 v: a

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) o! M4 o/ ]& m* Q$ W/*
$ x: x$ p5 e: Q  ^/ V$ S4 ?6 y2 F' a* Check memory range for valid RAM. A simple memory test determines
5 @7 Y! }5 x' m* the actually available RAM size between addresses `base' and. i9 X9 C9 K/ w
* `base + maxsize'.
& w+ e9 c4 ]- r0 d*/2 H) C/ a/ [8 i9 n, D  u$ v
long get_ram_size(long *base, long maxsize)
+ j: I0 n2 R3 l7 r; y5 b{
* ?. b4 w/ o: o  V2 v0 e3 u        volatile long *addr;5 `; ^* B) d. Q9 h  V
        long           save[32];7 s: S# `9 X( l/ o
        long           cnt;
$ w4 f- T# {+ l  m; C; p) R) q        long           val;
+ r  P3 o6 z7 R; d        long           size;
6 x" ?/ t7 c8 n% N# G        int            i = 0;
* ?- S& h$ s4 w  f- M: [6 W- @) b; S+ b9 _; T
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& Z/ v3 t/ T$ F' t' Y& U8 T# J+ j( n                addr = base + cnt;        /* pointer arith! */$ U- n* R3 R$ `2 G8 l2 l& e$ C
                sync ();
- b  x9 W1 j3 D, K                save[i++] = *addr;
; U! q. ~. f+ i+ J                sync ();5 `) R: q1 P2 k
                *addr = ~cnt;" [% O- [: w& C0 \
        }! v# `: `( t1 g7 q3 [. X( N

) y- v7 N4 x/ V* m" [- y8 u: a) l        addr = base;/ V' c" w1 x* C) F
        sync ();: D7 ~) Q4 F  S, G# z/ s. H
        save = *addr;0 X1 G  H" _6 v2 ?
        sync ();/ j+ l4 G: I$ G, V* X8 n
        *addr = 0;
% o2 l- `  J( {' Y8 d- D: {+ t2 g8 @: e/ `
        sync ();
; @( l; w" `  p5 Y1 O4 V        if ((val = *addr) != 0) {& z9 \' u& e2 M) t$ z: Z4 g" G- s/ ?
                /* Restore the original data before leaving the function.
& F6 N# F6 P2 E8 r                 */1 Y  P; P! H5 Y+ H3 P0 s
                sync ();7 n, F$ F' @5 R/ |5 o) Z2 H: \$ |
                *addr = save;2 T6 A% {% A; E8 A% \
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* O/ |* \; N4 B                        addr  = base + cnt;6 x- d8 s! i# K* p" a. r. @
                        sync ();( n- @% l. n' ~2 d6 F0 e. i6 z% w
                        *addr = save[--i];3 k  I1 G6 E% M% G$ ~( ]* o& K
                }# Q. y" R: X& J' w/ F
                return (0);
" Z; o& t3 r) O" X9 D" I        }& C3 a+ U& a) {- b5 b; E5 M
7 a4 ~. Z; `2 G7 `
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( \! K& H4 a/ I# |                addr = base + cnt;        /* pointer arith! */
3 C  A$ q9 C- {* M7 N, l                val = *addr;
/ U; G; x& }6 Z6 f. X                *addr = save[--i];
1 e* j* e7 z% p9 O                if (val != ~cnt) {& J. _: D% X5 U% W0 l
                        size = cnt * sizeof (long);: z5 q6 h  A( I
                        /* Restore the original data before leaving the function.
0 r- ^* Y, a& k" s& j* q                         */  Q5 n( R# o( J# C& `* [
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
  O- }, J& R( l3 \  ~                                addr  = base + cnt;3 F. P9 N" O! |$ G' y: W4 Q
                                *addr = save[--i];- ]- S3 m* U3 D; ]  ^
                        }0 y; a4 }9 \0 x3 ^2 ~4 L
                        return (size);& R9 P! Y- u) i6 N: ?0 {
                }* c5 x- B8 n# B4 }8 }/ Y1 K$ m
        }# [% ], O) J' {& c
- t4 O" n! F5 f; E! ~. B
        return (maxsize);/ X. r+ s7 V$ C3 N
}
$ \. X+ S! |7 C# |  `int dram_init(void)2 Q- {1 d+ h1 k+ W+ K( _7 P4 a
{/ S- l& L3 s+ m% O+ d$ e. |. Y
        /* dram_init must store complete ramsize in gd->ram_size */
4 \$ ]. T5 c. q+ z( o0 r# ?: ?        gd->ram_size = get_ram_size(
! G. L3 N! E4 i+ U                        (void *)CONFIG_SYS_SDRAM_BASE,
3 ?3 l9 y$ \( e( A6 S                        CONFIG_MAX_RAM_BANK_SIZE);
+ ~% J% ]( Z  T        return 0;0 ^% u% z% u7 n
}
7 u, q$ y* ?% H
1 X% D# c1 \$ A1 z& `8 t
0 O2 n1 t0 B' X' ]5 e9 r3 ?5 N5 o" t% N6 k3 |

/ o$ O, ?# P& n9 m' ?4 aFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!) ]* ]; }! f, b4 Q: \: n5 q

5 E1 M) N1 b# q% s& H5 u
5 I" N" B" n7 H7 S. U7 Q

" B% J) E7 T  f6 n- ~8 ^




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