嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
& A& C+ |7 Q& z+ Z核心板2:DDR2 256M Byte   NAND FLASH 8G bit9 ^6 D( p0 h- x* v* V
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?9 d) t. I4 ]/ O: t
& g; c+ T0 ]% Q0 m( v7 K# g4 x
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* n9 P  t4 L4 s+ C8 V! a! K- e" ^; |. {% S" U3 m

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 q1 d  d2 }3 P8 @! s* N8 Q, V/*
/ O" Q( E" a6 `$ A* Check memory range for valid RAM. A simple memory test determines% {& Z; O1 m  R& C! j+ E8 ^0 G
* the actually available RAM size between addresses `base' and9 R$ U6 j; I* L$ G  A
* `base + maxsize'.3 Z* ?9 M" q  k2 p
*/
( L) g3 w, S1 c; {& R' Xlong get_ram_size(long *base, long maxsize)
- L6 S( ^/ R) v+ S2 z) f3 u; b9 q6 [& X{- t$ ~( D0 i  z" Q1 ^
        volatile long *addr;; N: n& T/ i" [2 F
        long           save[32];: @0 r+ |0 x1 H" j) n+ k& e. B
        long           cnt;9 c" I$ D( [" s9 ]: ^1 |
        long           val;' }; H: r* n5 g: h
        long           size;( A. @* e% w; c! p
        int            i = 0;
7 M0 j! H2 w: H1 b$ U7 N( t" k; g# E2 z' ?8 ~
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {! Y; g; G# G4 c& q% Y, b
                addr = base + cnt;        /* pointer arith! */
  I3 P$ c% K7 |& @- T                sync ();% q) z- z' I  O6 j3 p
                save[i++] = *addr;
$ m, U7 p6 }" u: V; A                sync ();6 L* x' t& X: ~1 E
                *addr = ~cnt;* Z6 {4 o/ P, g3 P$ v' X
        }$ e' r+ D1 o# y8 |/ U

: Q- e% b: v: F  y+ Q; C7 l        addr = base;
; F* o7 D4 `: ]8 g        sync ();
* E+ _- k8 B+ g+ R) x$ n. D        save = *addr;
- [! R7 ~9 G' z0 N7 a( m        sync ();
# B2 \% k6 x, G3 B+ M: @        *addr = 0;& P9 @2 ^1 O; d6 Z
; I5 ^# b% `9 Q
        sync ();
# @" `  o) D! s& u$ i  L        if ((val = *addr) != 0) {1 f: D. H( A* G; L
                /* Restore the original data before leaving the function.
- o" y! Z1 ~8 I; A0 d6 c) L2 q                 */
- A: |- q+ z' I2 y! ^# _                sync ();
  X) D* s. k* n% s- o$ a                *addr = save;
) o6 ?3 _8 b0 b                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
" b- q7 T$ s4 u7 R6 u! \2 s                        addr  = base + cnt;
; y- w, _5 o6 D, [                        sync ();% [/ }. _- z% `2 m; i- }# V
                        *addr = save[--i];
4 H! l& B" B- B                }2 s- i% C# m3 A$ M# @, k7 I2 S9 t2 |
                return (0);; q2 \0 y( L8 I
        }6 L! ]2 w7 @% f. ^, ~, [" m

! P! t& ?7 O4 Y5 k' s4 l; D, }+ [        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 @  d8 d. n0 @( O4 }( `* u                addr = base + cnt;        /* pointer arith! */
: S& v: k* Y4 q                val = *addr;2 T, N6 q$ P# n$ w
                *addr = save[--i];/ Q, d2 _7 n( \9 t) G
                if (val != ~cnt) {
4 r3 G5 ~0 u2 M8 \3 a$ p% E                        size = cnt * sizeof (long);6 R. R8 g% {7 l7 g" A8 J4 B
                        /* Restore the original data before leaving the function.
8 P& P; J0 f- R! |                         */
1 W$ b# V0 _3 w                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 i. A6 ]$ ^$ `9 e/ l                                addr  = base + cnt;! z$ v- R2 H% M* k! p
                                *addr = save[--i];! J, Q, m: ~, J- I! X8 j* Q6 U
                        }
! O5 n: V$ l" {5 n- T5 D6 v                        return (size);7 l9 u- B4 ?) R1 t0 \
                }
( D  M& W% R3 F. @+ Q        }1 Q5 b4 ~7 V6 o/ |2 Q% B$ g
4 w8 e- U! A& W0 M$ A- p" V
        return (maxsize);$ ]/ W7 k: x! N& s9 G% s
}; H$ j7 R9 _0 s) \
int dram_init(void)
+ F. c& r1 s# U- {: i{
/ r/ A* r4 h) r5 ^9 g& V, k        /* dram_init must store complete ramsize in gd->ram_size */  j* U; |8 X" i% n- D
        gd->ram_size = get_ram_size(
) B4 l1 f: R8 c8 \" t, m3 a+ y# i1 Z  V                        (void *)CONFIG_SYS_SDRAM_BASE,7 ^. H- A6 ~' B) ]
                        CONFIG_MAX_RAM_BANK_SIZE);
; l) u) c2 I1 X/ ~, d        return 0;
1 W: d+ x$ R# A7 n4 m6 i* d}- s: H) |! P8 L& X( |" f( [

6 R; o% G9 Q( J# t7 K
+ i3 P% D+ ^! L& v& Y* k  J4 Z; V; @) W0 j

: R) l5 u4 S9 m% T/ j, X% AFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
! m" d' O* s' R$ s3 B6 p5 H3 I7 A  p1 G( Y
4 w" o9 R3 A9 h; |8 M

% ?- j7 `8 `0 N6 z4 I8 w




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