嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
6 }* `2 Y( h4 E7 A核心板2:DDR2 256M Byte   NAND FLASH 8G bit5 U) K. c9 |% B* O. x! ?: _$ [
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?. [7 o$ N" j' W) F. t: W/ f
. a. }6 ?) L5 _  t
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?( N2 R7 K' R# o6 p! J/ s

" q. G  l( l# O  @1 u
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:+ a" }8 Y- r$ @3 P
/*
. J: s$ ]+ B1 s0 r9 k* Check memory range for valid RAM. A simple memory test determines
4 X) o* U' z7 b6 O* the actually available RAM size between addresses `base' and; \! Q* H. {5 ]: q% `
* `base + maxsize'.
  t0 h! M1 l* Y; y" v- Q) l*/
6 x) j( O9 l6 v( Ilong get_ram_size(long *base, long maxsize)/ S3 Y; i5 d. e! f2 B& ^
{
- X8 a0 Z$ Q; p5 `  u9 W* G* h+ f        volatile long *addr;8 j& b; w& d2 x6 v4 Q) t
        long           save[32];
, D/ l( E' V; v  T        long           cnt;6 U& x( }! n) f/ ^+ V
        long           val;
/ Y& E9 j: p, j3 P8 Q5 Q1 ~        long           size;/ f# F/ f- Z$ ?5 k4 w: D+ _6 K
        int            i = 0;& }" m: _" x7 j2 N5 P# X

. Q) T: \" I$ r9 c' y6 L. I        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {8 N# q# W) H5 Y6 Z9 v( |$ U3 _
                addr = base + cnt;        /* pointer arith! */
  o  `. J2 n" C2 I# l% N( R: A, P                sync ();* w- [* C/ k5 l4 O& ?) x
                save[i++] = *addr;
- X0 v5 q. Z" X* U3 m5 Q- L                sync ();
8 ^3 f% X8 c% `                *addr = ~cnt;5 L. S: h  G) y6 X1 y3 p
        }
+ p8 I$ j: U8 L3 b5 f- x3 B* O
5 X$ d8 q3 Q7 T( p        addr = base;2 L+ J$ e$ ?1 E, a7 |
        sync ();" D8 C& q  S# t" h3 P
        save = *addr;8 i9 V5 D. z. h& j
        sync ();  m7 s7 f- ^7 b- x) @7 n
        *addr = 0;8 }; P5 Y4 Q$ n  A) n; D. z1 D
2 M7 |- Z6 n) d2 _) {7 {4 D) W0 g
        sync ();* n# @4 c: i( Y4 J' N. E' J
        if ((val = *addr) != 0) {7 B- h$ m& `, ?( }4 o4 l% W9 H5 I
                /* Restore the original data before leaving the function.
# a+ E2 i( Q# u                 */* b$ j- D- U, V+ `/ @& p4 s
                sync ();
/ v. \* y1 `& r; G" ^- e                *addr = save;
* S% P$ U2 ~6 ?; X3 g                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {1 c3 r# u: h) I- V, q: d+ p5 _
                        addr  = base + cnt;; a" K  h3 i3 s$ h% Z( \) X' S
                        sync ();
2 M  S1 o8 ]% [, u                        *addr = save[--i];
9 m% e1 C2 x; H1 y" q                }" U: Q' T8 @, }2 c. \* Z) }- U
                return (0);! s& `, ~. b; i* O) \
        }
( Q( Y% Q% A) I: Q7 {6 A
8 \( S7 n/ E$ k: z        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& Y+ s4 V) J. e                addr = base + cnt;        /* pointer arith! */
6 D! F+ {8 h  G3 F                val = *addr;
0 Z3 Q$ k5 \8 T5 p: o4 e                *addr = save[--i];
3 J) Y- a5 ~: X0 p$ f; A                if (val != ~cnt) {1 p/ s9 ?0 L; p
                        size = cnt * sizeof (long);" F' e; Y7 j0 i1 ^4 v# m# J
                        /* Restore the original data before leaving the function.( f& Z  e( S% R" a# V8 r
                         */
6 W; i5 x3 u9 ]                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {! {  F3 O/ M& H8 T. n# [# C# V: J
                                addr  = base + cnt;
% ?. K% {1 d! w8 m# M                                *addr = save[--i];
2 {% F+ N* B' V* g7 y                        }# @9 D! h6 L9 ~4 l: z- S
                        return (size);4 r, \; c1 D0 b* r; |- g' I; g" z
                }
  {8 \% A2 y2 K' ^0 J( R) {        }" \; S8 ]+ y& q2 u  `5 _

  _3 P- a" J1 a/ s: W4 s) b        return (maxsize);- ?* J8 o5 u7 ]; m: v
}
# o- ?$ }1 G8 [  A* k) Lint dram_init(void)% g0 @! ]8 b9 m" G
{* y# b5 X- i: A
        /* dram_init must store complete ramsize in gd->ram_size */
3 K  A4 I) c* `1 F0 |" ], ?+ q        gd->ram_size = get_ram_size(
8 ?' G7 ]0 W/ F6 C+ u6 w9 V" H                        (void *)CONFIG_SYS_SDRAM_BASE,
; o( M8 r4 }: q  x                        CONFIG_MAX_RAM_BANK_SIZE);
$ b* U. i$ ]. I. F3 t. Y0 u        return 0;
: d& _+ h& F0 X0 c  E# d}3 f$ A* F3 i/ [* f& b4 A+ |
: I3 J+ t$ O* a

8 d7 N$ ^4 @+ S3 a) n
; s* U; h1 j4 t% F; u. N* u+ J5 ?) I; n% V
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!2 ?/ ~, U9 ?8 Q2 e* `: y" l

  t0 `8 G/ k9 ?. {9 G5 T; H# y: V( ^+ W  ]

+ ~, ]5 S& Z' O/ U




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