嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
* m. b* M4 O# z% g4 o/ ^核心板2:DDR2 256M Byte   NAND FLASH 8G bit1 R, K4 i* Q2 U& w3 \; }( ]) E5 u4 y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
5 K8 \4 |1 d, Q2 [1 I) t
6 Q6 I' [- P" L3 N" N- X是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* A. F2 l  A4 s: T- H, r
9 C0 j; d  l4 ~" [8 j7 ~
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" g: j) t( o8 T/*; c6 }3 X' y$ o9 b
* Check memory range for valid RAM. A simple memory test determines
# A: L1 j1 b  H* the actually available RAM size between addresses `base' and' i! G+ L$ i8 O( d2 p
* `base + maxsize'.# V* _& ]# E/ z
*/& Q$ ?+ f) Y) h# q# V) E8 T
long get_ram_size(long *base, long maxsize)4 W1 k7 c! S; C3 W
{
0 v1 F7 a5 E4 ]        volatile long *addr;
5 v$ I- {' i( p' k+ s        long           save[32];
5 y4 T1 w0 s* F; e- ~8 k: I, ^3 c        long           cnt;  p$ e7 E6 h! _8 W. ?5 b. t, Z
        long           val;# n3 X# K! `- I4 w$ ?8 V8 m
        long           size;
% a/ t, c! w0 b- e* W        int            i = 0;1 P1 K* w' o8 [5 ?6 G6 ~# I% \

1 r0 E0 a! k4 }2 \# _7 D4 E- ]        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( O9 Q, j$ H! O$ B                addr = base + cnt;        /* pointer arith! */
4 X) a  Y9 \  S, \                sync ();
- U( N% y; m1 b: ^  Q                save[i++] = *addr;
( x7 z% T) ~- y- Y9 O' y5 E4 }5 b                sync ();
1 x4 S& I7 O7 j! J: U' E                *addr = ~cnt;
+ C  d. \1 L: L# U& y7 m1 `        }: k+ Y# s% D. M( @3 G2 q, U

% F4 O( W& z2 a9 q5 ?: O2 V' @        addr = base;
; P' U8 E4 g) |3 N. K" \! W* i        sync ();! z9 I- a* ?! ^! M1 E, i
        save = *addr;
. q9 Z! e) Z) x) c- [        sync ();
( r0 n& S+ K0 r* r) o        *addr = 0;
5 d$ r# d* i: b3 v+ i# j' p
7 o1 ]9 ?- I2 I) v3 c; b        sync ();5 u/ r" A; t0 E1 i
        if ((val = *addr) != 0) {
8 S. b0 s+ c. k" U& L1 e                /* Restore the original data before leaving the function.
, H' t- ^: X% O$ a                 *// m  J" |4 F5 `$ T" ]! M
                sync ();
  X+ o$ s; m% q# z; D3 w8 g                *addr = save;
( A# V+ c9 ^+ E0 o; @5 t3 I                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {; L4 a8 _$ f+ m! y) k5 y2 E
                        addr  = base + cnt;: l8 `8 }" J; |8 S
                        sync ();( {+ |) @5 G7 I& V7 U0 k3 n2 h$ `
                        *addr = save[--i];
. g3 C6 ?: b4 x; Z                }" {- M9 O- r# h, m+ p. O
                return (0);5 n5 K: z* Y& B+ {+ L* G9 @3 v' v
        }
1 D' G2 I( r# V" ?7 C. E9 v
/ v8 K" X7 k# ~0 }( f        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 z% u" Z5 F+ [3 G/ o$ M                addr = base + cnt;        /* pointer arith! */
/ }- I, ]5 T) F$ `                val = *addr;1 a5 d# I( Q  L# P$ C% n8 K3 ^
                *addr = save[--i];
" c" `* Z3 F4 [                if (val != ~cnt) {
. R( g6 U0 J" C# V9 p( r                        size = cnt * sizeof (long);8 k4 Z3 W* N, l6 }1 \* m
                        /* Restore the original data before leaving the function.
" U  Y# x; M( f- v) I                         */
, g- n$ \) |3 x6 E                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 ?# t" w6 {! Z# t
                                addr  = base + cnt;: o: ]7 ^" U! l5 D! R/ J
                                *addr = save[--i];- H1 j) I! ~: V! ~# Q3 d# z" \% V
                        }* |7 P1 @) h+ U2 y
                        return (size);# `7 f) Y) r3 V$ Z
                }; Z9 a/ b$ j* x, t- m  i$ K
        }1 c1 @3 ^$ Z( H6 |8 S4 ]
( V4 }# ?0 n' r6 [" Z  |4 Y0 r  }
        return (maxsize);* H- E+ [- Y" ]; [
}
0 p) @2 B1 z2 J* vint dram_init(void)
2 s2 u- ^% m" h& v- X0 N{
( A+ U0 H- S; W% D1 T        /* dram_init must store complete ramsize in gd->ram_size */
4 z7 a! y8 X+ D( z% p+ D        gd->ram_size = get_ram_size(; s4 G! z4 \0 V7 r4 Z  s, H( |; X
                        (void *)CONFIG_SYS_SDRAM_BASE,+ s7 X+ W# x9 Y" r: p5 O; d
                        CONFIG_MAX_RAM_BANK_SIZE);& ]3 h2 S" k  K2 D
        return 0;- z- \! c  F) W1 n: l
}4 h6 ^2 j' h/ y! H( ^* ?
; b8 }! m; K% i& s6 L: E
, u8 {7 e# H! ^; o) P; k& c
  V, I  i+ _$ X$ D8 \# l
5 k) a# p5 H8 n) w' q7 E
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!* g" I0 e( u4 R# d! v( T

; h6 |9 i8 N% ~' }9 \) D3 t
: X) T5 b1 q3 [$ Z$ Q

; f6 N1 p8 O! U1 ?, f




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