嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit6 D% k4 d, Q$ K! y& X) t4 h* C
核心板2:DDR2 256M Byte   NAND FLASH 8G bit$ e. U! {: o% j: a( W! s
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?. D# a7 K! m; m4 a" C
2 R8 {' P3 L# A
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?# `8 J! ]" S* h* ~3 C9 ?
# A7 r2 K  I; H! D# R0 R

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 a7 S+ h+ Y8 {4 }/*
4 ^* m6 V. f# w4 b* g/ ]( C, o* Check memory range for valid RAM. A simple memory test determines1 u$ B% `0 X8 ~) u
* the actually available RAM size between addresses `base' and
+ k9 ?0 _/ L& y3 {* `base + maxsize'.
6 [# N# h& F. x& Y  \: {; s*/# C5 N( _2 E5 a+ _2 L- B) G
long get_ram_size(long *base, long maxsize)
' \# G% C/ ~& `9 M{
  j6 p/ I: k0 y9 y6 z; O$ H4 x        volatile long *addr;* ?8 F: F2 F! K- T
        long           save[32];7 s! F* ]- t, B$ \4 p" R
        long           cnt;
$ t$ h# f/ o1 N        long           val;
& Q' f* J4 R. |* L6 j% k        long           size;1 N5 z0 }1 B/ \) U9 ^$ e. |
        int            i = 0;' I5 b6 t9 g. h; O

' W' q# v; t( b0 \. x3 q5 o* G        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {" |) r+ R& _6 N( v
                addr = base + cnt;        /* pointer arith! */
- d0 h3 m% ]2 V0 D# H0 X" m: b3 d                sync ();" p& Y) P1 b# p2 I( E/ k" ~5 l+ ?) g% B
                save[i++] = *addr;1 a7 K: A0 G8 y% s: [
                sync ();: f( v* i& r0 w4 [" K, J# h
                *addr = ~cnt;8 ^* s1 D+ N' N
        }
# r* p6 q- F4 B$ r* W( H) P+ s8 C: s0 n- ?
        addr = base;
6 L) C3 [$ N/ R# `! G) ]3 I- W        sync ();
+ W; }$ j0 P2 t! s        save = *addr;" m6 U" t5 k7 f6 j
        sync ();
  d' _8 I; _* l. S        *addr = 0;/ O% @: t" a: ^- X1 h( U/ t  O
' c8 r  _9 j7 A7 v& j
        sync ();2 {- O8 F4 T4 }8 V, t
        if ((val = *addr) != 0) {* A3 T- C# ^) a+ y
                /* Restore the original data before leaving the function.
6 T, ?- ]! ]) m0 h                 */8 s9 t8 b% x) Y/ r
                sync ();
. b" a& t: x  j$ O7 M                *addr = save;3 `+ z; e3 W% Q: K9 q4 ]3 `5 X) E
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {  y3 ~  r7 ~! F% _2 K7 N- }/ c
                        addr  = base + cnt;' B9 b* U7 ?& O* ?4 _; U
                        sync ();8 r: m7 V4 J8 R: S" c; Q) W
                        *addr = save[--i];/ L+ e' r3 Z2 q3 g
                }
5 g4 V5 p- t9 _. k$ V7 q) i  ~                return (0);
, X3 e' _# @" @4 s6 }; j7 @) ?! U        }! n1 F5 Y- f/ e8 e  p: H. s

' P3 x4 k3 }1 E3 z0 c; K  o+ Z+ |        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 A. ]: d9 e& [! U. K
                addr = base + cnt;        /* pointer arith! */
4 \% r( u3 ~- i, a  G6 V8 M                val = *addr;3 f5 p7 \: Z4 N* X) r
                *addr = save[--i];
8 n; i& w4 x2 |  b9 g) n                if (val != ~cnt) {
+ w& L, r+ R! s                        size = cnt * sizeof (long);
8 ^% u- p, D3 B! ^                        /* Restore the original data before leaving the function.
2 U; I* w% h. _  X# o                         */
, n/ H. i+ `9 S4 d; [                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) k5 ]) l; t3 D6 m# [# e8 r6 f- g
                                addr  = base + cnt;8 l; Y3 C; ^8 x# ^
                                *addr = save[--i];3 {* k$ A. p* {0 C1 O6 b( J
                        }4 b0 \3 l7 U! T
                        return (size);
$ x# s$ }! i* G" K+ U( Y                }
" D  q; C/ e5 T  B+ H7 Z# P+ v        }/ H: ^% u( @7 l4 C1 X

% l/ `+ S# x- ^7 Y- q        return (maxsize);
* M% {3 l# V( v6 H( }4 T2 w}
8 g6 ^' L" X9 b. Wint dram_init(void)* g8 n$ P6 o: i8 j5 L
{
8 T7 P- U. P$ m& S        /* dram_init must store complete ramsize in gd->ram_size */; S; {7 o/ }( H9 h
        gd->ram_size = get_ram_size(
- e; Q: i# Q6 f4 C' l                        (void *)CONFIG_SYS_SDRAM_BASE,
! S0 d0 u% W6 Z6 ?' \, d+ Q  p! `                        CONFIG_MAX_RAM_BANK_SIZE);+ @/ f; |4 H; [1 o
        return 0;
- P3 D. E$ x* E}! b/ V: R( j0 v7 V* |6 t

- l8 T, Y' {/ E* s1 z) Y6 T, ~' p. [6 d5 X; A9 r

: C$ ?/ r% k1 @! I# g! {8 F) `
$ [0 Y4 E  h/ ]& |$ BFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!7 l# L% g* c" d% G; ^( Q

2 ]3 @/ b' Z' D1 R; E
, h8 r2 T; l/ D7 T4 b. p* t* @
! n- E% |1 w  D4 T





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