嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit. z& d; S" G) `9 \9 }
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
6 ]& N  p: q5 r( Z+ I5 g这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
5 Z4 q6 p% ^; N2 {) k/ p- i* \( Q
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?0 C! [- _: v4 [. h
6 P, N5 |7 q" s; |. i

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:0 N* S7 a' B0 m! O0 H
/*
- f' X* k& x- i% J* Check memory range for valid RAM. A simple memory test determines" n9 ?8 e3 Y! r8 T6 M" s- ]
* the actually available RAM size between addresses `base' and8 x( M3 {, @( o- C1 a
* `base + maxsize'.( Y5 P# n1 ~0 o  C9 R9 J
*/0 y5 x% l/ ?% K, J3 @
long get_ram_size(long *base, long maxsize)4 U  [8 {+ o5 D2 q+ g, A: T
{5 ?& }1 d7 E% [8 h+ L
        volatile long *addr;
' F4 k5 V; H+ V        long           save[32];# b8 a6 U+ A: n  p
        long           cnt;6 J/ i& g" a' E: Y7 X
        long           val;
( R/ D# h5 h. z/ H+ p( t, w1 j        long           size;
1 }; ?( s3 u% I; p        int            i = 0;5 o5 ?: ~4 g% m0 X( X$ J0 Z" g
- V9 |$ R) d) R
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 N  _$ x$ x% Y                addr = base + cnt;        /* pointer arith! */
  z5 b" b# X3 t                sync ();4 }4 H( a3 D2 p: L/ F9 m
                save[i++] = *addr;: f- f5 R" Y7 F4 D- ?' g
                sync ();
& m) l( ^  `8 K. a; I; b) Q                *addr = ~cnt;" g" h) T: w' t3 M! N$ }
        }
: K* r* x+ M) _0 h' n
# a2 g. J/ z7 J9 m" Z, B# T        addr = base;
1 E) z" F9 h7 j4 {% c9 Y        sync ();2 j, `- e( }3 N# y5 o1 R" v3 k
        save = *addr;3 R$ c# r  B/ C9 [; k) R8 o  `
        sync ();
2 ?7 o. o6 i( ]9 L9 |% y        *addr = 0;
' ~) v  |! V4 c) U9 f
. r3 N1 {3 E; P        sync ();" i- S. c0 v* P( M5 E+ _
        if ((val = *addr) != 0) {! D. V: E3 E& G# a
                /* Restore the original data before leaving the function.
4 M5 f! O: P/ F  l' M, R9 `% O                 */
3 J# ]4 P% r: L! o                sync ();
7 L0 L& @* G6 ?3 a- k                *addr = save;4 M7 g% c. t2 M
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 ?: c7 k" ]5 I0 ]5 G$ r3 f/ l                        addr  = base + cnt;2 d+ O3 V% T* Z
                        sync ();% i( M5 @9 h2 B6 o( |( Q6 D
                        *addr = save[--i];! L2 ~0 U. v! c( s" T1 p( M9 |* Y
                }- U& o' c& ^+ x  T  a
                return (0);
& u. B$ y* G- E2 j! H6 b        }
; s$ |* t5 `# o" k  {4 y: z' |" ]" i0 n
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 R, q5 S' t2 k3 q; x/ }                addr = base + cnt;        /* pointer arith! */8 p% F* K2 C1 K  L$ Y0 e& @# L% `; X
                val = *addr;
/ a3 h% w) O7 o* S! o  \& z                *addr = save[--i];  H. p7 u# K# G' f& V: _1 O
                if (val != ~cnt) {# I+ M) t8 h* {
                        size = cnt * sizeof (long);4 L/ j7 B- l2 v6 a/ s, G3 P
                        /* Restore the original data before leaving the function.
% v, L% }% t" m4 j                         */
9 ?3 @) V+ A0 L6 C; U                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {! Y' O0 C: O  v8 n
                                addr  = base + cnt;
! b2 w  @4 x$ I% k& e. I* K$ }                                *addr = save[--i];
- ^/ E8 ]4 Z* j5 G2 k                        }
& Z( z- S1 f1 N; W' d                        return (size);
) t, r8 j3 z& D- r$ J/ d' E* a6 w                }: |0 F! d# t6 D3 M; d
        }. ?0 E. n2 C  I  f) x9 h
9 V- I7 \7 b1 H" G& `, Z
        return (maxsize);
4 P$ k7 n5 d* t' E# v/ a}
1 T8 ~8 o$ J  [% s7 xint dram_init(void)9 B. n6 M2 e9 d( n. S0 w
{, p- U$ ?+ t! [- k
        /* dram_init must store complete ramsize in gd->ram_size */
$ |( i- |; Z9 M        gd->ram_size = get_ram_size(' W9 {/ y6 M9 }3 p
                        (void *)CONFIG_SYS_SDRAM_BASE,
8 X4 w' K# B% K9 Z8 h* t2 M                        CONFIG_MAX_RAM_BANK_SIZE);
- d; j; n- A/ B        return 0;: m6 [8 ]2 e7 h
}% a3 E- U: U* I1 E# g3 d! s
' [; c8 [7 G& d1 ]2 C- q7 J% g- V

7 m" E' F/ C/ v0 L8 c0 R4 C4 y& {* Y5 H. q

; {* m& |. j# p1 o! MFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# w% G$ }& y5 G4 B/ \1 `/ y6 q# P8 F. y5 R" w; @; [
% K" l' @* h: M! w" [  J# u. a( B

$ A7 G3 i  Q' }7 r2 ?+ T! S




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