嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit( W! p& H  _% g1 Z+ F; J, h
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
, O6 y" P9 m1 o8 h% B& P这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?- ~/ {" y8 B* |# z- |8 {1 ?# n" V
. c  J8 w( i8 H- P: {% b
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?$ K8 @; S$ `6 b6 W3 N$ b4 W
; z1 k& O- t3 Z8 X+ a" o

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( p% t+ [$ f& b: {$ P' \/*1 O/ b  M( q* V; A1 ]2 `4 J
* Check memory range for valid RAM. A simple memory test determines6 x  o) m' A$ `" a
* the actually available RAM size between addresses `base' and
$ F2 c& N( j5 M% m+ R  ]2 _* `base + maxsize'.$ j! F1 L* a* `) a' w) U3 k" J
*/% l7 V; E% S( Y/ z! \4 V
long get_ram_size(long *base, long maxsize)& v8 ?& ^7 z+ u
{
% Z' Q6 P7 G  ^% L6 @2 ]        volatile long *addr;' L" x, }9 d* c+ j! Y4 n3 c' ?9 q" {
        long           save[32];! x; v% T. d$ h: \& O& r
        long           cnt;
) a( e8 y& h! `5 ~        long           val;
9 h5 r  N" m; D* u5 W9 N        long           size;
% D! p  x$ N* b/ I( R        int            i = 0;0 I9 ]; Q& }; p- f- P
5 h8 y: h# ?6 C- Y8 _6 s! d8 Y
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {. z! `4 `2 \4 D4 ~
                addr = base + cnt;        /* pointer arith! */  [% N& w) i& d% F) F
                sync ();+ r; e0 a# L" J7 r
                save[i++] = *addr;
% q3 `- L$ `& I2 n. e                sync ();5 O/ |" q8 G! b
                *addr = ~cnt;
. O: k; W, g) a" |* `- ^# ~        }
8 y' ~/ X6 F1 T, G' `, J: f# n( ~3 g6 }. x5 c* q% U7 k/ ^
        addr = base;
  {0 X" S% P! F: S# h        sync ();# Q* W" F  z) g% r# `- ~0 N! ?
        save = *addr;* q4 ]+ u5 O4 e0 _9 d
        sync ();% m" Y5 U$ K9 P; d* d5 Q9 h' q& Z. h
        *addr = 0;5 P! H6 ^. O% {( V' P7 O
+ I: `: t7 `9 w, A9 J7 A
        sync ();
9 R+ Y9 R0 X, v5 Z' U: p* ]        if ((val = *addr) != 0) {7 e1 k& X  J3 ?; o% ]! ]
                /* Restore the original data before leaving the function.
* S4 w7 |8 u/ J) U. e- Q' v" D                 */! I' r* u. t$ o; d) N* N6 T( ?8 }
                sync ();- \" A0 F% |. W- m, R
                *addr = save;* E3 b  k4 Z* Q  K/ I
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {) f9 W/ D1 z! {7 z4 W' }& g
                        addr  = base + cnt;
" t6 W; @6 e" Q0 v4 {; P                        sync ();
5 G, L9 F  b, P7 K/ w2 g7 [                        *addr = save[--i];; b" N! G3 W8 _* s0 [) v
                }
) c) |$ B' ^! l$ E( b! Z. L1 l                return (0);0 A4 W+ ~, J8 V: f
        }
5 H0 C5 a3 D1 m3 n4 J9 q' Z& ]$ P2 n: @2 {- T3 a/ Z, k% k5 L9 Z
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {% P; r0 |0 h% u5 v8 C
                addr = base + cnt;        /* pointer arith! */
" Q! @6 ^- C% d4 g                val = *addr;
: q0 {1 U' F3 A/ \3 e, u                *addr = save[--i];
1 a1 R5 g' F; E2 }$ K, f6 A! o                if (val != ~cnt) {
' [( h6 C% J0 U" D, p                        size = cnt * sizeof (long);
& w, m: L% ?' |: e0 _6 }                        /* Restore the original data before leaving the function.
# H8 s/ U, r/ A2 [2 J* H" q                         */
3 O. r1 x+ Y: v# G                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- A  M" @- P8 y5 O
                                addr  = base + cnt;
" @( H3 q, i& T9 h  h8 H8 A                                *addr = save[--i];
& p% C( N5 m* [0 o$ ?                        }
7 X3 s& z9 U! X/ e! O3 h                        return (size);5 c  L0 a7 [- F9 ^6 I* T
                }3 n/ v+ k2 U$ K( m! u! Z( A! i
        }9 w* Z" _" d3 d  R

! x- E: f: T* d/ H        return (maxsize);+ P) B& b' n  @9 G# M
}
5 D% Q$ R* E9 U) p& P! Bint dram_init(void)
" F' b3 A+ _# y8 n/ J! P/ [  A' o{
0 g# C5 ?* V2 ~$ E7 D+ t        /* dram_init must store complete ramsize in gd->ram_size */  W, K  F) U8 Q  Y& u' G
        gd->ram_size = get_ram_size(( Q1 U( e! U9 B: Y9 H  r7 f  L: ~2 x
                        (void *)CONFIG_SYS_SDRAM_BASE,
1 T4 m$ x% A. L7 H/ [: W6 i                        CONFIG_MAX_RAM_BANK_SIZE);, e# A$ p% L% a
        return 0;7 l9 N. p( Y/ c$ T$ D0 Y
}
4 F' ~1 N) P; @. a& B! V2 F; F- y5 D3 p0 g1 s! n

  h0 x; p! c; _! I' j
- p( v" @0 C$ `1 N, S0 v% f! u4 ^# C$ |; T8 B7 w& b" a
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!8 S, a1 ^+ v. a. Y2 c
5 F8 B, Q! \1 p4 c0 c/ t

( z+ G6 Z' K: d, o4 [6 w  D

/ \7 J3 K- f' e3 R" G4 c( y




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