嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
% f! z, [; ` ^3 R. Z4 a8 a1 |3 ~( W
核心板2:DDR2 256M Byte NAND FLASH 8G bit
. |$ U- a7 N4 [8 I9 R7 C) t) K! G
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
8 {1 J0 L; X7 U" ]. t% h; k( \' C- G
& z5 R8 v0 M9 X4 @+ E5 y9 i
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
5 h0 U7 y' Q1 _& b( f* X
$ Y8 I( C# M2 Y" a0 x2 {% L
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) ?+ o, X1 Q, ?4 |" I$ W k
/*
. n! j* s3 P5 \
* Check memory range for valid RAM. A simple memory test determines
7 J5 d9 U# l4 S" v3 X7 z( i
* the actually available RAM size between addresses `base' and
\' w3 |# ?7 d1 e, f
* `base + maxsize'.
4 P! Y3 G8 h7 T8 J- D* `! k5 W
*/
" n" X2 ^* n0 Q" v
long get_ram_size(long *base, long maxsize)
( U6 N! a9 t& n& ]* _) T$ e7 v
{
# a2 ~+ u6 K! o5 J: l3 _+ z9 m% }
volatile long *addr;
: N3 P3 Q7 z g$ n
long save[32];
1 e* ^. n6 I7 Y/ M1 m5 E1 \, C2 O
long cnt;
$ P, }4 \/ _9 r% t
long val;
. `# E2 X8 O4 |7 i/ r( S3 E0 `
long size;
, i. R. T1 Z- f! ~1 ]4 Y
int i = 0;
8 |6 T0 W( i# n1 J
( [5 V" G" ~+ K9 P8 W3 F
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' o! y% G9 g6 q
addr = base + cnt; /* pointer arith! */
5 D5 @( }" |, w6 I8 I. b
sync ();
% T* b) s) B0 v- e% ^; R; `
save[i++] = *addr;
5 e2 O# m) U% k# R
sync ();
) I) R- K) h' _- l, Q* u0 h. C
*addr = ~cnt;
* [( C; ^0 C4 ?3 N! W
}
9 M+ E7 ?7 h+ F5 G1 k/ B) K
6 }# P2 @' S, D* {; q# C3 H
addr = base;
c7 I6 Q1 [4 z. p
sync ();
6 n9 e- g! C6 G) N
save
= *addr;
6 `& ?1 ~. [* w. E4 R
sync ();
* I+ u0 X/ c! j! ^
*addr = 0;
# `* k$ o6 T% t) v5 ?* B; r' ], Y
9 Y$ v2 g. c, F& q
sync ();
) t% p$ ~8 j" h# O( l! L- B& } b
if ((val = *addr) != 0) {
2 M1 y' K7 y0 T! o8 \( w+ V/ |6 D
/* Restore the original data before leaving the function.
4 o; h9 F$ ^0 |8 N
*/
4 L' N* n9 O4 l- |7 Q1 L3 q
sync ();
. ?( x6 c2 X- z0 ~/ R
*addr = save
;
5 u% e6 z. {1 h* A n; V* y7 X
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. i" p& F. b/ `
addr = base + cnt;
" n) M* F" e+ C- O" b
sync ();
3 R0 c1 g: V H" B
*addr = save[--i];
: q% R, U$ W% E' H" q( n
}
" B. q+ h* {9 R y5 ]
return (0);
' x8 b$ a% Y% C& I+ Y" Z# v
}
; e4 X; \, O0 C; Z; B& J
8 d. i6 j% _6 F6 J& I! u E/ e
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 R4 u9 H( Z( M' y$ [
addr = base + cnt; /* pointer arith! */
; p! O8 F6 n/ g( p6 O
val = *addr;
. A" L1 K/ f5 y5 A$ j
*addr = save[--i];
( s8 a- R3 ?* {0 k0 U/ F
if (val != ~cnt) {
* q5 F6 a; L3 ~: F/ d m
size = cnt * sizeof (long);
m$ Y7 ]7 O& ?& G% \
/* Restore the original data before leaving the function.
( a% W8 K# m; ^$ @* C3 H+ ~$ C! Z' M
*/
' O) e+ K# l/ d) X0 k
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ U3 v8 |& G/ q. N3 O" s) M
addr = base + cnt;
/ L% x U" {. ]6 O- V
*addr = save[--i];
9 J. p( F- R% \% ^- @
}
5 I r$ r6 l# |
return (size);
6 M$ K5 Z( h3 t3 c
}
/ i D, c# _; F m# X5 ~
}
' g. W8 u0 Z9 [
( X3 F$ X/ B0 W" F, q) Q" [7 R
return (maxsize);
# n6 _1 f" b1 k* U) Y& F
}
# n# i9 Q; \ |, B, @
int dram_init(void)
* j7 H% U1 m" ~& S4 g
{
. ?( H# V: m( {, V
/* dram_init must store complete ramsize in gd->ram_size */
* ]" ]4 g% ~% X7 V x R( U
gd->ram_size = get_ram_size(
2 j8 C* g7 T2 O" Q7 l3 v
(void *)CONFIG_SYS_SDRAM_BASE,
' Y8 c1 p7 r, g5 c9 C
CONFIG_MAX_RAM_BANK_SIZE);
" L @9 R7 x+ t) Y2 D0 [
return 0;
( B" f+ B1 x- a: r& } j
}
; S2 L) ]/ Y, e4 j6 i' @5 L
# O B/ t7 J/ F( C6 V9 O
: G. t% j& d4 c; I! D. A4 I4 R3 L
: m& m |! T; l% ]& K1 k! n
8 D) e+ g. W1 W' {# N- v
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 l, \4 i4 S& U2 K N2 U, j
4 K# F! l0 t# b
" I0 j% m' K- B8 z; y1 w3 X" F3 o
4 |/ D: T& l6 y- B
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4