嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit( P$ M; h; b% W9 j/ R
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
7 J& x: [* f! ~2 E这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ N7 i7 c: ?4 f
$ O( C# M* c- h4 ?1 N7 Y是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% R3 ]. X' i' D9 ]5 J1 L3 l1 |5 O
- ?  A8 Q( t# T
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:( Z2 _6 U& C# M! t2 X( L5 R
/*
/ U% s% L5 ?; T% }  q* Check memory range for valid RAM. A simple memory test determines0 R' _- {/ Y- E3 N, J& ~* F
* the actually available RAM size between addresses `base' and% M" f2 O7 W! J$ G( {- _
* `base + maxsize'.
$ Q, @; c; D9 ^  {$ j7 O% @/ e: h; R*/
( [+ Y$ n0 L% t! W- {& Q1 Olong get_ram_size(long *base, long maxsize)- j& b$ ?0 @+ {1 m- U
{( I0 V9 K0 a9 X* ?  o) s
        volatile long *addr;- f+ t/ f3 N9 ~% J3 d" @8 P3 X2 m2 o
        long           save[32];5 ~1 _: e& E- [1 [$ R
        long           cnt;
/ k  ]% c" K, j5 P# P9 }1 E7 `        long           val;7 E( P5 ?/ ?* r6 ]% p
        long           size;
1 Y- E5 j! Q+ ]( g5 T3 G        int            i = 0;3 ~4 m9 r1 b6 w7 k+ v* {

" x: s. @1 k, p, P        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {0 d" z. {# Y! H, s
                addr = base + cnt;        /* pointer arith! */! B5 D+ o; N$ W% K# d% M  X4 G
                sync ();7 f# Y% N3 H$ h5 H4 r$ G
                save[i++] = *addr;9 {4 N4 J% F8 |) H
                sync ();# k4 \: {5 n- O4 v: Q
                *addr = ~cnt;
$ D/ Y! s- G( C        }3 y, M, ?. K% G
! Y) \- k; M) |) e: T" Z' w3 D
        addr = base;3 v: |; g  g6 j8 b9 P; T* J
        sync ();" T( d/ H5 R# _1 z5 O
        save = *addr;) X* [% j# J8 i6 v4 Y! T% J* Y& Z
        sync ();
- \# Q. J2 d( R0 W( a' k7 S& D; Y        *addr = 0;/ _* Y+ N; H, {7 V- u$ P3 y; Z* G# u

% P0 P' @- O! Y7 g        sync ();( `2 A) G# m- J8 h* J$ G0 u0 Z
        if ((val = *addr) != 0) {
/ l3 f: u+ ]! ~( z) O  {7 ^: K                /* Restore the original data before leaving the function.! w5 w) N( P& K% V
                 */
3 Y( o7 h5 c$ q3 L) N% w6 B& G                sync ();* p8 z/ z; O! K
                *addr = save;3 v2 @% V! B. y, k- e+ h
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ p$ Y5 @: _( d. p* r! U/ M6 M                        addr  = base + cnt;
, D4 M$ l0 A! R- L0 c                        sync ();: T  P% O* r5 ?
                        *addr = save[--i];4 y! u! D8 p' u- ]
                }' h9 c0 r! ]& ^
                return (0);: k8 x8 D% c8 m! E
        }
6 V4 w$ ~- ^/ n& L. E& B. r9 ]2 J
; v7 |" a- e5 n7 r  M5 Y        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {1 u* ?! i9 W/ b6 W' D( K
                addr = base + cnt;        /* pointer arith! */
; K4 Z5 B! P. P0 }2 d" r4 [                val = *addr;4 v9 B. e# t3 g7 L4 T6 ?( t
                *addr = save[--i];( ^3 \; _' R) D- d' `
                if (val != ~cnt) {9 x% _: v7 j$ ]- E. x1 R& u& A
                        size = cnt * sizeof (long);
- t8 z% f3 W% U) e3 i& ~% \                        /* Restore the original data before leaving the function.) N; E! R  N% ?: f$ T( S/ w3 g) r
                         */$ d+ d; Z7 e; o  g
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- ^7 f( u3 p# X' z- l6 {# U                                addr  = base + cnt;9 t' Y6 Y2 J% h: }0 j
                                *addr = save[--i];
/ L! O: V0 ?1 Q8 L9 q. R                        }# H! [( {+ a! H( @
                        return (size);0 S2 f9 R! d) D4 L+ D1 \% R
                }6 y1 ^0 p7 F, r
        }
, b  k. ^2 M1 F
% u  S% b7 L6 h+ H6 ~* ?- m        return (maxsize);. x* R- s9 f+ b2 f( ^
}
0 k+ L& U( W7 {! q. ~! }: y- n" tint dram_init(void)9 L& g5 i5 L% _* w* v/ X( g
{& v. h$ w6 H; \
        /* dram_init must store complete ramsize in gd->ram_size */
" t1 |$ [& u  A2 s# k        gd->ram_size = get_ram_size(
) a$ X4 f6 C9 }1 I5 B, H                        (void *)CONFIG_SYS_SDRAM_BASE,* H  }2 Y- b$ P) ]
                        CONFIG_MAX_RAM_BANK_SIZE);' v- m) {9 Y. \- q* m- a' B. T
        return 0;
: A  m: A' \1 ^% @% I  W! p}
6 _, d% U/ ?) T4 u* m% O; s' u4 T# J% W, ^

1 f5 T. X5 a* r
: W+ S' H% i% Q% i1 c8 ^5 Z7 p+ g# s! L0 D
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ A9 _$ f4 h$ z: t) }& b# S8 ^) M9 V' f5 V) I
1 F3 J" _5 H2 f# ?5 g, f/ p
6 B# T& @4 H/ F& Z1 k! q' N





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