嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
" O2 y  t. T7 l9 Z核心板2:DDR2 256M Byte   NAND FLASH 8G bit
4 K: r* d& q6 U; Y; H( X; Z这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?0 Z$ I8 _& ]* f; T3 q, W
9 U/ K! s; d; s8 R6 E* _1 @
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?* |1 f' j- x! \9 F

2 j! H0 g& S2 ^% E4 p) q
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:4 C6 d1 U# M* [5 t- r3 v9 h
/*
3 `1 L) i2 C9 p' v7 r# T" e# ?  s7 `/ `* Check memory range for valid RAM. A simple memory test determines
3 X2 g( Q5 F. u6 l3 I. d: N* the actually available RAM size between addresses `base' and; a3 }. |, s1 u6 Q$ W
* `base + maxsize'.
# j9 l1 u1 z. E2 `$ [*/4 T2 h1 P- z: P' S* C" Q( b  g! z
long get_ram_size(long *base, long maxsize)0 s) W' s+ `# v+ O4 M$ d. O
{1 _1 a# |5 o9 |) Q! s
        volatile long *addr;) Q. P! e6 B- J% g
        long           save[32];
$ e/ c+ x0 T/ T, X$ s2 G4 q( A        long           cnt;
9 L% J5 P) ?" C1 U- J- Y' Y* ~) ~        long           val;
! o% e  q6 \  M) t( |/ m7 v, P        long           size;
9 H% ?! T' N9 b  E        int            i = 0;$ ^! z2 r0 ]6 L1 y& u
7 d- y$ T6 j+ N% H) @. ]2 d) M' Q
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, y, Z' S( i  r/ m# v1 n) S                addr = base + cnt;        /* pointer arith! *// @( D2 I0 D; u) ]
                sync ();
! p: H' I% f5 |) P, c8 c                save[i++] = *addr;
1 m; d; K4 T$ D' i' @; u) ^) G, C                sync ();7 S- g/ J5 v) f% s5 \2 F4 G
                *addr = ~cnt;" Q5 y3 u0 w0 r& E( ^5 |3 L
        }
- L  u$ Q5 B$ \% H$ ~1 Y1 {9 ]% b$ c) C8 i1 E, z
        addr = base;+ P5 g4 W3 |( D8 W, P8 q% h5 e
        sync ();0 x) k; B6 o) L0 U1 U4 k1 [
        save = *addr;/ f5 z# u' d5 p0 ~
        sync ();+ u+ O8 F/ }0 L+ _' b5 f& u5 @
        *addr = 0;0 V4 l) w3 d) o0 H

1 ~% z  t) ]& `% q# X        sync ();
" p+ M; g5 A, `) |" @" O, y) j        if ((val = *addr) != 0) {
# C0 T: H: B/ X! ?# h1 u                /* Restore the original data before leaving the function.
8 {4 Z' k' N/ h* @* D. |- v, T7 q                 */
" Q1 ]4 f. t! g/ B/ {                sync ();
$ ^* O: a6 r) _5 h" `) U                *addr = save;
# p% r+ P. R) k% o8 I( o5 |! F; [                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 y0 T) V$ u8 E                        addr  = base + cnt;
* A1 T: X, \/ U6 Z! T                        sync ();$ m' ?% i& R: f2 f4 X7 G
                        *addr = save[--i];; ^; \3 y/ a( m5 Y6 w. b# p$ L
                }- x) k: p: s& V
                return (0);# @6 s) q5 ?) k
        }
+ J% Y. G# J/ j, ^
7 i- ~! p# ]7 X+ z6 Z        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: j  z! s+ ]! X; o* _
                addr = base + cnt;        /* pointer arith! */# v$ }0 @8 T$ D
                val = *addr;. ]8 l' T( a1 o' \/ i
                *addr = save[--i];' C! b' Q# G+ {' x. y% J; f* b
                if (val != ~cnt) {
4 v" I" x3 a  X* z  `                        size = cnt * sizeof (long);
. P8 t/ K( V# d9 j                        /* Restore the original data before leaving the function.
2 }+ p6 w1 G! m  E; O2 h; s, l" e                         */" Z" s- F8 u% J' x4 O
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ U( @1 |! n8 X" E
                                addr  = base + cnt;
" U$ C9 M$ A: W8 p0 }                                *addr = save[--i];5 F$ N: g3 k. D
                        }
" k' l4 }8 Z. t. q5 Z8 T, e! k                        return (size);
# P  [6 p- d3 [                }
9 ]; I- K7 Q( Z% z        }
/ b: S( `+ G4 O$ c7 |1 p7 A! l  P" ?& ?7 K# K# I& u9 D
        return (maxsize);
  K2 x& I$ D. Z9 U3 r}
5 G/ a4 V2 O7 |8 j: X4 Eint dram_init(void)
- G; z! c9 L( P1 k+ B! F{  e) j% B, Q& `
        /* dram_init must store complete ramsize in gd->ram_size */
+ ]  y, M* i# p6 G( H3 m        gd->ram_size = get_ram_size(
3 Z& s4 r. K! c( }                        (void *)CONFIG_SYS_SDRAM_BASE,
; U. L3 m* t8 Y7 O' ^5 a                        CONFIG_MAX_RAM_BANK_SIZE);
6 f1 _( ]  ~! y: ^( D# I- n        return 0;
) ~! s* l8 {. \% |3 `; e/ W& j}
) h& p; B" S# E( j2 ~1 k2 p( ?1 S- B& p9 x6 E% T. J& e

- m& ^  E! N8 H0 {5 ?8 }! D
* H. v1 f# m3 M( l0 h, p
3 V5 u% d5 [8 g- J- v2 s! \, iFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!4 T2 D* {( U7 P( |

$ [/ s! A. S+ s0 q5 Z1 V
  A5 Q- z, j5 D
7 T( ]+ _4 ?/ i





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