嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit$ m7 }3 P- a/ s6 i2 E
核心板2:DDR2 256M Byte   NAND FLASH 8G bit, N9 p; q% C4 t% v
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?% q( Z8 a3 G6 C: c# H' a! {

! l' |" j' o& J+ x- p1 {$ X! C是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" W, B# q6 u1 E7 W8 q  E
. l0 @/ v' Z, q, M
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ X3 W4 t0 J' _/*
* ?/ f6 n* n7 z" p/ s# }. S* Check memory range for valid RAM. A simple memory test determines
# C+ E% U2 q, e( t- n8 F8 K* the actually available RAM size between addresses `base' and
/ {' N$ z+ ~; M! p' _' s* `base + maxsize'.$ ]1 [$ Y6 d$ L. G, S' C" U' z9 X
*/' @6 p! |: J( C9 A3 g
long get_ram_size(long *base, long maxsize)
4 {9 x# D# S! G{# y7 t1 v6 X5 ?5 M4 S4 f8 |
        volatile long *addr;
3 |/ I; ~# j6 ^4 N+ W# j9 O9 X( S        long           save[32];) m  [3 n; P) _$ l; p1 m
        long           cnt;0 {% @3 m8 \, Y5 W5 L1 ^
        long           val;
* o$ @9 ?; ]3 k5 f, y1 s5 V" J. W        long           size;1 v7 I7 {; R3 @0 h
        int            i = 0;1 f: p/ n- Z. n: c0 k7 N5 O

& G& s$ Q3 @3 |. y5 B        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {7 ~- t: c* \" z2 c1 Q+ N0 R2 Y5 t1 A
                addr = base + cnt;        /* pointer arith! */% w; F  f, o6 W/ C) v  L( n
                sync ();
( m# [( E* }' {1 }" v                save[i++] = *addr;
( ^- e! M, S" H: q6 F% [( r                sync ();  d8 `8 o& C! f+ b7 E( j
                *addr = ~cnt;
( l; u4 |0 [, f1 m: h2 R- s        }
% H$ W! k# S0 p4 Z% T. r# ~0 j$ M$ z6 {3 T7 {
        addr = base;" n$ R; h8 b8 O9 q& n4 u! u0 Q  N
        sync ();
5 ^9 r# _) w! T6 S' l; Z2 `        save = *addr;3 Q% b0 b9 h7 S0 J. d+ B5 }
        sync ();
% O1 {9 e6 p0 d        *addr = 0;
- k9 A; t" Q$ R( p
2 w) x$ d1 e0 d8 i2 W( G" {3 r        sync ();" h" A' g( L% J0 @$ J
        if ((val = *addr) != 0) {2 \( x# g1 z- i& l, @
                /* Restore the original data before leaving the function.
& N0 k: J' l  a) T* u+ V" L  x9 L                 */1 T+ k6 \5 M! v# h2 }" o
                sync ();
2 A; J1 S3 p  C. X, _5 k5 P                *addr = save;
2 I/ j1 A" K/ l8 P7 p. `                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {: W9 B6 ^  Q- _
                        addr  = base + cnt;% i: B2 B3 `# F5 N
                        sync ();
8 B7 q2 ]2 W: I                        *addr = save[--i];
) _3 m1 @( M4 A/ P: M1 T                }
- J' \( T& V  x1 v' X% g$ |$ c                return (0);
% z* _9 l5 h7 j        }: E' V4 Z* _; S$ w$ }" H

3 l  N/ G: b0 |! L. o! D* z# `$ |        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, J( p/ {8 W. Q3 x0 T                addr = base + cnt;        /* pointer arith! */. L; m  [; e9 M- ~/ H
                val = *addr;& l4 v& q4 z+ K
                *addr = save[--i];% p% j: q$ z5 V
                if (val != ~cnt) {
" o* C! t( M+ O. O9 l                        size = cnt * sizeof (long);
, D) R9 Y$ k, E- }                        /* Restore the original data before leaving the function.
9 S& `9 e9 f6 `( e! @; H                         */
5 @7 R6 Z4 Y/ }# |                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. }; m. Z# d7 h; g- i8 Y                                addr  = base + cnt;9 s# B$ A% U& l' r+ d
                                *addr = save[--i];$ s" _) c, X4 ]& P4 O# \. L2 e
                        }! Y7 u) f0 j3 T" h8 e; G$ a) E
                        return (size);9 F0 j, C: o0 H; H& Q  ~' y. \. x3 V
                }% H2 ]  ?  j0 E8 k% r
        }
6 o7 v9 F) F; }! T/ H  r7 i
4 \1 f: z5 C* R9 H; X% q+ Y        return (maxsize);
1 \# E" {( z* @}1 J! n8 {  z- p% D
int dram_init(void)
) ?, D: A3 p6 t! `! p6 v0 t6 p{
  }2 q. K0 ~2 o. `* k        /* dram_init must store complete ramsize in gd->ram_size */  z0 H- k' O' D0 k
        gd->ram_size = get_ram_size(
( o* A" W. ]" |1 d                        (void *)CONFIG_SYS_SDRAM_BASE,1 S; P/ p& _9 _, ~
                        CONFIG_MAX_RAM_BANK_SIZE);
" Z' M% v% Y6 `        return 0;
  Z) l; ~2 A3 {# U1 y3 ~}3 T" B1 K# ^) ?

9 E* A) ^+ m, _  Z$ n
6 z* D: @& t" C( T, f/ z
/ b9 [% t9 x( M& ^8 ]) l
: R2 I$ m4 f, H/ A; HFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!# I) p0 b+ m- t  {

# I/ G5 [0 B6 T& ~) x$ m1 Y' x# h& }/ B

# a/ P4 Y' h" T  }: l: {; Z6 ~




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