嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit" x3 q3 X) H0 r( ^2 U$ V" r
核心板2:DDR2 256M Byte   NAND FLASH 8G bit- {1 d; `: `1 Z7 ^
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?% K. c4 D* f: F
; j. l7 O! |% L$ s+ ?6 W5 r
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?4 v, B' B. D3 e- X+ M# [
0 d+ s. o0 L$ B- \0 Y/ i  w$ E

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:5 V  k6 b+ X' @8 H; x) w
/*4 D) ?$ S9 L. I) y
* Check memory range for valid RAM. A simple memory test determines* C' @1 a+ D0 X0 R
* the actually available RAM size between addresses `base' and0 k9 m' u+ U/ m6 d+ Q. ]/ N/ W. w
* `base + maxsize'.4 d" U2 l' ]$ h$ D. B
*/) k: m' L0 b; c" C: \  o
long get_ram_size(long *base, long maxsize)
, C: c, o4 h7 t+ }& o! T% L{' W9 s  n) \! e7 j
        volatile long *addr;
9 J8 i4 r; K0 |7 x        long           save[32];1 [5 s: D; V; F/ `2 J, Y" M
        long           cnt;# J+ {) H& O: g
        long           val;
1 j. w0 h' A* z2 X; I! m# w! E        long           size;
# k4 g9 f6 {5 @# x( g        int            i = 0;+ U  n7 @- ~- q4 k+ N
/ V" S4 f4 I' V4 u3 J/ ~2 V
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' C- v3 M/ n- s* V$ Q3 N                addr = base + cnt;        /* pointer arith! */
/ H& m$ }- ^0 p; n                sync ();! \1 \) K% [+ I
                save[i++] = *addr;
# i5 @0 e) c0 J, s* i9 i                sync ();
' P" A( D* G5 K/ T5 a                *addr = ~cnt;" C% \* ~* J# C: {" M/ R0 d# f
        }1 B1 z% W5 l  b0 ~8 X% M4 F" m1 S

; N( ?8 o4 @& T( [- k        addr = base;6 g( T' ~: b# r$ ]: }; L
        sync ();
' B$ J1 n% O1 _        save = *addr;3 a( p$ z3 a) N: F
        sync ();
# F8 F. K6 I+ B3 y6 Z/ E        *addr = 0;
5 f. k3 w* }0 p' a* P  f) s5 K
5 \; E% n8 K1 F' s7 c$ }% f2 D        sync ();
! e& S1 h+ b6 E0 |7 K7 b" O8 q0 s9 }        if ((val = *addr) != 0) {/ C  o7 M& y, k+ S5 w) p" i$ ?; q
                /* Restore the original data before leaving the function.2 ?# D) ?) A4 q+ X
                 */+ s+ e" q7 O+ l0 ?- E
                sync ();6 T% v, v" g: L2 B
                *addr = save;
/ Q: K" U, D, ]& Q# N9 W                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {( l( H% ~* F  R4 |6 \1 ~7 c; X5 I
                        addr  = base + cnt;8 [4 u( U. S9 o  A; }; l
                        sync ();
$ ~, W+ H" a7 j& i6 t8 C% o5 x                        *addr = save[--i];
" I# u- c- k0 a, O2 T' [0 s; }                }
) E. c. U/ Q0 K' v0 n                return (0);
/ o" X8 H1 A" k) I8 r  b/ B        }
& B6 F8 t& d9 i3 Y+ W( l" ?, R( I; y; r0 p) ^
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {" d* F4 @+ O; T, {4 A( A  {% _! Q
                addr = base + cnt;        /* pointer arith! */9 Z. n2 ?, Z% q. n' {6 }
                val = *addr;
' G8 {/ f3 b: ~3 z: s* d% s2 G' ?: S& D                *addr = save[--i];, A" j/ j  o: C7 B6 u6 y3 @
                if (val != ~cnt) {
0 _' P& r) }. P) Q+ {! {                        size = cnt * sizeof (long);/ Q! R; B2 p4 K: h
                        /* Restore the original data before leaving the function.
0 M, w' j- O% H6 s! q( F                         */  x% B( e2 g6 }! P, U
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, N# D) [' p  R! X7 W( K                                addr  = base + cnt;
$ O& r! Z" @' ]4 |; K                                *addr = save[--i];6 ]' v1 \# a7 ^+ T% x0 U6 }4 c
                        }
) U, i0 l! J9 N" W2 c4 a! \) b                        return (size);! I# X) C% @, _7 G+ u7 n% i
                }. B. y) \7 K& O  |3 S! e9 c
        }
! k7 m3 G& q8 ], y6 m
( q1 t4 D0 f% ^- ]7 [        return (maxsize);
+ I- {( ]. R9 b}& [  B; X1 N0 _; l
int dram_init(void)
) F9 G' h" M8 {3 E{& Q/ y* a* [8 s/ o9 ]4 K& A
        /* dram_init must store complete ramsize in gd->ram_size */9 ]2 W" @* \2 `9 M
        gd->ram_size = get_ram_size(+ `% [. \) h* g+ h$ c
                        (void *)CONFIG_SYS_SDRAM_BASE,3 L, @& `, l! `+ V, l7 _
                        CONFIG_MAX_RAM_BANK_SIZE);
* N  p: K0 y9 b! p        return 0;
8 ^. e9 ~, b  O7 k4 y- U}" x4 P3 F% q& U2 S# H

) |- z/ g7 l8 l5 Q' @2 B% D8 h8 N7 {8 I/ {- d7 |; |
1 R+ H% R, F! G# A4 w1 Y

0 p- ?4 A/ \; }2 m% NFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!5 F, f$ m" h' a! _, @1 q

( r0 |  B/ f+ a- q" g* u+ s8 P
7 R! U% @( {2 ?: E( ]0 B3 O. w; U
2 E* A- u$ ?; G, v





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