嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
" f) `3 R& \, X核心板2:DDR2 256M Byte   NAND FLASH 8G bit
$ u$ |3 i& Q$ G5 o这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
9 `7 P$ a8 F& H5 s# y+ @: o8 Z1 e/ Z+ z) F4 `
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 X% a6 x0 P& w/ v- y9 H
3 i- B* Q+ V" B& D: R' |+ K3 H
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 g* W+ f5 g1 y( F% n; ]( U/*
: m) m" _! s. a* Check memory range for valid RAM. A simple memory test determines
9 ?1 z6 U5 p, A) B5 x' a, M7 U4 u* the actually available RAM size between addresses `base' and. d; F% ^& V3 K- w
* `base + maxsize'.9 m% L4 v! ~: s, M2 j
*/  S8 o6 `. A- e- J, x" K# [
long get_ram_size(long *base, long maxsize)# r- n+ R3 k4 H
{
4 u1 u! Q2 m, l        volatile long *addr;
! m5 v- q" }0 H4 q% h3 [        long           save[32];5 R7 K) ]! E( E2 c4 M4 e  t; U
        long           cnt;; P" }7 V' U6 T6 x, |( G
        long           val;
/ T  i% e" J4 S  f' ]. m9 Q( a        long           size;
* P* {) c+ B+ s9 d# c' {3 S2 P( `        int            i = 0;
7 |$ @- ~& ]$ Q$ Q
* n6 G/ Y8 A5 p# z( ?. U        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {" {' }  V/ H1 n, u8 ]
                addr = base + cnt;        /* pointer arith! */% w1 x  x% C7 F: l
                sync ();8 ~, S0 F  A7 i$ Y# [9 |+ ~0 _
                save[i++] = *addr;
) K% h2 `( Y( W" n+ ^                sync ();2 w, f/ O2 j4 Q" _+ U; o# g
                *addr = ~cnt;
' J! j: T- @  V! @7 ]4 K4 e        }
& w6 z) t4 ]% j1 L9 l5 i) |% g/ V) ^$ R, v* i7 J
        addr = base;! H) A1 i$ r9 u! E; n
        sync ();
2 l6 `9 y0 K, D& [; \8 g  N        save = *addr;
; A- Z! N# g* E- D7 g- Q7 u        sync ();* {2 Z" O3 |8 x4 O2 k# _; D3 F
        *addr = 0;8 F+ h/ J- W5 I- m
' @5 S- S5 i! H* E0 t1 R
        sync ();# K: W4 P* \4 J* Y0 P
        if ((val = *addr) != 0) {2 m. |/ x: ~1 j4 ~3 a
                /* Restore the original data before leaving the function./ G' S8 x6 c2 Y1 n$ C/ o- i
                 *// `' i$ _9 S* m0 X2 z' @- b; |
                sync ();
$ |% Z( V& E. Q* N: i" Z. Y/ N                *addr = save;
% @8 u' F3 ]* t2 X" |5 u* h                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {2 O0 V$ F7 F: |5 F; C
                        addr  = base + cnt;6 t9 n2 X$ `, j( a! o6 l4 l& G
                        sync ();" ~& a  f' V* t9 f6 O/ P6 A# h; `
                        *addr = save[--i];; S$ g% ]! c, j0 ^- M3 |" w
                }
! n3 e7 U- m* c2 a( o$ {                return (0);
: n. C4 c" P7 X3 S& }        }* W# ~- @# p# P2 C4 p- Z; |
! Z/ ?3 N2 a' f; M2 f. Y
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* g  [7 l3 `* \" x! X
                addr = base + cnt;        /* pointer arith! */
8 ]: I4 E0 l8 ]; Z5 C# I0 L                val = *addr;
  c$ q5 b* K; e8 y% ]5 k                *addr = save[--i];2 {1 k3 |& ?/ U" N' I
                if (val != ~cnt) {  W: K2 g( V8 |4 k/ v$ ]2 j9 ^
                        size = cnt * sizeof (long);! H# B, Q* T. G) y
                        /* Restore the original data before leaving the function.
5 Z! \  C/ L/ M                         */, E' M  }  P) _* z5 G# e" _: W
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, \- g; `9 {: g+ y/ I" X# i- ]. |
                                addr  = base + cnt;: v; U* y; @3 z5 s" a: o2 K4 W
                                *addr = save[--i];$ J$ r; U4 n% K0 u0 L0 |6 S+ ~
                        }
+ \0 N2 C3 _$ L9 ?5 o, f+ {                        return (size);7 H0 D& ^' U) w4 u% j9 z
                }
6 V' w7 R- `- x: [% L, C9 a        }% b2 m0 k, P6 \* i% O' Z4 D

, ]9 H! J  ~' u8 i8 ^8 N        return (maxsize);
. M5 J/ R/ c# q3 O}
& P! r: ?) C4 @. {% {. x% Hint dram_init(void)
0 U& F% T& a) q( L, m# ]{8 X9 s7 m6 e' O0 D$ D9 f" z* Z
        /* dram_init must store complete ramsize in gd->ram_size */
- v  S4 i  _  B: A  y0 v- Z        gd->ram_size = get_ram_size(
  ?/ t1 e4 }8 T7 A8 j                        (void *)CONFIG_SYS_SDRAM_BASE,
3 h; C: i) K8 V$ y' W9 Z                        CONFIG_MAX_RAM_BANK_SIZE);7 m* u# ?3 C# h% ^
        return 0;; a$ q4 `. i6 ~/ N% w7 Q7 ?# l* R
}5 `' B# D+ h2 Z( {1 Z! y: T4 P
, _6 v! m* i1 B

4 v8 _1 Q2 r( X8 S! A5 s8 e7 G  `* i! z5 |1 w

# v% ~/ j7 A/ U) u1 [5 u* aFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!# t, X8 D& ?: x* v

2 g) J" j2 a! l# a
2 k) r0 o  U: T# h
4 P7 {* N$ V- O' w4 ~





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