嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit. z+ J# z, v7 G: R9 {
核心板2:DDR2 256M Byte   NAND FLASH 8G bit( c, D* Q( k9 b
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?  _" }; v# M( P# N  h

/ t% s+ |% e6 A! @6 c9 [( k& }是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( j3 A) \0 _7 f+ P3 ^
0 s, j, e/ \5 y. w
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:# s+ p4 ~5 Y2 E- D* [
/*
# h- U& ?# c. e. ~0 T- P* Check memory range for valid RAM. A simple memory test determines3 m) @! x5 }9 y5 O
* the actually available RAM size between addresses `base' and- q7 K4 J. v6 \9 a' [. I& ~
* `base + maxsize'.
. J/ ^+ ?4 A6 D- L  s9 w0 \*/; t# m% @6 Z+ @! _9 }
long get_ram_size(long *base, long maxsize)  r/ A! Z. T: Y" Z7 i; j
{
% ?: d5 p! k( n  S& a2 ^        volatile long *addr;
6 N5 N; o! S% f* l+ X1 B        long           save[32];
, w7 W" Y! A' X1 E' F. W        long           cnt;  G9 g9 I0 b, |* F- l8 W
        long           val;
6 Q$ x6 o+ f  n9 h3 y9 @$ i2 d, |        long           size;
8 \9 Z# e$ M) y) ?        int            i = 0;/ C6 Y# W. z( _. M# C6 v, ?6 P* T) o

, {0 l3 ^  p3 O, V4 @" c        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {8 C% B( c# }- p
                addr = base + cnt;        /* pointer arith! */9 z5 V* A5 g# b% H. [
                sync ();1 A9 J% [3 R: Z. ]
                save[i++] = *addr;8 t+ J. t) \6 ^* H/ v6 u% s1 p3 y
                sync ();+ R4 l( C0 @' F
                *addr = ~cnt;
9 S# x2 U" h8 W( H        }
& `2 w9 g6 }4 _+ f8 L: m% q2 {/ Y' C7 C5 q1 t$ F' F3 _, w
        addr = base;
1 k, C5 s% G- {7 m0 j        sync ();8 r% t$ C6 N' p1 x( [* ?# p$ C) w% i
        save = *addr;$ p* X! O0 F9 b+ w
        sync ();7 {$ M  {2 n' M: T7 B% U* v
        *addr = 0;) [- A0 I+ T: e" w1 o8 ~

( y. Y+ w1 T$ b        sync ();
0 T" E& ?: {( F; L) d        if ((val = *addr) != 0) {
' n5 n% _; G; u7 l( J3 H                /* Restore the original data before leaving the function.
# w7 h) \7 X1 k) K' I/ Z                 */
- p; t* w5 Q- E6 C, s1 U( \                sync ();
0 ?7 ]9 y2 T/ N* g2 S& n% ~) C                *addr = save;3 {- V1 \  N* o2 ]1 D5 k
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
8 `0 s0 Z; H6 f% @2 g: t6 v                        addr  = base + cnt;
( U: D8 K; w- A( z  Q                        sync ();9 _# u$ d- y# _: }
                        *addr = save[--i];8 V, t. _. |- X! k% _
                }+ |  D, S0 |8 [6 h) B# C) {
                return (0);4 k+ P) X5 }" n! Q6 h" ]
        }) m9 A* M6 V% v& N
: I) X( s: Z9 I. }0 `
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, j& \* u7 f2 E6 ^
                addr = base + cnt;        /* pointer arith! */
+ |. b) j  R; m) V* q0 y2 `* V; g                val = *addr;1 {& `4 j7 @4 f8 ~
                *addr = save[--i];
2 e; {( y) f$ C" D' I# i                if (val != ~cnt) {  s7 N. v6 p# q8 R
                        size = cnt * sizeof (long);. a* f" p9 r: y7 N2 {: v" N9 @: S
                        /* Restore the original data before leaving the function.* S$ O$ u, n4 V1 q( e$ S6 M2 B$ a# A& u& r
                         */) O1 W0 \5 E* {  F! o
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 G) x! D! w$ i                                addr  = base + cnt;* i! [( l" O0 E* @
                                *addr = save[--i];
+ s( q; h! @( z& ~+ C+ D7 Y* ~                        }
2 B% |1 Y4 a9 ~* O5 h6 E                        return (size);, V# `4 Z2 W" W5 C% R4 ^7 }5 D/ m
                }5 U# P3 w+ n* n* \& B8 m3 Q
        }0 o# Q6 A* Q$ y

. q) d# S5 i- R8 E/ }$ S; P        return (maxsize);
' O6 c" F7 v- {* l8 z: R}
9 O, `, Y+ O' ~; g# ^5 {int dram_init(void)1 }6 F: o6 D+ }$ Z
{9 h) _3 f' B3 s4 p$ [
        /* dram_init must store complete ramsize in gd->ram_size */
; q3 S, G' A. Y2 H( r        gd->ram_size = get_ram_size(
, D0 h, J# y: a1 p                        (void *)CONFIG_SYS_SDRAM_BASE,9 v, x2 a* _, p# F9 S# @
                        CONFIG_MAX_RAM_BANK_SIZE);
8 v7 x2 ~% s9 G, L        return 0;
1 N; ^7 k3 s) e8 i}. z+ E$ ~6 k# j- ]# B* l! g
+ p# q) a3 X( D' X1 f  S
0 h1 ~; Y5 M" w5 k: k: ]
0 Y5 ^: @# R* c0 J

+ R) E$ _# N1 y' C  N/ kFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
! ?# X6 }$ Q) d( s, Y: o7 g2 r' u5 j
$ Z/ U2 d6 h2 ^- p
. o: T5 l: l8 ~
5 h7 [" E* x) {3 {8 F- ?; ]





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