嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit0 B- A# O' F0 t3 j) ?; s( W
核心板2:DDR2 256M Byte   NAND FLASH 8G bit$ p# R! H9 e" C% j( x& r! V; v
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% A0 N+ m2 G" W; l4 `$ i" g2 F( c. S3 E
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ Q% r) j1 P% b8 Z- h' D! N/ I7 x* O; i6 M  f

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:# n! O+ o& i: e+ S2 p9 J
/*) ?, T, |1 s1 u. X
* Check memory range for valid RAM. A simple memory test determines& M! m+ X2 e. X/ `* m( _7 r; T  z
* the actually available RAM size between addresses `base' and$ t9 p, F% X8 r
* `base + maxsize'.
, o( ~- G  ?# x& r*/- U  S" Y& N; r* Q1 J
long get_ram_size(long *base, long maxsize)
) h7 J$ n3 ?, H& q{
& A6 u$ K: Q! J        volatile long *addr;
8 O0 S1 w7 x8 f1 N3 N' j- p- z        long           save[32];% a5 Y$ h: Y+ z$ E- J7 o
        long           cnt;
8 b- U4 b1 P& U8 S6 K- N- V4 O        long           val;
7 z9 A+ D& |+ I; J5 l        long           size;
; Y5 I1 J( ], i% t6 l0 h        int            i = 0;
) k# r" H7 C4 B8 K3 [
2 ?2 n4 u5 \5 j8 C7 T) ^6 y, X: E        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {6 E: b9 f4 E0 N% M
                addr = base + cnt;        /* pointer arith! */
: Y. e+ \+ M' \/ [                sync ();, [' _5 u0 V. \! b& E
                save[i++] = *addr;
1 R: I0 m; W4 S6 l9 I3 X3 D                sync ();
8 x3 h) c- u: S) u$ x                *addr = ~cnt;
) M% W0 m/ c! H* n; Y        }
1 b6 e% r8 M7 |* s. ~/ H0 v8 Y9 c+ ^$ {* t7 V+ Q: [
        addr = base;
3 y+ D' i$ x- Y9 b: i8 I1 b1 g        sync ();& W( m& y- E: e( f* D. r
        save = *addr;0 v* C: d1 Q% y2 _: M2 c
        sync ();: h$ u" P# F1 s1 O0 u( m7 x
        *addr = 0;2 \" R; V  A0 |1 |0 W

" c: s0 X- S4 I- V        sync ();& H  F4 k/ T; i1 @; f
        if ((val = *addr) != 0) {
' h2 g2 `- |1 v+ L                /* Restore the original data before leaving the function.
4 o! I2 L4 S$ R0 X# A# X: f$ ]                 */& I% V9 z: f4 c; t% S
                sync ();/ r) n. a6 H2 A4 S( `. ]
                *addr = save;; d& j# v! `9 U# e* g( C
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% S. n3 L) O. _6 H: Z# c& U                        addr  = base + cnt;; {! Z( J! f5 N: B+ W
                        sync ();/ `* l0 f$ ]! W+ u. u7 E8 ]
                        *addr = save[--i];6 C( v  e' m5 q# O- y
                }7 ?! D* V: V" s
                return (0);' Q  v8 l% G4 y# G, V) M4 N. v
        }
. _3 i4 C5 I5 W4 n& M
% s. E1 c% T0 \        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ r" E( V8 ]. f. h5 I% _; x1 @
                addr = base + cnt;        /* pointer arith! */
# E' v2 W. ]/ U, e% v0 ?8 o                val = *addr;9 i" a7 i3 K4 C2 B9 X  N, ~& ^; g
                *addr = save[--i];
( n  B0 R1 u4 t' }                if (val != ~cnt) {; ]1 F) @8 K3 J4 {4 D
                        size = cnt * sizeof (long);
; Y$ @; W2 U) r* X7 H                        /* Restore the original data before leaving the function.
0 l% C8 z& j9 A: R                         */
  ~, Q# @3 _4 g                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  E7 ^: z+ f) H& h* Y# z
                                addr  = base + cnt;; O! [: F8 N8 O- @, U1 ]
                                *addr = save[--i];
$ e2 ~- r% L% m* \+ B                        }
+ _1 p3 L- O( a& n  k+ n! [' @                        return (size);
6 [- {2 i) I0 E/ [' O                }* I2 r5 F$ e3 l& n
        }/ u7 }; \- _! |) X) f! i& N5 }

3 e4 B. N/ H% e        return (maxsize);" W" o  A; }; M# n% q' L7 H
}7 }/ }6 W2 b- x: y# ]8 [4 J
int dram_init(void), z( |0 P+ d. E1 ~9 y6 s! T! X" L
{
' o/ f, i( F- R2 B- c5 u, s8 n( Q        /* dram_init must store complete ramsize in gd->ram_size *// u5 [: S- J) s% b8 t& H' d  c
        gd->ram_size = get_ram_size(/ n% P  U: K6 y
                        (void *)CONFIG_SYS_SDRAM_BASE,# p1 W' M) [3 K- u- S
                        CONFIG_MAX_RAM_BANK_SIZE);
& k* e: y5 n. K' z  B; \4 r- W. H        return 0;
5 i- J+ \/ m. a/ x- {}: V1 n; g3 ^$ W) Z; z
7 o! ]! e" J9 z) M$ y
+ v' h" x' h8 N

1 p  J. }" z0 `) L3 Q& h9 H& [' `, ]3 g# B
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!& E" `5 @6 t6 j9 c9 W, [; l
# [+ J& l( D$ s3 X7 b

4 y( k+ ?$ B5 j: ~. g
. b4 S* ^, ~9 p. o4 E3 F# R





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