嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit& e7 i/ ~7 A+ [1 z! L
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
5 Z3 c; x; O* ?: P/ u5 J这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- f2 ^+ k+ e" {* m
$ I/ i9 `; {( z是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?7 D$ {: N, Q+ R

/ b$ ~) Y5 u, U: T& ?+ ~8 x
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 d& ~# @  N0 a$ ?/*
; S6 n7 v, b5 h3 }, ^: S8 Q+ q* Check memory range for valid RAM. A simple memory test determines. E. X0 t8 L. N, Y* L' J* i& z* \
* the actually available RAM size between addresses `base' and  m! A% B2 v' R
* `base + maxsize'.
, u+ O! ^+ R8 R6 f8 ?3 k*/+ N1 H9 S- y  l: @% d
long get_ram_size(long *base, long maxsize)
1 }, h5 @5 x7 A# g& G# [{
5 x9 ~9 x: i( p9 B- X        volatile long *addr;
6 H! k. q2 T( t* w        long           save[32];) ?3 K1 \* N  q( O
        long           cnt;6 d9 @  y" ^/ _' E. j& P  a' y
        long           val;9 m' n" [0 k) ?' d! M
        long           size;) M5 L' Q' N! k/ V: ^
        int            i = 0;' j9 A% \1 Y+ d! F' `+ k' a4 B3 f( Z

+ q' A. @# e/ B8 \- j: N        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {0 m7 H/ h, b  }
                addr = base + cnt;        /* pointer arith! */
% ?( R; `0 G0 d! N8 N  @                sync ();
" H. n. `0 B2 o2 Z                save[i++] = *addr;( Y7 n. |& d1 H7 E
                sync ();* n2 M: Y8 a: _/ U# L7 p
                *addr = ~cnt;
5 w; b4 c1 w  j, V0 z1 p5 ?+ l        }- X, `( Z+ E: q; U$ U" Y4 h$ c
) K8 I" e3 M" A, G
        addr = base;
' `& H, [8 S% q7 _# Q        sync ();2 u7 H, n/ Z- K7 V3 c8 v8 Z- Z
        save = *addr;- O* j1 m' N( Z
        sync ();
9 ?& P6 G6 F5 n; n( P7 O* u$ Y        *addr = 0;# q& E& Z" C. B# _2 q: z9 m  F

0 Q2 |# [" f1 @: r: Y2 g5 D9 t        sync ();9 Y" ?* P" I# P
        if ((val = *addr) != 0) {8 D1 x/ L% e6 X. b
                /* Restore the original data before leaving the function.5 u" f5 O: @4 K. s/ \
                 */- D- h7 }1 ]; K+ b* A" c4 @# M
                sync ();$ A/ I7 W2 V6 u* l( R; D8 I
                *addr = save;) p1 |* Q& i) ~& a
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ v* x, E, |% E+ l. U                        addr  = base + cnt;7 ^4 W6 m: c+ L5 U* J) E7 C1 x
                        sync ();0 f) e/ N* n- `
                        *addr = save[--i];# d8 L8 e% {% a% z  q* p
                }" O; y; I/ P/ V1 E" G2 K, [
                return (0);
5 ?8 O" H+ ^& w  }6 X4 J. Y) {        }
! L& F" M' c/ x; P  w& y; v8 Q
  G$ Q" ^' p/ X5 j0 S! z7 K2 U* r        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* d& k4 _' V3 P
                addr = base + cnt;        /* pointer arith! */( q/ |3 J. ?0 B, O+ U* u. I
                val = *addr;9 C" g( B3 X) N$ E8 G6 y
                *addr = save[--i];5 n+ J. }+ e9 X( I+ i2 J6 Q1 x" ~4 g
                if (val != ~cnt) {
: R# h% m& E- o! e- Y/ ?8 W" M                        size = cnt * sizeof (long);
" V2 r. d% G' M7 v' i% N0 K                        /* Restore the original data before leaving the function.2 W9 Y8 Q7 ]- X& n- d3 \
                         */
, o( ^& A6 F: ~6 B1 T  g' X. {1 O                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {1 D& k+ v% ^9 O
                                addr  = base + cnt;
: z  d* h0 A+ A4 a. ~9 O; f* O* ~                                *addr = save[--i];1 K. z# E8 |' O2 q* A* h3 a1 K, U
                        }
  Z, D4 Y% S! b                        return (size);
$ {$ ^( F' J( Z" |, u! `, |                }& r! N& v; H/ d/ u
        }  u& g& W) i8 z, f0 F5 N

9 j9 Y. V" n$ v6 }' ]% A& E1 P        return (maxsize);
8 q! m0 o* X% G}
4 U) G$ I9 ~2 c# kint dram_init(void), A8 X! H2 X9 o" |
{
: G  K5 W8 s0 b$ E' S5 t" }        /* dram_init must store complete ramsize in gd->ram_size */
6 G9 ~& R4 L% G  v" n$ P' g! ]! f        gd->ram_size = get_ram_size(
- R; M+ u- I% ?# {                        (void *)CONFIG_SYS_SDRAM_BASE,- l, Z5 @* }- @
                        CONFIG_MAX_RAM_BANK_SIZE);& `" P  B# @- k! X  v* _9 K+ E, f5 z# J7 ~
        return 0;
# Z. D! Q1 d5 n2 r" T}
# {- [) c! Y; p5 @. _
7 b. F' t4 G" O+ s" G' I
. z! j1 s  X. L' j( ^" O; x2 j6 W7 P9 M, P

  D3 B" o9 S5 K6 s6 I, l9 YFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
3 R7 P3 G  w4 A% x0 J3 t! f5 P0 J; C
& E% M1 p! T. C4 _" H$ J( W( P- ^) I' q1 p- E- N9 g
2 ^. m( ~; s# Z( L- G7 {





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