嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
* g/ c/ j/ |6 {( n1 A+ _% w- S核心板2:DDR2 256M Byte   NAND FLASH 8G bit/ ^, o, k  O  a0 u# Y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
6 N& H- T# [: G  p- R, x( T5 f7 p; H
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?& |. X8 l( T1 K5 G$ Q7 u7 H3 D0 O

. w; D% `3 J5 a! g2 y
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ Y0 v+ q4 a. _  \/ e/*
8 I7 o! q' i! m5 f) ~* Check memory range for valid RAM. A simple memory test determines
5 n, L- g+ H# O6 V: S* the actually available RAM size between addresses `base' and
& q: n8 u* B+ Z# {- }6 P9 P3 Z0 j* `base + maxsize'.
. i( g# Q2 y, k+ Q, |*/5 s+ n# a' _, M3 ], l
long get_ram_size(long *base, long maxsize)- @6 z- G# D3 {
{) ?( h1 z. p% s& J7 U8 t8 ^) x
        volatile long *addr;
/ x6 m2 r+ E8 H9 p        long           save[32];
; U  P; c* I! ~" W: c        long           cnt;$ w8 I! S- @3 |: m( F# L' \
        long           val;! Q, t( U" v7 d
        long           size;/ v4 S; \5 _. z4 j# @
        int            i = 0;/ `- S0 s6 z9 x+ |' K
) |0 [6 w; }. @  L# o
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' ^0 n, s8 ~* d                addr = base + cnt;        /* pointer arith! */
' g4 Z; v% |( o7 r3 M9 P                sync ();
/ N7 K2 p/ r! @2 _8 _# }# Z/ k+ k                save[i++] = *addr;
. L) R6 N, h* H8 _: T" ^: h- T1 S6 n                sync ();  e5 u! g" \; c" @( i
                *addr = ~cnt;1 \; k7 h$ D# k9 P, h
        }7 B! a# F. _; f9 }5 |) C3 r
" H' a( P  Z. u- R$ a( F
        addr = base;9 k7 n- F, _: T( n" N; ?& {6 J
        sync ();
" a( c: T/ A" E3 w5 M' r        save = *addr;
6 Y# Z  Y- D0 F        sync ();
$ y. T7 v1 K1 ]4 S4 ~        *addr = 0;- v6 Z+ n& n2 J7 f

2 P- V3 E0 @1 d5 Z1 _8 x+ v        sync ();6 M' K$ J1 ^" H9 f; t
        if ((val = *addr) != 0) {
! q5 L* q5 F/ c+ V                /* Restore the original data before leaving the function.+ u3 z& B: n: \0 h% `" \! z: }
                 */8 h! O( c7 Z% P
                sync ();" {6 R$ m/ ], B  P9 f7 I
                *addr = save;* y2 p! f/ |$ v6 f5 m! t
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
9 p5 @* ]7 B! s! e+ M' {" e4 S                        addr  = base + cnt;7 a" _' A2 _6 x( }' v
                        sync ();. Y5 |. v0 |" `& T
                        *addr = save[--i];* c5 h% H8 k# ^5 r# o
                }
; m) f1 w. S5 ^! a. q; `                return (0);/ p7 S( ~! A( E( k3 _8 `5 e; D4 A2 F
        }
5 H: c2 F8 h  I, Q0 ]
) b  j7 E: z" B6 i. \) W        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( g# |& n) u; T- O8 c                addr = base + cnt;        /* pointer arith! */0 S; |/ k: a+ r: j8 E
                val = *addr;
/ `6 ]' C6 v8 ]) F. |                *addr = save[--i];0 H& t' k+ w# [- X8 t9 [0 |" V, n
                if (val != ~cnt) {
0 ~# _: z' _3 B! `- g/ j* t; @                        size = cnt * sizeof (long);/ F$ }( @0 o5 l( ]! O# G
                        /* Restore the original data before leaving the function.5 x) Y3 k& u6 g
                         */
" V' M0 j% j4 w) {1 }# Q                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* I, q2 Y  ?+ V! p7 @7 r                                addr  = base + cnt;
9 u! e" }3 G1 a6 i2 H! c                                *addr = save[--i];- `6 r6 Q6 P9 o
                        }
0 @4 h& ^; @( E* r$ O+ b                        return (size);
7 m6 e1 G5 {; X# S+ m5 b                }+ u9 k. [& C+ p
        }
' A( e/ u: U( P# ?& R: V
/ l: g( p# P( m& m        return (maxsize);
% e( A! x$ G" w}
$ b+ ?, u: V, b0 b  j' Nint dram_init(void)
" w" n& g( Y- b; G{
/ d# a# X3 t2 ]+ Y% O: j        /* dram_init must store complete ramsize in gd->ram_size */* {& I4 X9 R. F$ l- ]3 |
        gd->ram_size = get_ram_size(
+ Z7 ]# q+ y$ X                        (void *)CONFIG_SYS_SDRAM_BASE,  C% n( N; h+ X- S$ `7 _4 @1 I
                        CONFIG_MAX_RAM_BANK_SIZE);
8 H, K& g8 [; H/ N* S        return 0;
2 I7 I. x1 P/ R/ p' }}! Y2 D7 |# i% m- k

! h5 u0 U& H3 c; U+ \7 E0 F( O( f# a( X4 D. W" Y
8 ^7 i/ Q- [+ W; J4 a4 y
- t5 t; I) W* N2 C
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!* R9 m" x6 s- D: T
7 X- \. l7 q$ T, p; y" p$ a

, ]0 ~+ T% ?6 c  Y; v- r
8 P  O& G( l0 R3 Y7 k* N





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