嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
5 H# B, h- f+ Y' x" U( w核心板2:DDR2 256M Byte   NAND FLASH 8G bit$ K) s' u9 P% y* R8 r
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?# y3 k; i# ]: O& m
1 R) u) L5 n* x& C+ j& a9 z5 i6 `
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?0 f1 D- M( W1 s

& @6 ~  Y; F1 m( V
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:. w; _  b. ?6 F7 Y" D. x
/*
6 |# P' n1 x2 U) e& a. S* Check memory range for valid RAM. A simple memory test determines
7 b3 M9 Q  _+ k# M* {5 L. x* the actually available RAM size between addresses `base' and
6 F1 a5 Q; w/ i+ n' d7 b6 d$ S* `base + maxsize'.7 {$ V5 _2 i, m# x5 a, \% d# R* n
*/
. [8 N: J4 a2 Llong get_ram_size(long *base, long maxsize)
: o9 i: {( ]& E* h  k# n8 w* F9 a{+ @# A& \2 G+ L) s! t( P
        volatile long *addr;
# p; |; B- b  G/ ^        long           save[32];
4 y/ G; [( \! b* N4 R        long           cnt;
9 y( ^, ~& X7 U9 h( z        long           val;& s6 q$ I: A% W4 f+ w
        long           size;/ d1 [  }; N3 }2 U0 m
        int            i = 0;) V. F3 m" Y8 W: a$ D$ ?) c! X
5 }/ f6 v! Q/ a! p" u( {6 ~6 A
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: q2 F8 J. u& @# R# I) X                addr = base + cnt;        /* pointer arith! */; j# Z4 i  ^& E( ^; `) k) t
                sync ();8 `* w/ o- N$ f: L: C
                save[i++] = *addr;
+ k7 z; P% e1 x- K& G9 E; R                sync ();/ }, b& P! Q  J/ ]
                *addr = ~cnt;. S9 N' \1 E5 i' V" t% t$ F3 ~7 g* o9 S
        }  K: m& G7 O; o% I6 R: }
/ g9 `& E9 H( ?2 w' h# \( n
        addr = base;7 t; f- f  D; T' T5 p  |
        sync ();. W* j: ~) `2 F1 W, W7 K* R" p* Y8 B
        save = *addr;  |; V- o- S5 P* N8 y
        sync ();
$ P0 I, J( C8 N  z7 }! K& P        *addr = 0;! d$ a3 C- W' ^  ]: A' W
7 l' o# O( c! i- J4 f9 A% e0 c
        sync ();
( X: w, R( ^$ s9 r! P8 ]! F        if ((val = *addr) != 0) {
) R9 r0 @; K9 y- s' V                /* Restore the original data before leaving the function.
2 w) t! \: j' G* I7 E2 t  G                 */8 g. N1 t6 L6 o9 i
                sync ();
# m6 [$ r+ A# A2 Y" W/ \                *addr = save;% M8 e1 r% s' Q2 d% h
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 A3 |$ i- h0 s; ?$ l. m/ \: H& B                        addr  = base + cnt;
: B: {: `: m, \6 f                        sync ();% A; A; v7 @( l: Z! v) |
                        *addr = save[--i];# J9 Z; X, ]; q- W& e
                }; R$ X0 M7 [9 ~. ~9 Z8 f+ b. I
                return (0);
8 R) U* c7 K: J3 ?        }
' V9 T  i- b, D$ l/ ^3 W' `, C; e
, K$ K9 B9 r4 \. |        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& I( m  W* t4 p4 {* Q* w8 w
                addr = base + cnt;        /* pointer arith! */1 R& J3 y$ s8 P% d: t1 _! O# J
                val = *addr;7 \; y0 ^5 g: D* T5 L: d6 e2 P
                *addr = save[--i];
' L7 K" }  z, y$ Y- Z                if (val != ~cnt) {
( _, O0 R/ Z7 S                        size = cnt * sizeof (long);
, L  V7 N! F" u# X' O+ T& w4 ^! E( \1 B                        /* Restore the original data before leaving the function.6 B% H( i& e0 g: S" I7 Q
                         */
& o1 m; V; B) x" [. m8 R                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, f* \6 e1 T# w
                                addr  = base + cnt;5 y. W( w6 r2 k* n, Z
                                *addr = save[--i];: ^$ f# W% d' H/ V. ?
                        }6 ?5 m1 B3 F. q' ^4 o& ^
                        return (size);, w: p: {) u9 t: k
                }
  h3 _! s8 m. q) k6 i; X        }$ q. v5 z2 L4 m, r1 x" ?
7 A/ F" x9 a2 N: {; H; Q4 g; y  g
        return (maxsize);
: y* C! s# z8 D5 _! d3 q: K}
" x8 {: U/ N8 o/ Q# Jint dram_init(void)6 m; V; x* N, l
{$ l, E. |: |- g! \* A+ j9 X
        /* dram_init must store complete ramsize in gd->ram_size */0 x( K" v0 S' B  d# Q0 g
        gd->ram_size = get_ram_size(
& M" @9 |- U3 t- l                        (void *)CONFIG_SYS_SDRAM_BASE,
( ^5 d  C6 a7 w0 Z8 x6 C2 k# R% p$ g                        CONFIG_MAX_RAM_BANK_SIZE);6 j% J, I# g% x1 G  E1 G1 S4 w
        return 0;
) c* E1 `  z) o& _}7 V1 f+ p! i6 ]. [$ U% d

, h' }" z4 a, k- F3 J* D9 M8 \, p3 \% k9 S& {- \  X3 X& f$ i# U

% y4 ]: H- p( q7 k1 I
* |. p# `$ M9 k; VFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!9 ~3 I3 b( l+ A, A0 H
/ B0 Y9 I/ `+ N2 O* V" g: D

! `; \; h- t6 i" h7 l) S& E% W

& h* H# B! K4 Y5 i! ^




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