嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
8 [: H$ w% ~$ z+ Q* H( Q5 {$ w核心板2:DDR2 256M Byte   NAND FLASH 8G bit
: V$ ~; L6 o: R: c7 [3 Z8 P( z这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- p6 k( L8 g* g) ~; c4 h4 N, z8 ?# K; N& G* O+ E
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! T; e2 _) r! t6 d: Q1 B3 w5 |; i* F9 A' @

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. R+ [0 Y. ^4 o* n) d# [5 R) R/*
5 @1 g# B& J$ C5 U0 q5 q* Check memory range for valid RAM. A simple memory test determines7 C- _% @1 y; F8 Z+ L. o  Y( q
* the actually available RAM size between addresses `base' and6 h4 C1 g3 C/ G0 {& E
* `base + maxsize'.4 P/ v3 D6 `* ^/ a3 p% f
*/; o1 F5 y8 |2 F: L9 C  O5 y
long get_ram_size(long *base, long maxsize)5 S( P( ]/ _3 [+ U
{
& S* e, J2 ^, K! S' g6 z6 _        volatile long *addr;
% C7 _& m5 a' a  [* B        long           save[32];
6 x6 W: ~1 d# r% t        long           cnt;% A0 n9 I& ?  b7 _" v) Z) m1 ?7 X
        long           val;
* D1 B% d% d7 K: l9 j        long           size;
" h' M6 y3 s: m0 d0 I! e        int            i = 0;
+ o: g, v+ [; J; b6 ^9 E4 V" H2 v( c5 g/ H( k+ @9 B" ?& Z7 `
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& `. `9 J% F  d/ O                addr = base + cnt;        /* pointer arith! */) s) s3 E3 m' A) D& r
                sync ();# {, P5 k( f$ s" E4 \, L; A; }
                save[i++] = *addr;
5 ~0 @/ \/ e5 c; V- c2 V# }7 i                sync ();- }, l+ M) K* H
                *addr = ~cnt;. m) H2 C5 R- [/ A+ ~: A, d
        }7 Y: Y) I( V/ F. i. j
1 j1 o4 U/ o, y& C" a
        addr = base;; ?4 U* B, B1 \( z
        sync ();
( u7 U$ C7 ~- v, ?* c% }9 Y8 J8 R        save = *addr;
! i$ n( A, q9 c  ?. s: I        sync ();- k) o. V8 M! R8 E6 Q4 k  {. R+ l
        *addr = 0;
2 l5 f% Y+ ~: d1 q( R4 g. z% {) J
        sync ();
8 I& ?, P$ ?3 l        if ((val = *addr) != 0) {1 N# h9 m+ k% Q3 U" v! Q: @" O9 @
                /* Restore the original data before leaving the function.3 f! S2 o: S5 @: w, }$ c# M
                 */
3 K% B3 c5 _: ]5 [  f( `                sync ();
) Z# E8 m7 n. I7 V' X; m: k                *addr = save;
5 B/ @9 s: E. Y$ m                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, P3 @1 x* V6 K! ?$ ?                        addr  = base + cnt;
; w8 n1 ?/ e6 F6 U                        sync ();' z& C7 f" L$ d4 a$ V4 A
                        *addr = save[--i];" A5 r& S8 e$ T- }! q6 F
                }+ D; ?' I8 y: x) S: }
                return (0);) y! T+ I( P- x1 h6 \* D4 A
        }% D) k  R! F# w) A$ a: {

3 X% F+ w* j6 b5 y' z. T+ H        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# A# `- z' T8 \1 r0 ?
                addr = base + cnt;        /* pointer arith! */
7 m. Q+ j# E; V7 Y, K' A: k                val = *addr;
/ L1 e1 b+ Y/ \7 A$ o- ]                *addr = save[--i];; v+ |2 U: W  u$ Y& _
                if (val != ~cnt) {& G/ U- ]  I( z& c3 J0 h
                        size = cnt * sizeof (long);' \! x+ H" p  \, a' L. Z
                        /* Restore the original data before leaving the function.9 `4 F( c4 z1 G1 ^, ~6 }
                         */
' d" {& F4 `8 r0 C6 O# u" D6 D                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ d; D8 ^! h9 `4 {0 K/ z- `                                addr  = base + cnt;
; O7 l+ g; A% p; O                                *addr = save[--i];* m  N4 x0 d$ n4 e
                        }
1 k  @# H# K) I0 l0 `                        return (size);2 A  k3 Z# x4 k* I3 k# g
                }
( @$ [' m- g9 B( C7 Y% R. m        }
5 C: E3 H; y1 }' A' r! Y( X
' h, V9 Q3 K' c. {$ s9 E( h        return (maxsize);
  t; b8 Y9 o/ Y% X! g/ M! ~}
" W$ |* \, J, _! `/ @! G& F2 kint dram_init(void)
* O/ r/ ~  G/ M2 f( \{! K  B( [% r4 C2 g! p
        /* dram_init must store complete ramsize in gd->ram_size */7 {% o0 s. d  P
        gd->ram_size = get_ram_size(0 ?1 b; H: N) O+ [: t
                        (void *)CONFIG_SYS_SDRAM_BASE,
2 x$ z! [' C+ X+ Z+ p2 J* Y                        CONFIG_MAX_RAM_BANK_SIZE);+ a9 m5 A0 ]  d% e/ k! G. c% h
        return 0;
, v5 n9 y! h+ t& Y}# K3 T$ C3 y8 V  k( H. i

! v* Z4 {- H6 p; Y
# z$ u  a3 P: \% d2 p% W
! c4 n2 ~: q4 h9 q+ P* P9 h1 H( G9 b% ]
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!6 m8 Y1 h' M9 P- c' g4 e
( d9 @# ~0 g; i( {

! }9 C  P' A$ ~6 |& u) D

. A5 W* U% a0 a, E/ I$ p2 U




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