嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
* j! T  Q; U0 h3 Q. t核心板2:DDR2 256M Byte   NAND FLASH 8G bit
6 q6 g3 o& i* U, k5 v6 a  ?这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?0 ~7 w! |% e9 J/ l

4 u2 @" K" f* H  y7 z$ D是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?& r2 q% O* \4 X( X+ u; l" R
4 `" U7 T1 z4 Y7 G1 N

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, G+ W$ ^- ]! l- Y  ?/*3 j. j7 L7 D; J* K! D( t
* Check memory range for valid RAM. A simple memory test determines
4 }/ R8 U. P* y& C! J' l3 m& K( a* the actually available RAM size between addresses `base' and
. X6 F4 _* z) H% i/ [9 [! \1 r2 `7 d* `base + maxsize'.7 Q' u& l( j& u$ J; n
*/
% z2 }5 `/ |* b: Ilong get_ram_size(long *base, long maxsize)6 F* C1 o' ^6 G
{
% p, B* Z3 Z2 [3 I        volatile long *addr;
+ N+ N& v8 \6 p" l- A" ~        long           save[32];4 H! e' F: j1 \3 P2 F( j
        long           cnt;  q8 N& M5 z& L8 |7 T$ D& d: X
        long           val;
% q" b9 ]! t! S8 X        long           size;
+ v; O! j% T7 R: x6 }3 x! }        int            i = 0;
/ A' H$ z0 m: I
* g9 [, [/ W) }8 Q# }6 S1 ^. \0 [        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- Z5 |* k0 G7 v5 M                addr = base + cnt;        /* pointer arith! */
6 h, z1 l" H0 X4 n) d" i                sync ();
5 K6 J! |9 Q! N- Y1 Q                save[i++] = *addr;% e6 J; y# @) A0 v; ^( h+ M' n
                sync ();
, \- Z8 W0 s7 l& F, i; [8 `) d0 F                *addr = ~cnt;
$ q1 b9 ?& {1 S4 `        }
" `8 c8 W& h% Y2 ]- h) {) Y7 x* l4 k1 S
        addr = base;
: v, h3 S' Y7 F# P* ?- R        sync ();8 t- H  v# p' F8 u. K& y
        save = *addr;
( [6 l/ G. I  O" s* w; I        sync ();  R/ k% _) P3 m4 d2 b; Z# ~
        *addr = 0;$ F0 J$ o# q; e
2 R  A' ~/ U& W9 }7 e6 Z8 |: w
        sync ();
( `3 M4 n2 ^7 J+ `( q        if ((val = *addr) != 0) {
: b8 J7 R' \. Z4 u                /* Restore the original data before leaving the function.
1 b2 H  ~/ X& R) L" g                 */
1 f/ I6 {' w6 |& d% r5 Y                sync ();) m2 j) q# w* _' W6 ?$ w
                *addr = save;
8 x& J% ~* \. n1 l6 h! F                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' k  k1 R0 O% W                        addr  = base + cnt;0 \; \, e+ D: S, y
                        sync ();9 D  O( W/ y& b5 M% M
                        *addr = save[--i];1 V4 _5 q' S5 q3 Q) ~3 n7 m9 n
                }6 T  _; C' r4 v' ~4 U  f
                return (0);* x, \" F0 |. K0 r
        }1 x# x$ a; L3 v" A

- H0 P0 }+ Q; W) l        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, C) {) n! i$ h$ f                addr = base + cnt;        /* pointer arith! */* j% G' t$ s1 c( A/ o" \9 P
                val = *addr;: T4 k4 S) i  n" T. u
                *addr = save[--i];$ \& B# D4 \8 x
                if (val != ~cnt) {/ U  q5 ^; T: o& Z
                        size = cnt * sizeof (long);
+ E3 P' r, u$ I8 q- |' z% M( I0 n                        /* Restore the original data before leaving the function.) n( U5 T" E0 K
                         */2 G9 M# s+ `! `: a9 C2 o
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- I5 B2 x: P: T+ C, j5 ~                                addr  = base + cnt;
9 N, \1 T0 c% b                                *addr = save[--i];2 R3 p$ t. P* L* }8 k6 L
                        }
; W% b" N# F1 t& ], e' h: h4 I                        return (size);" m% h) n/ F3 t) }
                }5 g/ q: x) s' q) y8 s% P5 h
        }- q3 u: R# C) r4 R# J+ ?
" `3 s* B! H( {
        return (maxsize);4 _6 `. z7 q" j9 y1 d* |+ I
}+ H8 p, K& r% L. `) z% K
int dram_init(void)
) o) C( \; u2 u7 h3 P! c1 g{1 q% s0 V4 K; E* l7 @8 j. d! K" @
        /* dram_init must store complete ramsize in gd->ram_size */6 E* p$ G: ^. B# t9 @
        gd->ram_size = get_ram_size(# T0 q+ r! z" j* _, ]: e  i
                        (void *)CONFIG_SYS_SDRAM_BASE,( u5 ~! q0 c7 |# }8 x
                        CONFIG_MAX_RAM_BANK_SIZE);
& N' z' J1 T9 \: s        return 0;9 _) q5 |: D+ x
}
7 x1 P. n% }, K$ z7 l9 @# i4 f& f) ~9 X$ Q+ W
6 \% C7 u& w/ V  q" y$ U

" F0 D  Q% t' ~# I% j  G. ~4 U
: t# `+ {  w9 i6 IFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 y8 i, a4 j' }" [: p: D9 ~
4 K, V/ m: c$ a# v$ i/ }* P6 Z- M, _4 |
5 J: p. o- a& u4 u( k+ W+ O, j





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