嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit0 g6 J3 C. G/ U  W+ ^5 \9 ?5 p6 |0 k. ?
核心板2:DDR2 256M Byte   NAND FLASH 8G bit( w9 Z. g0 I) E, ^
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* \/ X( G! \9 q1 ?8 X. b6 P
) S3 ~4 ~. l. J是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?% C7 l" F3 w& G2 i* _  v: K
; m! M3 Q0 d2 ^6 N: k" i: D, x

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:- ?1 m9 M9 Z% U
/** q5 |: T$ w8 x* g' t
* Check memory range for valid RAM. A simple memory test determines- `$ t" M+ g, @9 `
* the actually available RAM size between addresses `base' and7 u. W' M' `7 p% B, Y
* `base + maxsize'.& R* q' o2 y2 {3 g( J: I
*/! }* L# g* I2 O( Q; D
long get_ram_size(long *base, long maxsize)  B" `9 w9 a( S1 h$ `3 ~! L
{
# ]9 ^' _- l/ i+ W/ a        volatile long *addr;! J; B. z# d1 r* t  R$ z# Y& P7 t' s" [
        long           save[32];
, \. d, {7 p" c" D        long           cnt;
( d1 v. [) t- K; K        long           val;
* `( `1 G2 S9 H, L) o" |7 J        long           size;
7 i# N6 X* |' o7 m6 f        int            i = 0;
9 }! ?/ d& U9 K( p; W. g2 K8 S, s, p) u
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: f& P0 K! R$ H  E! O                addr = base + cnt;        /* pointer arith! */2 B6 Z/ p0 y! g! m- {8 w2 x; R
                sync ();
; l+ R0 J6 l% e* T' u                save[i++] = *addr;
  b1 s: J" j  Z$ c* M* [/ r9 F                sync ();
  o! H) _% Q; q3 |& E% r                *addr = ~cnt;
* ^3 R; B( T7 `. w        }
6 p! y2 q9 J! ?- R
9 n$ E/ u* w8 ^: c        addr = base;
6 }+ ?1 n% B6 T& {) e& h3 P        sync ();
. K& F7 J& W" n5 N        save = *addr;- }' {0 G; _; _) L
        sync ();
0 r+ D& d% J$ x  G* |) ]: A        *addr = 0;
7 T! E1 H' A" m; f- Y/ E5 U, }* G' ^
( ?( X& [: J; o) k        sync ();5 S. A" X. F2 t! H, y
        if ((val = *addr) != 0) {1 g: E+ K% K! v& p) S% h; \" J* q
                /* Restore the original data before leaving the function.. N: P, V) b$ v! b, Z- [
                 */
! o% O4 n4 F( }7 }' s. N4 a                sync ();
% _) c+ u- U; Z" R+ L( L4 v                *addr = save;
8 `/ t% I% t, A& U; A2 M- O                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: b2 }1 \# `6 E% A/ C7 a/ }, t* o                        addr  = base + cnt;
0 ^% Y9 q* S3 L# K* |1 G+ O                        sync ();
9 C  w2 ?6 B2 F. a) _) i; K* f( n8 d6 g# z                        *addr = save[--i];
  \, S9 K( B, P* q% f- @                }
' M9 r$ p# g7 a2 e8 W                return (0);) }$ T% S; O( B$ y. l2 e
        }
( }0 Q+ q0 ]: m5 }) F# ~9 O, p! E# f% A3 s
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. t- H& X8 `+ `* [* _                addr = base + cnt;        /* pointer arith! */$ ~3 P4 a1 b  R% b4 i( n% b
                val = *addr;$ e( P! N6 _+ d& A* D9 K: R
                *addr = save[--i];$ t. x/ G$ q# u) ?( D9 E8 k" F
                if (val != ~cnt) {
, A- Q( e: x9 Q5 m                        size = cnt * sizeof (long);
' e% p0 K( {0 u( S. G7 {7 [                        /* Restore the original data before leaving the function." N; f; I' h6 I2 E+ ^0 Q
                         */
" l/ E9 |% {2 g) U% c                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 H2 o5 @; p! v, ]# [$ [& h                                addr  = base + cnt;6 {* c2 f3 S3 {4 a1 W' [
                                *addr = save[--i];" |: d" n9 L% `2 _
                        }7 y! e' \; l# K$ M
                        return (size);% o6 {9 V% A# Q3 H
                }
' V) h/ [/ F+ E& {  Y8 D        }- f' b" w; z' ?# \" ]) Y9 }# ~$ j

  i- `0 @' _8 w% n        return (maxsize);& _) u2 x" J" K
}+ J' }" I& D2 U# _* f. J- T
int dram_init(void)
9 E1 V4 n+ l# r4 Q$ W$ N" @{
4 G/ z. i) l1 Z( W, x        /* dram_init must store complete ramsize in gd->ram_size */! J9 S1 \- ^2 Y5 H) }, Y* b
        gd->ram_size = get_ram_size(6 A$ h) v4 F. W% |
                        (void *)CONFIG_SYS_SDRAM_BASE,
( p+ b( [/ T' c: s7 J$ r$ @                        CONFIG_MAX_RAM_BANK_SIZE);
$ J' y' V; D+ f+ x8 P        return 0;6 R6 U9 k$ w7 G4 k
}; n' ]9 K& K' X- i( }( V- m, m
/ j8 U/ h" I8 ^' r4 B

8 y$ L7 z: O6 N! P  b/ h2 M! B( R2 Q/ T6 T4 q7 t6 E2 Q

' Y  g7 \7 Y7 \- s! eFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 _8 F9 x: ~* g4 d: }/ s% m+ P7 Q2 T& D3 _" E
# b! g( p+ D- [+ s+ {
9 W# R7 X+ T5 q





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