嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit1 w/ e7 R' S4 y
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
4 u/ Y, T+ r9 I/ c( a这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?" X2 O+ c/ U8 k
+ D7 k) e9 J3 Z8 l
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?' I5 W9 O& w4 o6 m* ~

: l8 ~7 Y* [( ^4 {
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, G! ?5 P" J5 K2 d4 c6 g
/*
+ b; {* G- r; U  `# @3 d* Check memory range for valid RAM. A simple memory test determines2 T5 j" `+ l& I- |# a
* the actually available RAM size between addresses `base' and8 A/ E7 j) b9 V) g$ a$ j. ^
* `base + maxsize'.% M% a- R* u/ @% Z0 B7 `' A
*/( g, x; q" W6 J' r
long get_ram_size(long *base, long maxsize)
% ~7 T# `' ?; r' P{
! `+ |8 Q4 h# C        volatile long *addr;5 U1 q4 t# S% o* P6 D
        long           save[32];
& B; G7 f( d0 M. w7 }        long           cnt;
4 \8 n- Z" N0 a9 c! a& g, a& ?        long           val;
* {! E$ E/ v/ [        long           size;8 k- S( I0 N" F! M0 \
        int            i = 0;- ?% z9 j8 N! Y  @4 c* |3 ?, h

. L  \, I* {+ h" l' d- D9 x; g        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {6 ]* d+ H% D: a9 U; B; l" L2 [! Y- U, U
                addr = base + cnt;        /* pointer arith! */
! O& x( @1 ?7 B  b$ `4 N                sync ();
$ G4 {: F% ]" J; N: a7 d& ^                save[i++] = *addr;& a$ _  y" [4 H
                sync ();$ x. @7 k% @& P& J; c
                *addr = ~cnt;
6 W  i$ P$ c- v) D& A        }
; f2 P! S  w5 {7 U4 i$ u# E. z3 u" u2 n* J0 r! j, u
        addr = base;
: b% J: T: w0 p. H8 @, }        sync ();$ e9 W5 q" k* g- |; G
        save = *addr;
9 z5 G4 \$ }& C5 C' M$ i        sync ();
; ?% [! o' }' D# Y1 l- L        *addr = 0;
: N2 |% y7 C" L* h/ [' i/ C- q
. p2 F+ V( B: M; I) G- g, B4 f& |+ e        sync ();
0 Z2 {4 U, y5 u0 f# Y        if ((val = *addr) != 0) {  r- b% ?( @& c7 x" N! q) N$ Q& A
                /* Restore the original data before leaving the function., o% n! x2 J, I1 T5 `8 D
                 */
% b& @5 h' ^. F( p2 k5 t; Q                sync ();, o  J- L. P: h& h3 x# B- Y
                *addr = save;
; X' }" P& ~7 E                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {$ T) z$ s8 L0 _/ ]' _5 q1 t9 I
                        addr  = base + cnt;+ }$ q. R2 I; H+ r5 S
                        sync ();
5 Y6 k( k) b5 U$ |( V& e2 c5 [- B, C                        *addr = save[--i];
0 E- h1 e3 Z% I8 t                }
; V: o: {, G" }% B& ?% j6 \* u8 H                return (0);
, K4 `5 N% q7 F        }
4 a2 r2 [1 Q* o* M
- _3 Q3 ]8 D7 ]1 K        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ z( r8 M. d# v) r8 a                addr = base + cnt;        /* pointer arith! */
! k& A2 M$ g& q: C3 ]& U                val = *addr;" ~3 r  X8 |& c* L
                *addr = save[--i];  z) c9 @- F1 r
                if (val != ~cnt) {; L8 \) ^. c/ n1 F$ c* x
                        size = cnt * sizeof (long);
7 \& |* O5 {( l  u  z0 G                        /* Restore the original data before leaving the function.2 X! n$ x% \3 c3 r1 d
                         */
6 {* o$ a0 ^0 ^+ e5 Q                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) k7 }1 r. z* U
                                addr  = base + cnt;) I6 d; P# V2 l3 B4 T( `3 d
                                *addr = save[--i];  e8 i7 f# F" b# n2 s5 p
                        }8 n) K' F: R- L+ i
                        return (size);9 O$ z6 M) q6 b. b
                }+ B4 M( ]4 S1 K# ~2 B( V
        }
" V2 i' M% `9 @5 I4 e: E  ]
6 {0 \& L- D  `# I        return (maxsize);/ y0 h) y- g, s! ?
}
% S) U; ~4 P% y% `! aint dram_init(void)) U5 I$ Y- |4 [# B- k
{
, l9 ~% M3 w/ C- {; U! t+ p        /* dram_init must store complete ramsize in gd->ram_size */
8 V* J8 r% {7 d/ w        gd->ram_size = get_ram_size(
: v' |1 w, u6 a8 t6 L2 @                        (void *)CONFIG_SYS_SDRAM_BASE,
6 D# p" b9 E3 G" O                        CONFIG_MAX_RAM_BANK_SIZE);
- b; u, f% a$ ]( T* B: a+ `4 F5 c6 x$ R        return 0;
3 a$ E. |5 a' a. y}
& e  R9 Y# ~4 i  I! x
+ c' u3 k7 K- S: \. ~3 u! \/ t+ v0 a
; A8 W9 _  u; k7 y- ?! O

/ ]$ q+ k2 v- Q6 ]( YFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!( y. h! T; C3 C# H: [% t9 M

% O! o5 L0 k  {+ p4 g0 C6 |, U& t+ j4 _3 J. T# _; U" j
& F  f; v0 G- Z( D





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