嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
& j8 J" a6 R7 I0 K核心板2:DDR2 256M Byte   NAND FLASH 8G bit8 @9 K- T4 f) x) H% Z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- M/ t$ e+ n8 r  N2 i
) u" N' ~+ a6 b$ l4 V# B" w是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; F! F# }( Y) }: ?8 S
; e: C3 L3 Z, U: F) m/ z7 P4 q; A, c
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:: O5 u0 O" u' d3 b; _+ K( l+ w
/*0 u5 j3 ]5 [& }# V$ g2 q! V' h& @  {! e5 a
* Check memory range for valid RAM. A simple memory test determines
1 q% y& e' k3 k" Z* the actually available RAM size between addresses `base' and
8 M  L! {, G7 `! c) Y2 N* N  u! }* `base + maxsize'.& H6 m! Q  N# D) ~. B4 E
*/& E& z8 V4 D7 G4 W/ L# O' e; Q" v2 Y3 }
long get_ram_size(long *base, long maxsize)
, V! q5 i5 j9 A- s6 g2 b{
8 X, g5 T% Q6 w9 v# w        volatile long *addr;
0 x. ]& n" H  z7 O, f        long           save[32];
" {- c$ l! y1 u: W        long           cnt;
4 B0 e; ]1 {! W) x5 ]! K* p, g6 `        long           val;
" |; |5 t! E) }2 @8 V* g        long           size;
/ }; u5 E* N& W' A( c        int            i = 0;9 V: m9 Y5 B7 F0 t$ `8 M

# Z0 y' i; a/ X- k' Y, Q        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- p; ?5 M1 ]3 [8 }: d# z3 L6 T                addr = base + cnt;        /* pointer arith! */, P/ B0 q8 h5 M+ |7 w: L: b3 l
                sync ();
7 T: l8 _" r- C7 r/ |                save[i++] = *addr;
, Z7 L3 D; A4 e6 S% Z* x                sync ();5 D* V1 V3 g6 b, l
                *addr = ~cnt;" ~/ t" x" ?. m; q
        }0 ^4 w6 C; o# W) Q
# q" V; o5 k' b; a6 c
        addr = base;4 a6 i; h+ C: m  D2 `
        sync ();7 }- {$ e0 V/ @: m0 t
        save = *addr;
9 E4 G3 `: u# N% o        sync ();
  a! H0 D: a3 y$ m0 m/ V9 I) ^        *addr = 0;
# E6 ?- s  C8 w( X" |5 w- {7 @3 d9 c% m; d% R3 r% a/ b
        sync ();
0 ~: ^* p+ R! o$ }# ]        if ((val = *addr) != 0) {
7 b8 Y- ~& r' @: L& _- Y                /* Restore the original data before leaving the function.
% t2 `  R; k7 r  B                 */
" v) |5 ^5 t& I) G- w* V% k                sync ();
' n$ F# A' G, v7 Y, x                *addr = save;5 l1 r- ]  k* c1 c
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {% X  R1 Z# ^3 ^, O7 Z* S; F
                        addr  = base + cnt;
1 ?9 {2 L5 O' A1 {8 t6 X                        sync ();7 J. r6 G# f+ j5 H+ M+ X0 _! N
                        *addr = save[--i];! j1 k5 `- i7 m
                }
3 @' C) {/ }, X                return (0);
/ R" ?) D# s+ A6 L1 {        }
8 f% [$ l5 o% I; a3 ?6 p) Q7 a) I, a. |) i# l4 a. o8 s4 H
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {4 c9 U- i; t, F8 r3 d6 o5 d
                addr = base + cnt;        /* pointer arith! */) |/ }7 x' N! \4 B
                val = *addr;
, {' ?3 N: v. L0 G7 Y) @                *addr = save[--i];
2 J( f5 p) K+ [                if (val != ~cnt) {
, o3 Z) H4 F# o$ y                        size = cnt * sizeof (long);
/ {' ^' S/ |; B                        /* Restore the original data before leaving the function.6 K% U5 h% c# f: R6 ?1 F6 ?- O  m6 ~
                         */
+ |# H4 r" u/ W& ~8 P                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* W9 u& C2 v6 ^1 a" J" f                                addr  = base + cnt;2 W0 q4 j: E, j4 ^" W
                                *addr = save[--i];3 t9 s$ z' X( h( c8 M
                        }
/ h5 [1 n0 [9 P4 Q2 o                        return (size);  t% b4 _4 `8 R+ y
                }
5 T; E' g# @) _  `4 ~+ z        }
/ S6 Y+ S% o& ?6 X6 u! E3 b5 E: u& X; P3 H7 A8 n5 k
        return (maxsize);
- y& w2 E5 S# A8 s& R. F) M}( k6 H* R6 }3 a& z# s3 P; O& B. v
int dram_init(void)
$ P* R, e  e! N2 f/ U{
7 i7 b3 |$ ]/ H% j8 ]' Z        /* dram_init must store complete ramsize in gd->ram_size */# ?. t! ~' N) @  w0 F9 u
        gd->ram_size = get_ram_size(
  T9 s7 I8 q! l7 z                        (void *)CONFIG_SYS_SDRAM_BASE,# F. Z" u; |4 ]+ }$ Y4 e2 v1 ^% I; i! w
                        CONFIG_MAX_RAM_BANK_SIZE);: \& w8 b; H1 M9 q8 Y5 n
        return 0;6 P3 K( Q! _* ]; ~, ^
}9 V1 ~: N9 O* a& }0 b; k2 g/ A

# I6 h7 q4 r& K
4 i0 `9 E! T  s% j" x. V
, C7 E& Z& w3 G
2 |/ I' D' a2 ^# g* Y8 DFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* H' i+ k; `) Z5 Z8 }0 e; _* \
0 V4 s8 x6 w. C7 b1 z5 P
- m7 ~4 K1 @1 {* v

9 M1 h. _1 Z% d1 V, {5 `/ y




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