嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit1 G1 a7 w. m" F* b- Q$ \! z
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
% L, n! o; J& n" m7 x6 N这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 w2 m- i7 p  l. Z( {* h! U. j" R; {1 [1 A
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( R. W; |3 L* W/ z3 _7 H
. F; H% j: g1 g$ h. M9 q
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. J9 a3 s9 \& L# B5 h; F0 N8 d& Q/*
* `8 q9 x* b3 L( b* Check memory range for valid RAM. A simple memory test determines: B! b# S! ^+ G! k$ p2 _
* the actually available RAM size between addresses `base' and
6 @  ^7 K3 B. x! |+ E$ y# W* @* `base + maxsize'.2 A  r9 m) j- j! s: J& g9 n
*/
5 C3 N: H9 @0 J  k8 \& y7 klong get_ram_size(long *base, long maxsize)4 w& [! \5 e! R
{5 P* a0 n. C% ^1 f* i3 d0 R# j
        volatile long *addr;
2 j& I% w# `* _& \        long           save[32];
. O5 o+ n7 z% b6 P        long           cnt;
% A4 L+ ?! L0 Q  ?$ i        long           val;9 a/ x3 ~5 n" O9 U7 `
        long           size;1 a) r+ l; I4 \, g. \
        int            i = 0;8 D  m" Y9 m9 [4 s1 {/ n) S# ~
1 j1 M$ J4 L, Z
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {$ W+ n2 C* R: U1 b7 N' `
                addr = base + cnt;        /* pointer arith! */( k5 q' P9 {. \3 W, r1 S5 c+ I
                sync ();" a9 U) ]; I( [7 L: g: P
                save[i++] = *addr;
- z* P9 |7 g% [& t                sync ();
6 M% D8 a1 c6 O                *addr = ~cnt;+ F- W- R2 {. F2 F& Z! c$ G% ]
        }4 v% k6 r5 ?' Q, E: ^, v
- S7 [' y8 M4 m6 A/ n4 L- I# h$ V
        addr = base;
: y$ T2 @9 b% e3 }! J" F& T+ d        sync ();
, V4 @8 r4 E$ ?" j# o        save = *addr;2 t. q! z- N2 T3 @9 ]
        sync ();4 `5 z7 V% X1 k0 K
        *addr = 0;/ @- k8 j( m$ S& `

: |* |$ A# v1 S# U5 t  E        sync ();
% M+ h- }- P- L. p        if ((val = *addr) != 0) {4 U/ P8 O# ~; ]* `0 ~  s0 |3 a" R
                /* Restore the original data before leaving the function.
* w( K2 ^8 _7 q                 */  c; _+ _/ e: ?2 n& ?6 B8 x9 J
                sync ();
% O- ^0 s; X6 ?7 S  \# a                *addr = save;
% V5 V" N* z+ o  n- T& G9 \8 z                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {. P$ c& g$ V% I! s0 ]1 M. w! l+ z& ?
                        addr  = base + cnt;
9 f  |' i# M: _- v  X" l                        sync ();
0 o4 V  h' L. V' `' l$ K                        *addr = save[--i];
. w" S5 {5 _1 y4 ]                }
; X5 B' T; M3 L0 V2 r3 @                return (0);% M% R- M9 k% {9 a6 x# f
        }
# Y4 ^5 X2 Z% P! p
: `9 z. T4 a4 ^0 ~6 d        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {4 v* }" f$ }0 z: f9 ]& q  |/ m' Z
                addr = base + cnt;        /* pointer arith! */
# U& y; P5 y, x) J: @                val = *addr;
+ X+ t0 k- v/ _& Z) a  F                *addr = save[--i];
3 O! w! x( d/ h# ?$ f7 b0 _                if (val != ~cnt) {- z6 U, |! R0 V' O( r$ g9 Q
                        size = cnt * sizeof (long);
; i6 K$ C) w/ Z                        /* Restore the original data before leaving the function.
6 ~6 S$ V* i" A                         */
3 u& U) _  o- R9 H1 o5 p                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 Y  W# a, U. p  w! w+ m! ]/ M                                addr  = base + cnt;+ h1 Z0 i( S: z- d9 X; }
                                *addr = save[--i];* T( J$ q# j- y; R& e6 ^
                        }
7 t  ~: l! \, [. \' b0 h                        return (size);8 n0 Y" j! e5 z& o+ f2 J
                }8 S$ n% G$ k4 y! z
        }& U9 z. A2 U3 L+ L1 |% v
9 r( g: J" A8 Y+ j2 B
        return (maxsize);, T! L, Z5 t8 Y/ T
}
% c0 |, h4 @( [" X& j3 uint dram_init(void)5 S9 K' b" n. n& Y
{# V  S) K3 T: k6 v5 J+ z
        /* dram_init must store complete ramsize in gd->ram_size */' G  c. U" E$ n1 l" q
        gd->ram_size = get_ram_size(; G4 ?& X/ J" x4 ^4 u
                        (void *)CONFIG_SYS_SDRAM_BASE,
  u# T6 \  w! w& Y7 }# ~                        CONFIG_MAX_RAM_BANK_SIZE);0 G, t% }0 z: {$ w" ?
        return 0;" |, a1 J8 f: ?! I2 `; Z
}  z4 R: n- D) @$ V& e1 g
# M3 f) L, ^4 j- N& k- R% Z6 h. j3 G
7 u# _1 Y, |: M  u8 ~

* K, S) @  k# v; w8 D2 E6 j; D8 |* Z- @4 ^" L. R0 l+ d
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!. d/ i; |2 l2 P
3 s7 w' T) U% A- m
. y7 t  S( b7 h- i' F8 I4 b
$ \5 b$ f& Z) ^





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