嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit+ X5 [1 ]7 e' R+ J+ H0 ?( z
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
9 t# O5 s# G7 S! K  l这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?' j, _. S( U$ z1 a& h8 K

. a8 @; l: X: Z' @. b是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# n( B+ ^* o* Q' Z# w$ Y9 f& a4 ^  J9 U. l" u- p% r

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:- B% A9 S$ p% r8 _
/*
( E, L. w; T' Z5 `: p9 |9 ?8 w* Check memory range for valid RAM. A simple memory test determines
! t% Q8 m3 n$ _# B" }# \& o* the actually available RAM size between addresses `base' and. ]5 e1 r& x+ q% Q
* `base + maxsize'.+ O  M1 T$ i9 G" K
*/( {0 A# E0 P, T( `9 c/ T5 ^2 J& n) X
long get_ram_size(long *base, long maxsize)
/ f$ k! W4 b, f) n; Z4 A{& Q6 K; F% T5 Q4 Z( Z" f8 D
        volatile long *addr;
0 i# U& O6 y  W7 f* `        long           save[32];
: u+ j% c0 d1 w        long           cnt;( z" z( ]) U, X2 Y8 \+ w. j
        long           val;; r- e. F0 R* g1 e
        long           size;, h: x8 S- C- p6 ^6 E$ C
        int            i = 0;" F% H) N  |. B

: V* h/ ~. i6 n" \: I+ @        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( l7 |5 J# Y9 N# Q                addr = base + cnt;        /* pointer arith! */
  q9 N" H2 _$ t6 e# [                sync ();
% F% q1 \& S: i9 k1 ]3 Z) `                save[i++] = *addr;
3 U6 U/ Z( b* u2 u- j  s( d( p6 h                sync ();
+ b8 u, U5 c" g4 \                *addr = ~cnt;
: c% s3 C1 L: h" I6 y: F$ ]5 e; r# g' b        }
! T' _' U, M  T) s) h7 Q: B4 x
7 }, Q, T( `# a$ @        addr = base;! d2 v' G$ j) }7 D7 W+ Q' R
        sync ();) f+ y6 E# `; s2 b+ V
        save = *addr;& o$ T8 ]8 N; ?" d* O
        sync ();" E  E; K* ~8 z* C: U' e' g
        *addr = 0;: p7 j' S7 N+ o4 ^8 h
  t4 R3 ^$ m  J+ \
        sync ();9 T. v) R, F3 G% u
        if ((val = *addr) != 0) {. c6 \8 g4 N$ {3 b' R' v! K; ^
                /* Restore the original data before leaving the function.: I$ M) _9 R. d. `9 G, E* M
                 */( b- m: F# U/ q5 a
                sync ();" F+ Y2 S/ n6 _% _( d
                *addr = save;2 s/ w+ a1 A( X8 S+ U4 x( n0 x
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ b6 e! }7 ]# o# v/ y7 o                        addr  = base + cnt;+ M' G& k; m6 y$ Z  y; a, l9 D' `
                        sync ();
' w+ V6 m  d" ^, k. }: r                        *addr = save[--i];
. k% ?/ W( K. U: X. m& r% u3 o1 E                }7 v) b+ `  g$ P* T9 ?8 m) R# ^
                return (0);
! l- H9 Z0 t4 G4 G; _  M        }; o! c2 ?# [+ l; \
! r; t8 k6 i) s$ y5 c1 @
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {% j2 h8 U5 }) V' }' a" z+ q
                addr = base + cnt;        /* pointer arith! */
6 `+ [! b& ^! _- e4 K1 W                val = *addr;$ H1 f: G# H: m
                *addr = save[--i];9 x2 J& T6 Q1 l7 E% g8 Q2 ]
                if (val != ~cnt) {" O7 t6 l1 Z/ v3 l# {/ K6 e* E, [
                        size = cnt * sizeof (long);& G4 m  A! g( E( T: m
                        /* Restore the original data before leaving the function.3 j; R+ ~7 n: P2 C% H& g# k
                         */0 V6 I& ?2 ^) I# B7 i
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, G& ~  O) O8 i" H$ N% E                                addr  = base + cnt;+ A5 a- A# O- n+ w; R- A% r
                                *addr = save[--i];- w9 q* G" R. _. m8 r
                        }- }1 i, u% k5 J$ f
                        return (size);
& `/ v3 a0 V! P0 Y9 Y                }
  |& V2 [1 F, K/ G        }# g! E, M" v7 J' r0 v" K8 N

. b- w. R9 x' u+ _1 P! [        return (maxsize);
% P5 i$ ?$ W' g, b}
4 }/ E! G) W% wint dram_init(void)
# D" j4 \8 w# N. p5 [6 B{5 S% c4 }4 J& R. l+ \& ]# \# X- W
        /* dram_init must store complete ramsize in gd->ram_size */
7 {' u$ ?$ D3 }5 }        gd->ram_size = get_ram_size(
8 n5 }' _. N& Y0 v- t                        (void *)CONFIG_SYS_SDRAM_BASE,- f! f$ N3 M8 Z
                        CONFIG_MAX_RAM_BANK_SIZE);
5 m  h+ v# I4 c  |6 n6 @' V        return 0;1 W( l+ F9 z) i  t8 L  \
}
  I2 ~9 B# N$ U" q5 i1 b. \4 g1 w$ w% H4 r2 Z9 e9 \3 U, T( C

0 j5 ^& z! G) N7 J+ n  c$ \
+ }6 _* D4 `4 p, `7 P- B
; D6 r" P) d' T! L0 _0 fFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 T) n4 u- V: b/ o- N6 d/ D- a+ n6 n. F2 X0 l+ C8 H

( B9 K- R+ p% J, s( c5 W8 J
1 H* X% L3 m6 y% G# a/ ^3 h% M6 Z





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