嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
2 E3 _* h4 \7 B, Q( N5 I核心板2:DDR2 256M Byte   NAND FLASH 8G bit
( H" y% [% P4 X9 q& s, J这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?  I% R7 F3 ^; T/ p# y

  W6 P9 S8 A, ^" \是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
8 a8 E1 a; R$ k4 i
- B2 b2 D4 u* [* g
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- R; {" c0 Z8 F+ S/ c. T: w  K) I/*7 u; r6 x) Z% \
* Check memory range for valid RAM. A simple memory test determines
6 E0 {- Y& u3 T- z. L% F* the actually available RAM size between addresses `base' and: V6 d* a; ?/ w  t
* `base + maxsize'.1 e2 ^# I0 ]4 X; X& w+ i6 e
*/
6 d7 P1 R$ k' _+ ]  Mlong get_ram_size(long *base, long maxsize)" O0 @4 b5 U8 _# C) W# Q
{5 \( H3 j% Z+ h  k# X
        volatile long *addr;
' g- P) q+ G$ M0 I        long           save[32];1 b+ s) u* _. `- h3 D) `% p
        long           cnt;. ]7 d8 o6 P5 n( f' P1 V9 M
        long           val;
9 }" k+ V) q2 {* B" Z        long           size;
. q" ?# d% B( @7 o7 F        int            i = 0;
) o& e$ N1 o/ q7 Z6 F, ]
. F' ~+ b; Y" k: d/ P        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& s; }7 N; c5 I% L- I                addr = base + cnt;        /* pointer arith! */( C0 q; Q1 H: o1 t$ m7 N% v
                sync ();
" T. D! n/ N( e: M                save[i++] = *addr;
! }+ b7 b9 l3 r" Z                sync ();
/ m+ N# |3 g. J; {                *addr = ~cnt;
- l9 t- Y: P: D8 R! U  `        }! f; I: g) y, I( F. e
, @  n" G6 d. `; k/ Z8 a
        addr = base;3 M5 f1 p1 Q$ }& P# o
        sync ();- j2 f0 Q6 j8 E# w
        save = *addr;1 J7 n' m3 Z$ ^6 B
        sync ();; D! U/ Q# T. U  T1 H
        *addr = 0;
& `+ t. }- d' n( a7 `( ]7 B0 y) D* p  b5 z6 ^/ G
        sync ();# F: b$ D% o4 H" J8 ]
        if ((val = *addr) != 0) {) B4 T% m% ^7 i6 G+ C
                /* Restore the original data before leaving the function.
# A1 z4 c! w, q( [                 */% P4 O* h1 `% e; J+ _' a6 [
                sync ();
+ w6 d* O8 D# v+ V2 @( P! Y6 Z                *addr = save;8 Z" H  L9 l- h1 [, Y+ P
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) u$ ?' a. G; m. M                        addr  = base + cnt;2 b# y8 f) _4 N1 v) }
                        sync ();
; ]$ n. j" Z% \                        *addr = save[--i];
# X+ P( o9 N2 ]3 \                }$ `( a0 Y6 Q/ n. d  |, v# {" k4 ^& C5 @- l
                return (0);" h8 m( D) @9 [8 d( o7 @& \/ F
        }- {  T: q" I/ _) u
6 X8 J; W7 ~6 S- q" x) ~
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ I) U6 v9 W9 k
                addr = base + cnt;        /* pointer arith! */' x) i0 D% H& y4 ?
                val = *addr;
9 ^$ B/ s, Y5 B1 p$ f                *addr = save[--i];
5 q  t0 S1 X- {. N$ U                if (val != ~cnt) {
; ?; Y* S' o6 W- O                        size = cnt * sizeof (long);
9 B7 {0 ]. w8 G; I                        /* Restore the original data before leaving the function.
  X# @$ I! \. ]) r' o% x- G                         */
0 J$ w0 F0 D7 ?4 I# s. O; O                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) D9 L9 [' T5 x# u
                                addr  = base + cnt;
! x0 V3 o" z/ j                                *addr = save[--i];
5 G6 a6 B# x& h3 F. H0 T( q                        }
0 u9 _; T) ]9 t; f/ R                        return (size);2 |/ D5 }4 f$ y: ]  s3 k% z
                }: O- n" V! ?8 g( H, U6 Q
        }0 c9 f: V+ b' |6 g  p! Z  E3 [7 m

% E6 J8 ^/ I9 U% k' Q/ ]& d: f        return (maxsize);
9 E: I+ i1 p+ C- s, i, M2 ?}( `2 u; ]: B6 l6 G
int dram_init(void)
( t7 b. T$ V) Q# g{0 }+ e5 x! C* N5 b3 }5 K* N  o
        /* dram_init must store complete ramsize in gd->ram_size */5 a7 J0 N0 Y) t& b* ^% j
        gd->ram_size = get_ram_size(
2 k1 D; ^6 K( q; L% x                        (void *)CONFIG_SYS_SDRAM_BASE,
' n3 w  i  _* `; s7 H* c2 P                        CONFIG_MAX_RAM_BANK_SIZE);! x, N( V0 H$ o, L% L  g
        return 0;1 l5 ]7 K' Y+ a+ f
}
; ]- j3 j* ?! i" k/ t2 k3 B8 ?4 z% I; E% [1 z8 U# j

9 ?0 e/ M! F6 n% ]/ h/ S- s  H9 X. F3 Y9 o

- c9 H, @5 v. J6 `FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!: d" {# ~/ W& A% F& M& L  w
9 {& U$ z8 A) R) O0 h& q

3 A) n$ ^/ w. }1 C
* D5 e7 u+ s+ I' P. Z: ]9 z





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