嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
) Q+ G# X- M( U2 o, t$ P核心板2:DDR2 256M Byte   NAND FLASH 8G bit5 i1 H" R% x" q6 w8 Y+ H
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?; ?/ `  v; Z7 m6 `! ~% Y

4 a8 p  V6 N' n! V7 ?- I9 k是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?# S1 ~5 G: G7 ^& H

4 T) D' m- [3 q( c
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:; F3 u, m7 O9 o8 s$ P! D% A4 Y- e
/*
* ~- y; ^5 n" W* Check memory range for valid RAM. A simple memory test determines3 R: ~0 `$ W  \3 k( \% {6 q  s
* the actually available RAM size between addresses `base' and
8 h- B8 K% f; v4 o+ t) Y' K* `base + maxsize'.
5 K! e' Y! I( v% E$ R6 y; l3 D! Z*/
% F; Y& M5 b7 V! t2 ?long get_ram_size(long *base, long maxsize)4 m. K! q. ^) H2 U
{' }9 Z9 z6 H& C: X, A9 b
        volatile long *addr;2 m  i  y: k+ o0 i2 ?/ w6 S* X0 |
        long           save[32];; N0 a) s* H% r9 e+ s) s4 ?3 g8 z
        long           cnt;
( T! F$ @0 l' o4 F+ z/ S& ^        long           val;
. L* R9 Z, C. L. d! ~/ _        long           size;
6 H  B$ M1 m& t        int            i = 0;
1 }3 f0 {; v) C  F  n
  L& _! b/ y! a% x        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! a$ t) J' ~% t1 u! C% ?                addr = base + cnt;        /* pointer arith! */
- }4 u) k( w8 r- s. U+ ~$ u9 [; }                sync ();- ~6 a, N) i1 R& b/ j1 Y; j6 z) F6 c3 x
                save[i++] = *addr;( P/ Z! w. h, Y- X; C
                sync ();% C  Z5 _8 M( S  U
                *addr = ~cnt;8 j" P' z: n( K( E) o9 p7 R
        }- b! c$ S+ K7 n
1 n: l' a: Y8 v
        addr = base;% ^- u2 F2 e. [& [- s
        sync ();0 e+ y: Y) U" V- Y
        save = *addr;
8 c# w  ^, G. q, _9 x& g9 _- G' D        sync ();
% ~! ]+ H! P0 x        *addr = 0;
+ o7 g' {6 ], [8 i+ M! h9 l3 y# [% u, J1 }
        sync ();
; X) `5 Y4 t* ?# c! ^9 E* C        if ((val = *addr) != 0) {
" V' J: I1 L/ Y1 g7 t: ^                /* Restore the original data before leaving the function.) W7 w# [: ~' Z) y/ o1 V
                 */0 D1 j( ?1 i- k- e5 H2 d( o% f
                sync ();& ^) O. y5 f$ r0 J$ i5 z  s
                *addr = save;
( o6 C0 \, e! z  A9 z& Z1 o6 z& q                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* A( b" G$ T. i5 y% I& R+ p                        addr  = base + cnt;
; f" o2 S4 I& b# K9 E0 Z                        sync ();
" p+ [: n( ]% u                        *addr = save[--i];
! {. k6 _: A  t2 _) w# x                }# g& }8 ~7 i7 a6 P& T, x' ^! l
                return (0);
) O) B8 o8 V5 S0 t/ s8 v        }
% y/ v+ m7 k* F& `
, u; f2 w, a7 P( o        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 \- a4 A6 t/ o% f# V
                addr = base + cnt;        /* pointer arith! */# N& m9 V% g# I7 O7 e. D
                val = *addr;
- T! @4 X" X6 q  n8 M  Z. Y                *addr = save[--i];
/ w2 S8 _! x. S, p                if (val != ~cnt) {
7 v3 G! |$ f- B                        size = cnt * sizeof (long);
: X- y1 f' z: c3 G                        /* Restore the original data before leaving the function.
9 y; E- m3 g5 a' b                         */0 S  |! G5 K! ~! p8 Q3 z
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {5 X6 v2 j+ {$ \4 a0 P
                                addr  = base + cnt;
4 B, G; a7 n: W. ^                                *addr = save[--i];0 T- u) V) A+ @; N/ K
                        }  ?7 x% _6 r  \! F; k' H8 J
                        return (size);- g% a4 Q$ b9 c; }$ ?, |8 W0 z( n
                }4 Z, i) R! T7 t% n' ~) `6 p) `# Q% Y
        }" m$ j# I- O6 F
- i% P8 m( v  l
        return (maxsize);5 J0 y2 z0 r* t
}; Y5 v1 u* ]: X+ z
int dram_init(void)
& C& r9 }$ ?) [2 [- \{
4 V' b1 j, v, C) w        /* dram_init must store complete ramsize in gd->ram_size */) ~" y# H! A. k& z
        gd->ram_size = get_ram_size(5 @( J4 R9 M; x5 y5 D. x
                        (void *)CONFIG_SYS_SDRAM_BASE,
4 E' ~' z% |. w8 a                        CONFIG_MAX_RAM_BANK_SIZE);+ w, y$ i  l' V0 J
        return 0;1 L5 l9 U. z6 k! ]- C" c& x$ A* M( h
}
+ P# j. u3 p+ P( F  ~2 z
2 \* T* k5 }9 o7 R
6 c( W; i# h: t* N" n1 w* ^& O3 q0 W) _. C8 x
7 L9 `4 Z, o, y$ S
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!! c3 T, G+ `7 C
. h, y5 M8 \9 b7 T" j0 ?
9 ]  U! b  i! ?+ ?

2 \! Q- E* C/ W- j




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