嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
) ~, Q: X% M. b- _1 m核心板2:DDR2 256M Byte   NAND FLASH 8G bit: ?) d2 v, O9 @
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- K' c8 [! s4 P2 r$ K0 r) b4 @3 a) _: R3 H; T- O: L
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' N" o- ~- j9 W5 m" W9 S: E' a0 r4 [' g4 N

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 X. M+ U& B9 e- V/*
) j. q# p. @9 [  f$ w9 v* Check memory range for valid RAM. A simple memory test determines
9 Y/ z6 M$ C; ^8 v/ x* z* the actually available RAM size between addresses `base' and
+ T  a% n5 a& L. k9 a1 U! p' A* `base + maxsize'.- i; H& o' d4 s  u( z6 ~
*/
; h& s3 E% V& }% ~. \long get_ram_size(long *base, long maxsize)7 y8 N7 g) r1 R! N% f  G+ U2 X
{
8 \. r/ c' I$ ^6 ?/ V8 Q; K        volatile long *addr;+ p1 z+ v% R- J5 j5 d  d" Y
        long           save[32];8 K( E: C8 u% p6 X% b; A
        long           cnt;
8 q/ l7 q! h9 h        long           val;
* t  H3 l9 z7 [9 @7 G3 A        long           size;" {) y7 @/ ~/ L
        int            i = 0;
* m; E- H/ b& c- L6 Q4 O
) S; H# t+ z/ H! D' C        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 T7 M7 G2 Q. ]6 _/ l/ A" h5 L( M                addr = base + cnt;        /* pointer arith! */
3 Q* D, T; b  d9 K. s                sync ();% C$ B/ [7 e) }9 j! \* |' S$ i8 C8 g9 y
                save[i++] = *addr;
6 u$ j: ?6 [! z' K; r# m3 U( H& Y% r                sync ();
2 l8 P( q: F: e/ w4 Y4 ^                *addr = ~cnt;
! T6 c! \9 f/ o* x# L+ i" T3 F) K        }
: u( g* W! Y& z9 z
' Q- {3 A4 S: U- h8 X        addr = base;# t0 R5 e1 m  {- `5 Y& p! ^
        sync ();! ]; J5 a3 ?- u% X) Y  P+ ]4 [' X. t
        save = *addr;. o" J( F9 V  F! z
        sync ();
" n; d" H" i0 Q8 g; p- k& G3 G; Q        *addr = 0;
/ L8 q6 O" K  ~9 ^5 r7 b# E4 o; H7 \. V; p  {# a, ?' u' N+ t: J2 G# C
        sync ();) d& x: k! \* O- Q3 t- {  \/ D
        if ((val = *addr) != 0) {
( @. e# b  v) c' k4 u' w                /* Restore the original data before leaving the function.
# c/ p$ c) E3 C8 {* f- i                 */) p' o! N" T* z7 c  G% O6 |0 {" U
                sync ();& H, `/ P% Q6 M; Z" r! }: ?$ j
                *addr = save;  F+ g2 ^4 X1 R2 K
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {5 w% K8 j6 p/ h! W3 e
                        addr  = base + cnt;
6 a: m0 ]! _0 C$ Q- l                        sync ();
0 Z2 D0 {  a* ~                        *addr = save[--i];
3 p' G8 ^4 z. J. z5 z3 {7 x                }, |9 f; K, ]+ }$ ?% G9 ?% e5 z. w
                return (0);. }% S1 `' L0 Q
        }
; F0 _7 f' H% W/ d3 y* K( U
, G9 }" x7 E( J% N- A- e8 s; q        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {5 o/ Y* X: p% t7 j3 J+ h
                addr = base + cnt;        /* pointer arith! */2 a2 e5 A3 u8 @
                val = *addr;( F9 x: I& ~* e4 k# N
                *addr = save[--i];  K3 c6 f. t9 [* g" J
                if (val != ~cnt) {+ |1 e! t, {! K" G& w
                        size = cnt * sizeof (long);* q* h9 W& H2 n5 j3 F# `& O
                        /* Restore the original data before leaving the function.
( e) E" F8 Z+ S- m/ S                         */* y: D. b2 V; q$ a, ^
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# T* Q& m- c* ]( H$ C                                addr  = base + cnt;# @4 u- ^- ]7 f( m
                                *addr = save[--i];
! q6 e( ]* c; m; t- I                        }4 m: |: C& F. [, o
                        return (size);
  @7 I) X$ Q7 r                }! I/ ^! Z, k5 q9 x+ F
        }$ R" Y0 w+ N% t" Z
( U; S, F# l1 ]
        return (maxsize);
% b+ }7 ]! t9 |" l% K}
5 y- G' L) {; P3 h8 ~4 J* z) Aint dram_init(void)1 l: c% u! r+ Y4 ]0 f; f5 Y  o
{
; [, O' p  z; r# r$ F; G( u) E% U9 C        /* dram_init must store complete ramsize in gd->ram_size */6 N1 D4 s' W' j  t
        gd->ram_size = get_ram_size(: I! U( m4 k; W4 _* C3 J
                        (void *)CONFIG_SYS_SDRAM_BASE,
) q4 `( M( ~8 @$ X4 z/ e5 b: I: v                        CONFIG_MAX_RAM_BANK_SIZE);
2 O; n) ?+ `( ]/ H  Q) @        return 0;! Z$ O2 y% j7 T4 h' J7 v8 I: S
}) R" v1 C1 W. |7 R
1 y- u( ]! }* G2 ?
. O; _- ~# R; J7 K  ?. J& ~, M

5 F+ ]& _+ r1 g% x- j: N. y9 B1 N5 L: {
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
9 f3 z; A1 \( s: \
% r9 t( X$ {5 U3 e) x: v4 `* P# q7 u& f1 y/ k' e0 f; H8 ^

( l8 i! P# d( D




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