嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
" N: I3 p: {& ~核心板2:DDR2 256M Byte   NAND FLASH 8G bit
# V. h+ J( W7 V( C7 l% ~- k" q1 X这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 x/ j" N. k# z
, ^6 ?& U7 l4 P1 v. F4 C是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# a) L: @3 Y7 N9 v, c0 k# V! ]
/ {- g5 O# z2 r7 t- U; U# @/ ]
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
# g, Y+ f8 |  ~1 T! x* @8 {, |/*
# Q5 e9 |# q* s* Check memory range for valid RAM. A simple memory test determines7 |# O4 f1 [# \, g
* the actually available RAM size between addresses `base' and
6 v1 |/ p  ~" ], @3 R* `base + maxsize'.
/ c5 s6 m0 I$ F/ e% u7 g*/
$ o! Y9 Z  ]- L* Olong get_ram_size(long *base, long maxsize)" ~8 x2 _/ J, ?# J" n
{
( A- G; i1 e# n) ^+ y3 c4 q        volatile long *addr;, x5 L  O. m* g7 L1 _% [! `* a5 \% E
        long           save[32];# X& g+ V  J) e0 z7 I
        long           cnt;
+ c9 c$ B( s& ]" w. S        long           val;# T: B+ ]- J3 M
        long           size;
+ j  ^0 `/ {3 t! M3 G! |        int            i = 0;; i$ J- a9 P) i' V9 P$ K
" z5 I2 E$ b" s! g6 ~
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {& i' J/ n; A( N; X( N
                addr = base + cnt;        /* pointer arith! */; u2 Z, V2 a' s, ]! z$ f
                sync ();7 v( `; F/ o5 a2 c0 u1 Q, v
                save[i++] = *addr;
, t; P0 h' j, v" H5 j) [' O                sync ();
& q& `, D% F0 R% T                *addr = ~cnt;
9 I; y  s7 h0 D: R9 V& T        }
% ?3 M( D+ ^4 u, |% \6 c, Y
4 L6 \/ E2 T' ]; E: L7 B7 D, g        addr = base;" z% t; Z# e4 e% r) ]' |* e" g$ G
        sync ();
$ b- c3 \  @$ w% f        save = *addr;
: F6 j; i) R' x        sync ();
/ B% K; [, D% Y# P        *addr = 0;; X( {; D3 @- r+ ^. Z* S* s5 }
* o& |4 |: m, K
        sync ();
8 q+ H7 A6 y) `. u& e2 u" x        if ((val = *addr) != 0) {
. L+ W5 j: p3 [! f8 v# g                /* Restore the original data before leaving the function., X* e# `' L0 ^6 r; m
                 */
: J& J) c$ R* I# b                sync ();3 D$ _% f, g- a4 r& u( x' ]
                *addr = save;
( I7 {+ r1 d7 r) f' j- Z                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {& t4 j1 H, B5 S3 O, b: S* w* v7 V
                        addr  = base + cnt;
8 O! }, j& R/ C" q+ ?                        sync ();
0 Z" h9 i* I# R5 ^9 b7 @                        *addr = save[--i];
2 ~  z/ p9 b0 y  c                }
7 [; G( ^  D8 L5 L! z; {6 y; Y                return (0);- X) n, P  P+ z* Q$ ~% s
        }
$ a% \) `2 u0 ~. t4 z. I  C# k7 m. m% h9 T
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* G. l# _* v. _+ N7 q. [                addr = base + cnt;        /* pointer arith! */
! c( N5 l3 p4 R; @7 l- }$ T* ^1 U                val = *addr;
; P" z/ l8 n: _5 ]0 D                *addr = save[--i];
. ~; J2 Z$ w+ q                if (val != ~cnt) {
; q, E+ _  A* s" |- r. x                        size = cnt * sizeof (long);6 B, j8 X/ E: z" Y
                        /* Restore the original data before leaving the function.
) V2 c( s$ q# A                         */
& T4 @6 U3 ?* G                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& J! u( r5 H8 ~0 e3 D# L0 u) h
                                addr  = base + cnt;( O2 X" o* C9 g- T0 B
                                *addr = save[--i];
% g: V0 W) G! D2 m( f/ H* r                        }
+ {( t% `- W" O4 ?                        return (size);# Z. V8 @3 w: I% O
                }
% i3 b, ?4 ]" m" u        }& g9 ]" z2 a, V' R

' S' e' e3 a$ O& K# i& L# Y' \        return (maxsize);
/ ?7 @' p, i; S}
$ U/ N% e: n. ~* W$ Y; h- e% sint dram_init(void)
4 U& ^4 A+ ~1 y2 s$ M{
% l4 }% W9 p/ f% Q7 j5 p        /* dram_init must store complete ramsize in gd->ram_size */) q% }7 `/ M" X: @1 @
        gd->ram_size = get_ram_size(9 S( M( M% v0 m% ^8 G
                        (void *)CONFIG_SYS_SDRAM_BASE," C4 L, S6 e4 p) @. }) _1 |; @/ o* m
                        CONFIG_MAX_RAM_BANK_SIZE);# E, u; P" H: d$ i3 M4 n
        return 0;; n! u9 s8 o$ o5 g
}
5 t' d) e" c2 q' f; C) h0 g% `6 C7 f7 U+ u- W

' G+ h& O6 ]8 X0 j4 R4 p0 }
: m- b  n3 u! L- _: @) q( G
# d+ n+ g) ]1 B# z; _FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, J: R9 \, Z" E- i; ^; l& L8 `" T/ ]4 f  k

' J' o- m3 d. E: D
% v" e7 w% G3 d8 W/ w' T





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