嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
. A& f" o: z' T; X4 b4 R核心板2:DDR2 256M Byte   NAND FLASH 8G bit
2 S' M& E4 b! {! T/ k& H: Q这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
8 J  d* J+ P8 B% g& h+ ~6 v% V* F
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 U9 u3 H* `7 f& V
. [7 M' ?* {( h; J
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, n: r$ ^' s4 P/*/ b+ W. n* D  q7 |! u; t& H
* Check memory range for valid RAM. A simple memory test determines6 |5 m8 c' a( V5 h
* the actually available RAM size between addresses `base' and" N0 P" g9 a% k7 x( L
* `base + maxsize'.
6 p  K% Q. i" v5 F*/. B5 o# `" M: {+ {4 V. Y4 S
long get_ram_size(long *base, long maxsize)
8 x1 o7 q  y# y5 a2 Z4 E{: K$ U. K/ b3 l
        volatile long *addr;
4 t, p) M/ t% M( U1 @6 j5 c        long           save[32];$ `8 f4 c) F8 Q( \) A8 S
        long           cnt;) e' j3 u$ Y0 p' _
        long           val;
: r, a% }& [$ O- T$ Y        long           size;
8 g& T4 q9 }$ R% `        int            i = 0;
1 E0 ~3 P6 {- `" N
* J0 W8 c2 V% [) M        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {, t: F+ u6 R( w: F$ h
                addr = base + cnt;        /* pointer arith! */
& O3 y* E- F% S3 _; b0 q                sync ();3 M. }: t" a1 q1 ?
                save[i++] = *addr;
8 Z* a: u8 ?, o& ?& `                sync ();
- q) M2 Q+ K2 D6 f                *addr = ~cnt;
% J* l0 V+ m8 e5 Y* v- @        }& g5 u; [8 d. i  J4 i0 {# U

) h2 c# r7 G* B" w  |        addr = base;0 w3 J/ P! ^& k: n/ y: r) K8 q
        sync ();
/ @) N2 ]1 b1 v/ c% Q* w  P9 z        save = *addr;' U; j* ~* B+ t4 A& Q! _, a) u
        sync ();
/ c* C4 q$ }$ C7 i        *addr = 0;
6 s- ^& o5 ]5 {( k8 r
# d9 Q8 g' Z2 \* W" y$ f        sync ();4 t8 D4 W7 I1 f
        if ((val = *addr) != 0) {3 Z9 B' v& V: i' A+ q% t  W7 V
                /* Restore the original data before leaving the function.
+ o5 t5 v. \. k: r; k                 */
  _0 w- U: C( q                sync ();
' H6 O0 D) {  C. E- w: r" I6 H  J                *addr = save;
4 a* G  l  e6 F; V% k7 w: r; L                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ s+ T( c: R7 u- y; x6 w8 U& Y3 E1 h# c                        addr  = base + cnt;
; M, r/ X4 i7 f7 c# [                        sync ();# X. O; [' C( h9 S; M" `
                        *addr = save[--i];' Y. c' O& ?  U" p, ~- D! x
                }8 @  C4 _2 [6 e; b0 _6 G5 U8 D
                return (0);
' A, _$ d. a2 Z2 `4 A( c% S7 n) r5 ~8 b        }. \- b% w, O3 D% z1 u
3 I3 O. H1 N5 S% {' t) B6 S. i8 ?
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. t6 V; H- [- G9 s                addr = base + cnt;        /* pointer arith! */) A6 a1 |% U) N; \, ?! Y. }3 `
                val = *addr;
+ i  G6 Z1 ~0 ]9 ^" w0 d4 d! `& F                *addr = save[--i];
2 U$ y/ }2 ~/ j, q, Q0 Q                if (val != ~cnt) {
* @, G2 R5 [( h1 Y4 P3 U0 v' {4 R; w) O' T                        size = cnt * sizeof (long);
' ?. c# c$ s* W( ~& s. n                        /* Restore the original data before leaving the function.
/ c; T* V, s0 A- d0 P& J                         */8 \( y% Z" Z9 ]1 \% |8 g
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {" U, w, w& \2 ]6 y2 z) l8 W
                                addr  = base + cnt;
1 z" G. M7 r+ S, `  S9 N                                *addr = save[--i];
1 C0 Q, O! v- p                        }
: }& Y; p1 H, C2 W  B6 a1 v: ~4 j                        return (size);
' y5 p# V" ?- m* J                }
) h1 F0 r6 H0 I% E. O0 W- I. E        }
! r+ p! [, B, E+ t
4 S1 D) H! r$ Y) A' C        return (maxsize);% l* E9 p# J9 A' V1 Q6 F
}% P" S, P( c$ E
int dram_init(void)4 |; Y' c, R, z# ~4 x# \! ]) y; q
{  L5 x% }, S. h- K2 M, o
        /* dram_init must store complete ramsize in gd->ram_size */! q7 V5 i7 A$ Z) |% k- \5 V
        gd->ram_size = get_ram_size(! b% P% W7 D$ k* K# ]8 e8 z0 @- N. k
                        (void *)CONFIG_SYS_SDRAM_BASE,
0 {1 c# j. P$ E/ B0 F                        CONFIG_MAX_RAM_BANK_SIZE);/ o% ^+ V& \. S4 @/ ~8 @
        return 0;5 O6 X" }1 J$ G3 M4 L3 Y
}* u0 g, c- x1 ]" u8 A! z! v+ w

1 \0 J$ Y. ]0 a3 r- s& ?1 V0 c3 ^/ }; k& H, X. t0 j# P

# i% E2 l5 K3 f. k
; F  j* ], ~) e7 A! }FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 R: X, G* Y2 ?8 E
, U% o) y# q6 `6 }7 X
! C7 V# U% H, b0 J6 V
& e8 j* ~& ^0 C' k" h7 [: f/ M+ i





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