嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
# }% f0 q$ q9 ^! i核心板2:DDR2 256M Byte   NAND FLASH 8G bit6 h) l0 ?! I# M
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
6 _1 f# [9 a  u; @0 a3 W. \, I2 C5 m; O$ T9 p' w$ [
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?9 Q! G0 A% d* m. w

. o: }* y9 c# W
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:2 Y, g% G5 Q8 [/ Y
/*
$ `. t; O- p& u1 O9 x, x* Check memory range for valid RAM. A simple memory test determines
  E$ R9 B, R6 s# t* the actually available RAM size between addresses `base' and
0 f+ I# h3 y1 Z* `base + maxsize'.9 Z; [7 K% v! v# Y3 `1 n
*/: Q/ `. k% @  T
long get_ram_size(long *base, long maxsize)
6 S3 z6 u2 d  D0 P{
" t8 P0 S' |( f, l  X) I7 m        volatile long *addr;
$ h# }7 g; s; y, L/ \4 q5 z5 {) w        long           save[32];9 T# L3 n- ]; P% ^2 g8 N
        long           cnt;8 L" O7 K$ I% ?7 L2 r4 m" u
        long           val;
' b) s* _: `" {' Q6 c        long           size;
8 q/ k. t& G+ u6 T% ^        int            i = 0;
  e( X* t0 p- F& z; O
4 x1 N# e3 g* X        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {& U& l. U3 `) O# z/ d
                addr = base + cnt;        /* pointer arith! */
" ?* U6 c9 c1 T- U9 t- u$ s                sync ();
$ L- P$ b+ ~& l: b                save[i++] = *addr;8 ]5 V& b. r1 i2 o: X8 b2 }% v( q
                sync ();, E$ J# s5 R- Z
                *addr = ~cnt;  }( O/ E2 n% S6 K- Q
        }7 e& ^$ v6 a8 X1 E$ Y4 Z+ o) Z

6 d& U' m, ]- T% y        addr = base;
& V( U; x7 |. i- Z; X) C        sync ();" s9 s5 Y) h" T( @
        save = *addr;& H5 o  r" Q, f
        sync ();
. ~3 N% g' p( ~# _0 b3 L        *addr = 0;8 x6 Y& |$ f3 e- s' n
; W! ^! J, B' b% W$ }
        sync ();7 @, I8 W" U  i! {) N- X# a
        if ((val = *addr) != 0) {: R5 T. x/ ?2 F4 M. s: V; X( n
                /* Restore the original data before leaving the function.
* Y" [8 X6 \* V" |7 s8 a                 */
4 f+ S) V! C' \3 Q9 ]( R                sync ();! T, x& w9 z% v( l
                *addr = save;$ i& M. W0 [' a3 `9 l
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {8 @: U4 \) d6 F: b2 u- y
                        addr  = base + cnt;$ ^8 T  {3 m# a* G
                        sync ();. ~, c# a4 P  M% C3 `
                        *addr = save[--i];
1 ]5 `2 z5 b+ z                }
3 e) f4 T. ?& w# R; O1 i8 g                return (0);
( ~  t2 E( h. j; e) b7 n0 o- p7 W        }9 C% Y, j' C! [$ E( I' u% J

5 c6 n5 L% [3 M; r+ V        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 A$ \& E+ u) f$ F- T- B! {0 K
                addr = base + cnt;        /* pointer arith! */( P2 w/ r, k- N  D& \, Q% Q: Q
                val = *addr;: V  N% d9 {, g+ N* D5 u
                *addr = save[--i];
  P5 Z& t6 a- n  t/ B1 _6 S/ b                if (val != ~cnt) {
! o3 a2 S5 s: ~. m5 @                        size = cnt * sizeof (long);
( H" P4 d7 `& S4 A" c9 c: F9 U6 H8 R                        /* Restore the original data before leaving the function.
3 y1 l7 W0 |; p6 p8 o2 E. v1 [                         */( e  b. i# |4 f: M& w
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 D( Q! j2 P" V2 F- I
                                addr  = base + cnt;
! _: G8 [8 ?9 ^3 Q* h/ }4 A                                *addr = save[--i];& A3 _$ |) p) J" |
                        }
  a2 j% K* b0 E) E9 I                        return (size);; r2 g7 Y' q6 y! y, ?3 h8 |
                }3 \& l1 Q8 v; R' X1 n( Q
        }: X: i1 m0 U  g: r
5 j, ?; q+ X6 w. I- H% y5 X
        return (maxsize);
2 U- i1 C- t  M}6 G$ G. G4 x0 r
int dram_init(void)
  |) y5 v% h6 C; z! l{
3 W8 S( ?8 s* Q. T6 u7 ^        /* dram_init must store complete ramsize in gd->ram_size */
) m8 W* P0 w* g9 I0 m& z1 s        gd->ram_size = get_ram_size(
/ t( ~. A: B; v$ m                        (void *)CONFIG_SYS_SDRAM_BASE,/ X: u! [* J/ a" Z8 s# x
                        CONFIG_MAX_RAM_BANK_SIZE);4 ~5 f4 J6 G- d" D" C
        return 0;
* E4 T. r0 e, o0 U) P4 @( [}/ ^3 p' p. b2 d3 h

: T7 J0 q! s# o: q) @2 w9 B( i  g- @8 Y7 ^& L& _6 H7 w+ h' u
' x. u- L4 f& T1 w

( v& ]0 q. a7 N7 X3 Y% O! e( n2 QFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!& ]$ A5 g+ b+ N; i) D4 E8 L, T

5 W) e) i' r+ o5 N# a( b4 U  \( P0 q- k

& W/ O" ?! b# U( x7 Q) V0 q




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