嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
" ~/ K# r6 f8 [0 d" E' Y核心板2:DDR2 256M Byte   NAND FLASH 8G bit( r$ ~% Y* x8 Z3 w6 D1 G- F
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?! _( i9 N# G; y' f9 [6 b6 i- D
, H0 M* D4 ]5 o) k* V8 N7 |2 Z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?4 t; s+ w4 m$ O6 j! X
5 J# c6 L( I% H! S  B  f

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ F2 D5 r0 S! C! t, v/*
$ q+ F- ?( o3 e9 X* Check memory range for valid RAM. A simple memory test determines
% m! E7 o1 P. j  _* the actually available RAM size between addresses `base' and
& n- N( X) M! m6 N/ }* `base + maxsize'.
( |: ^3 p/ V$ b& Z9 D*/6 H6 q, p; `: Z- ]& X+ |: \( h
long get_ram_size(long *base, long maxsize)
6 k( m" I8 @+ v" W! m{
) A9 [. B: N4 |; J        volatile long *addr;5 d9 n) E( ^- x4 W: u  Q4 T
        long           save[32];
3 h; _3 ?4 [" {  t$ E        long           cnt;
8 x; _7 T# b- G        long           val;: T+ t  w; |" N
        long           size;) W/ U8 o; e: W' \' B
        int            i = 0;4 f' h% s+ J0 {$ G; Z6 \# x
" q8 l  N0 a: W2 B
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
9 T' \+ M7 _' v# D/ {1 F, H                addr = base + cnt;        /* pointer arith! */: y) D8 M3 y6 `, i# [$ x! `* ~; z
                sync ();
% r1 c; F- C# F. p) c                save[i++] = *addr;. v) W7 t' x$ S6 ^+ n. s
                sync ();8 E! D/ k2 l- s
                *addr = ~cnt;
: H& O; b) S, a  A! o        }
7 T  P& \. Y6 b+ T1 o* _6 @  v! X7 A, o4 K$ E9 q1 |$ I
        addr = base;
7 ?% m4 `' F" `2 U  s# C        sync ();
! F" k- g) w  S% D: f        save = *addr;" i9 q- X1 M7 J$ A
        sync ();* H: i) }0 N0 ~$ f7 G) v1 M$ h
        *addr = 0;
" g! k' E6 X% `& E0 u& Z- f! j5 m. o( ~: `3 J; d( @; D. t
        sync ();# K0 o( ]5 E* I  V: }
        if ((val = *addr) != 0) {) ?! @! \. \- v, ~2 q" W! |
                /* Restore the original data before leaving the function.$ [# X" ]  a5 _  P' v5 E- T0 c
                 */
# i4 T" |* L! D) z8 `                sync ();! S7 W+ n) v- K) u
                *addr = save;8 B  O- w0 K; E# k7 F
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" ]; ~. H* |7 {' D7 a
                        addr  = base + cnt;
8 m- N8 [' C& x7 T  D                        sync ();
0 d* u: C' G( O0 Q- V, a$ B. |                        *addr = save[--i];6 ]% w  q& l6 T0 d; j
                }* w  y+ f" x# x$ c* b% [9 _
                return (0);
( T/ p9 K$ {" h( F2 Q; _% h; u        }
+ _! y) R* `2 @9 H1 D+ \4 c8 q% L& C9 y( ]* ^: y1 r
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ o4 G9 ?1 F1 Y" ^% [                addr = base + cnt;        /* pointer arith! */3 c( |' Z2 i7 W" R) \' E9 S
                val = *addr;" \* Y  @2 a" W, H7 S8 D0 t. z
                *addr = save[--i];
3 j, i( v' l  }/ K9 d1 d                if (val != ~cnt) {8 P- W+ U4 |6 Q2 a! X; D8 E/ `* Y' H" A
                        size = cnt * sizeof (long);1 l9 s- S! G. t1 d, t* F1 ~
                        /* Restore the original data before leaving the function.
: T* s$ C$ a% |; y" ^+ ?: L* O0 _                         */
) O7 s$ w! B# O' t6 p! a                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 O* r  P: [8 k, `* q                                addr  = base + cnt;
3 b" @+ L' z; L2 z) I( L1 e9 N# ~& w                                *addr = save[--i];# T" i# {. W. j% K: J3 ~
                        }
0 n) o- Y0 W9 l# d! E                        return (size);
" N, C7 m, c7 N$ m& |- K                }
% g+ a0 n1 F9 c8 j2 T& W* b% l; e* L        }+ R9 }9 b5 j! O  c( Y8 ^9 I

7 o; Q, P! Y, f" c: v6 F. o        return (maxsize);
2 N2 p: b4 k! V; F8 D( I}
! u4 j8 B3 U$ qint dram_init(void)0 \! q( Q- F1 t1 |- q0 H
{. _5 N$ [) Z' M5 G# H5 E
        /* dram_init must store complete ramsize in gd->ram_size */& `: o% B) B/ m3 u6 n
        gd->ram_size = get_ram_size(
4 R& }. [- B8 M( ^                        (void *)CONFIG_SYS_SDRAM_BASE,
" F  u$ B* h6 A+ k6 x5 U/ u                        CONFIG_MAX_RAM_BANK_SIZE);8 S1 k& J6 u1 p
        return 0;+ \" q$ K+ j2 H  E
}
* S. c1 e6 S4 T0 ~$ f& U
. I+ I: s9 \3 q& |+ m! L! h
  k/ y, p' Z) N' L' x1 {3 L; y$ }" n. R$ a: h4 M; ~
/ Q8 u4 M- [3 {
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, h- ?: Z2 D2 f+ f  ~3 v: z
5 S, \! x0 [7 }" _! J+ x7 N, M& A* I5 M$ @' W/ U& b3 k1 C
$ ^4 Z! `% R* c





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