嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit* h) _: c( r4 V. }. d0 Q2 n2 E
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
2 Z  D$ j) P( Q; D: r这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
6 G+ y8 u' g, v+ E' Q. E' H1 M9 D5 S* b7 h" a$ N
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?+ |5 x; g* ~! @) M/ M8 U* c; F' o

8 n' \* v! J- q
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:  o8 e) x2 [: q0 b
/*
# a& ?$ W  D. R; r: O- u6 E- Y9 F* Check memory range for valid RAM. A simple memory test determines& R2 q0 r3 Q5 r2 Z3 B+ i2 D4 I
* the actually available RAM size between addresses `base' and
8 \5 ~% b9 K3 o0 I0 X0 l4 K9 m: n& s* `base + maxsize'., n/ T+ y$ D) V4 p2 Z$ B* L
*/+ K, Y/ e1 c) M3 y  Q2 v
long get_ram_size(long *base, long maxsize)
  j; b; D( u  X{+ d/ w  e% c9 Z& _
        volatile long *addr;
% s# `. x$ P: P  ^: r) O/ ~* j4 q        long           save[32];9 f2 g, R$ M- _2 z' f
        long           cnt;& @9 B7 a2 J0 H% H7 B
        long           val;
  R+ c4 c: u3 Q- S+ p        long           size;
# W" L0 j( ~+ f; X6 Z        int            i = 0;& R; r& @$ g* u4 L) J3 J
/ H6 p% @' ~3 D- v7 o
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {' Q. A3 L$ `8 r2 _5 m+ D( g
                addr = base + cnt;        /* pointer arith! */
( `- @' _. e% S  R' d                sync ();
* b- v# a3 c$ s, q8 B1 A5 Z7 p. C                save[i++] = *addr;
% g1 D. ~. Q9 @/ R% |( P                sync ();% n9 `5 h" K0 b  ^' _( O; r
                *addr = ~cnt;( p# P2 \# n7 _
        }
% ?9 Y/ W. c' j! H; t3 C3 i: k# d
0 J& i9 L0 Q" A8 V) z        addr = base;
9 g. R2 y9 i6 \8 u        sync ();' }3 E0 k. ^% U# z' h) O: ^/ L4 G. H
        save = *addr;0 O5 w1 J3 Z3 D; D6 f/ G
        sync ();
# O5 o0 Y. b. k  Z( r        *addr = 0;
! j* \0 X" q8 R9 d
5 z+ ^8 j5 Z- Z5 {) w+ a        sync ();: N" G! q+ e3 z% H# Q$ j% o6 L
        if ((val = *addr) != 0) {
* E$ |" I+ [; N) n  n                /* Restore the original data before leaving the function.# z" N. P% C6 e+ j* I* [# G
                 */3 S' E  }2 D0 D1 t* V; B8 X
                sync ();2 c# q, F& `' m; u: Z% P/ k; l, ?
                *addr = save;0 \5 f2 G) F  X5 A9 J, k7 l
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {7 k! S3 O' m7 \0 [& t: s6 E! |- O
                        addr  = base + cnt;2 B1 v0 z9 Q% u8 L
                        sync ();2 l  q) z2 l5 X, Z9 X' ^' ~
                        *addr = save[--i];4 ?3 E  a3 |" m& E; C8 E% o
                }
( j4 u" [. t# M                return (0);$ d5 z1 T% S: D7 X* ]4 \
        }
# G5 j% B' {- t. g4 U& v
; S5 i4 g0 E1 y0 {* b% p5 n        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# X/ U: ^( z( n2 \- |2 ^6 E                addr = base + cnt;        /* pointer arith! */
4 D! o0 C1 D2 q) f( F& m3 Q2 m                val = *addr;
9 R) X% d7 F  i% _- N8 _) O                *addr = save[--i];; d% ^! p0 B' i: |$ A
                if (val != ~cnt) {
" E) @4 y- j3 L6 ^' Y, t) d                        size = cnt * sizeof (long);
! @/ p; t; B$ ]; Y, e, T                        /* Restore the original data before leaving the function.
9 S9 ~% h* g9 {6 M3 D/ m* k                         */) x% y9 Z4 @2 t0 U" U
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 k" _' E* @- L
                                addr  = base + cnt;
/ Q, a0 }; W7 M7 S                                *addr = save[--i];0 g4 W/ G3 y, R: @
                        }% V: F- R- H: w8 U( ^
                        return (size);
* H  v* @% U4 F4 V. E2 i7 l9 Z0 y                }8 O' O. a% B. R( }$ S6 ?( H# N4 l
        }! @6 P) Q! j( U! y/ y4 X" I# ?
- m0 j9 g" W5 _5 @* k6 G. {
        return (maxsize);& [' U# A% O6 ]/ l# W; M
}! |, K" n. A& c* v" e0 @! B
int dram_init(void)
7 D) [* C9 [4 c# P{
4 ^# b/ Y' q' n; v9 T; R( q        /* dram_init must store complete ramsize in gd->ram_size */. A- e( t7 H8 ^/ r
        gd->ram_size = get_ram_size(( B: ]9 E9 @4 X' V) A6 P6 @
                        (void *)CONFIG_SYS_SDRAM_BASE,% \" X  C3 ~, C8 J3 W4 V7 g' u* u2 [  }
                        CONFIG_MAX_RAM_BANK_SIZE);; H& T0 r* k$ E. |. B  ?
        return 0;. |! T$ t% l7 @/ J& h" ^& K! [0 G
}
" n7 c, _6 ^* |4 a+ J3 m
3 C) {. Q; K' m7 v5 N& `3 r9 `, D) k
3 N9 K2 A- C5 A
3 z- l2 f1 N5 i  A/ ^0 [8 J3 l; L; ?  |+ K4 ~5 P% f3 P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!) D" T6 O- J! G# T- L+ c: t4 ?

# E+ L* Q' Y4 q3 [
& Y, M8 a% e) K; f$ `6 e
. s; e0 \, k# P  Y4 c0 E2 |





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