嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit) s8 W* e4 P/ |# r1 @& u" _
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
# Q0 C. T& n+ O& m2 `这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?+ g7 \5 @  G# F5 J8 w
% Q' l# T7 ~9 r9 Y
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 Y0 N5 o  g: i( B, d' v3 \
$ P1 n/ }7 O+ H& `
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% Q; R2 A& T6 V/*
7 C+ p2 c' Y. \7 r8 C9 w0 c$ {* Check memory range for valid RAM. A simple memory test determines
% W2 z2 W% n2 r& p2 Y* the actually available RAM size between addresses `base' and8 Y: i$ N  u8 t+ I7 g0 r6 A  e
* `base + maxsize'.
7 }" b& {' k# F# F$ y( _*/2 c' o- {. P( T# W' L2 C
long get_ram_size(long *base, long maxsize)
1 X' K/ t! l3 N6 k9 X" p  c$ h{1 A* _2 e' X, R4 @" W5 C
        volatile long *addr;! w) y. {& N2 H: j; X; v3 @
        long           save[32];* g% D0 u; M. `' w
        long           cnt;
" p' R) ?3 U! P( k: I        long           val;, w) |: K% `6 _" o
        long           size;
, M# \# D( j9 D        int            i = 0;
# l1 u/ q& q" r. P8 P' r" M/ o/ b# y* F
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {! G0 \* @7 M- {4 B! S/ l+ A  u$ @
                addr = base + cnt;        /* pointer arith! */( ]1 N9 i( @& l7 x' H- ~
                sync ();9 Q4 G# }0 a, Q+ H+ Y
                save[i++] = *addr;
$ o: Q' z6 }" t3 [8 l, `! f# y: _                sync ();. f! S3 M- f/ _: T6 X. Y
                *addr = ~cnt;( z" {4 D, ?; f- Y9 f5 M9 {  a
        }
# p- j6 S! |* I1 C
' B% M2 J- a+ K0 U- H; P        addr = base;
5 O0 a' ]0 V% I' M( }$ x        sync ();
& m8 g! g5 T' O1 s8 j0 \6 @& g        save = *addr;
' [* }8 D, Y3 R1 |2 `" k        sync ();4 Y- \6 D) j( N7 q  K
        *addr = 0;
/ p/ D1 m$ |! f5 C, I6 H
* X* I- y/ E( ?2 F2 U/ J, l. _2 G        sync ();
% T: H* [  g0 r( e! y. Y0 e+ D        if ((val = *addr) != 0) {
7 U2 K: w0 V1 f. P1 b                /* Restore the original data before leaving the function.
; m6 W4 W& l+ N8 }  m                 */
$ }( t9 \" P; k5 g+ f" M: z                sync ();+ j% w/ [4 K, q/ @1 ^/ N' p6 O
                *addr = save;
8 K4 q/ u  E- }& ]4 F3 [) ?                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {. t6 M6 v# z' E+ \8 p  w  D
                        addr  = base + cnt;: _1 R* a. N! _$ o4 @. l' K/ Y
                        sync ();& J' @1 ]/ p. v) K8 `/ V& u0 }
                        *addr = save[--i];
) a+ z1 }/ q4 q3 D6 p5 w                }( G$ G& a- k4 O/ g; N+ }6 E% [6 ]7 r
                return (0);, q! F3 Z) {/ {1 g1 y9 X8 U3 g
        }
5 U& |' L" P* c' R
* v! v% C9 Y1 d' U        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 Q) h* k0 s) k! j; |
                addr = base + cnt;        /* pointer arith! */
& P6 K- A1 `* U  {9 ], `1 ~                val = *addr;
5 u" V  Q( |' M$ \  O                *addr = save[--i];  ?# g* E$ m  w; }
                if (val != ~cnt) {
  Y3 P. @5 g# J( W                        size = cnt * sizeof (long);9 Y, d7 q: @2 `7 K$ n
                        /* Restore the original data before leaving the function.
8 q4 ~  O5 t7 y" Q6 L& ^7 i                         */
  Z  Q* T2 ]! Z/ H9 ^/ Z8 m                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" j: A2 a1 n0 E. q                                addr  = base + cnt;
  w6 v1 T+ [9 ~9 W                                *addr = save[--i];
1 \) S! p  |# F9 t+ d. O- A) r* e1 t                        }
2 {6 t! [  m4 l0 l; f                        return (size);
. g) r. }) i' J                }
/ ~9 g9 X- |' t5 f        }+ d( i1 j3 L* Z; T& f

. f' J/ D- K- s5 A        return (maxsize);9 e9 M! }" B/ R# x- y- N( ?# m+ S
}
( G* ~8 o4 H" d) X) g" ^! eint dram_init(void)
3 s$ C6 w, T$ |$ @+ A0 V% m{
! c3 q2 y( w* i0 }$ I        /* dram_init must store complete ramsize in gd->ram_size */: V  ~/ p  C5 S! N0 f
        gd->ram_size = get_ram_size(
$ w8 \0 Q% |* G- c                        (void *)CONFIG_SYS_SDRAM_BASE,
8 i) }, W8 Q6 t& i* `( S. }                        CONFIG_MAX_RAM_BANK_SIZE);4 O. r2 k& p3 Y& O' l. \
        return 0;# X) B+ S0 P; |* Y8 y. C' a
}
. o- r/ V* @- O' E3 J
; M$ V3 h: V8 Z* ^
! C, E+ v( G  ?+ p- W9 v" G
$ P) t% r  p0 C- N# V8 r+ @4 E+ m, E  [- D0 ?
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!/ G* e0 R4 w& l4 Z5 w! G
, x7 |2 g8 C$ q: V2 p5 K0 ^( d

& B0 S' V, m" E1 d
' x2 N( N( V: k8 e





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