嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit4 }5 K0 W$ U& e- U1 c) e
核心板2:DDR2 256M Byte   NAND FLASH 8G bit2 Y5 A7 K8 \( Y7 X$ k. G% y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ u1 ?/ {1 B+ |8 x! h
  g" A4 ^0 E, D是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
0 H3 ?  a% i5 [7 b4 |* a! o
" a$ p9 e. Q# {' o" J- w& M
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 b) W/ v( `0 l* f' h/*
2 j8 d( c, H/ E4 o2 u* Check memory range for valid RAM. A simple memory test determines
. C) }& g9 f7 k. ^* the actually available RAM size between addresses `base' and( U5 R. b7 G, T" _5 Q% w
* `base + maxsize'.  w* {( Z! A0 g) U
*/% Y4 [( u6 I$ y  R6 M7 F1 x4 ~
long get_ram_size(long *base, long maxsize)
0 r& K: R, Y. {' C+ q5 P( y0 X{
$ A1 f( o6 E0 H        volatile long *addr;2 A5 {5 n! c0 c0 M( ~
        long           save[32];
  F! w# E5 p: i' ]- ^/ u        long           cnt;
& J( `. Q# w+ [- m        long           val;
4 c0 U/ X! Z7 X5 O5 k( i        long           size;
% i$ @  {8 ?" t8 L, j* v        int            i = 0;' L" h7 e- z: \0 `$ y3 e) a7 i
1 H2 P/ E0 g& V1 j
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 l  _: z# s3 S( T                addr = base + cnt;        /* pointer arith! */
  M+ w1 V  l% C: C                sync ();# E. h, _& p9 A- z" d
                save[i++] = *addr;7 T: j' Y: u$ R' r2 B; E7 p, K$ F
                sync ();
8 M) j- Z7 Y$ X/ T* G. J                *addr = ~cnt;; W% z- }4 e; Z. l2 l
        }
) M! M, v8 G( ^6 `6 s! `
5 t* c# c/ {, w% R  R9 ~3 o        addr = base;0 v5 _) D; W2 H3 m8 A8 R
        sync ();
0 U8 {" T! G5 \        save = *addr;
% s$ _- Q/ @, F: q        sync ();
! T; _% X" a' v1 `0 G" ]  N        *addr = 0;
" r9 \* A9 h& b9 Y
. s2 }6 S# X1 \+ n: F9 U        sync ();, V# {5 Z0 P0 {  x
        if ((val = *addr) != 0) {6 S  h4 f% t7 n1 t$ F) j4 ?
                /* Restore the original data before leaving the function./ t( m5 q$ E' R4 T
                 */
) f2 `0 w7 _9 d1 K! [                sync ();- P8 S" f0 U8 `
                *addr = save;
: O8 v# O9 ?- F7 T                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 ^  f# [) j1 y4 K# R                        addr  = base + cnt;8 Y- \4 E: B) T# R7 Q" \
                        sync ();
; J* [. A) D0 _# {1 s7 _/ E                        *addr = save[--i];
- w& f+ i" y# |' f3 |                }/ E( I. H, z" q2 A9 I- ~- F' ~; j
                return (0);
& @1 g& t( O7 {( `; M* R        }. _0 [" H+ a0 T' K
+ N7 n' r$ H! b9 I: w( @* L' @
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
  r4 n, `- S( e4 i# ^9 s                addr = base + cnt;        /* pointer arith! */1 n4 J7 Y, g" q" Q- ]! U4 Q( L0 B
                val = *addr;
' K- y; e8 I0 E9 t* ^9 |                *addr = save[--i];
9 w( U: W8 k) d  n: A+ b- x+ x/ ]                if (val != ~cnt) {2 I: d; L4 k& d, L4 [; g3 l, W
                        size = cnt * sizeof (long);/ m3 M5 @! r& w7 p+ w- P
                        /* Restore the original data before leaving the function.5 Q* V5 {. v+ [$ ~% T
                         */: o- T1 g9 e+ S( b" ]' b' x  y
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( S: |1 ?- @3 n7 i4 C
                                addr  = base + cnt;
/ e* j8 e' @) {( q: r4 F& K                                *addr = save[--i];. C; ]% D; A! Q  d' S- V6 F
                        }& q  J! b. f9 e, N) \3 N/ L6 D
                        return (size);
( @( @/ p& T8 b2 V. W                }
, e& B0 A6 {2 W& E6 L        }
: ^& U+ }( Z7 {: j) u, W
' G: b) Q2 U0 p- _# g        return (maxsize);- j7 d0 |( f8 C" I
}
& l7 _  n8 e' R+ J& K& d) y( [int dram_init(void)! k7 l. F5 q$ w. w4 @' b; }
{
9 a0 B0 H. o- n: u& R+ y1 J        /* dram_init must store complete ramsize in gd->ram_size */
% [# W7 s3 t5 L% r7 Q        gd->ram_size = get_ram_size(
1 ^7 A: p8 h" B1 X8 Z2 F                        (void *)CONFIG_SYS_SDRAM_BASE,6 d: U2 Z+ J3 q1 E
                        CONFIG_MAX_RAM_BANK_SIZE);
+ s; f9 B# p8 R& K' b' B) Z- L        return 0;
: c! E$ {, P2 [1 J}& n& R& ?, v% f, h" l" ?. a5 A
, M" f! e/ G# z8 b) f! S' K/ w. w

' p9 M- U. I6 k. V9 Q* w' J0 R1 c/ C' r) {5 t. y
0 h. r% C0 j; w$ [
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. q: t( {3 p+ q4 U7 O' I, X  O- j. q1 `* b7 @) V. {7 l

0 [/ P) x3 C6 @
* _9 w3 p2 C7 l5 r4 M





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