嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
% N$ ?( Z7 e3 o5 R ^
核心板2:DDR2 256M Byte NAND FLASH 8G bit
: g% V9 q2 G6 s7 j
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
: _& k( D. f/ P5 [' N
Z5 F. Y$ [2 A `) l
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. r& O$ D7 J8 P! ~9 h- P' Z. L: } B
0 w: s( |; S) d$ w: l3 R, Q
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
a- A: i) d+ ^
/*
8 R# \0 z: A5 Y$ H3 }
* Check memory range for valid RAM. A simple memory test determines
) n% Y z! k' B# X9 O7 G+ f
* the actually available RAM size between addresses `base' and
9 m% {$ B/ r( L
* `base + maxsize'.
0 R# P# h: f$ `" l8 v# |" R) S# J
*/
5 `" v2 u2 G" h9 \
long get_ram_size(long *base, long maxsize)
6 ^, b/ m+ b# d
{
~) u( E( \8 P$ s7 q# Y$ a
volatile long *addr;
, f. b1 l: v: a7 V E7 q3 G
long save[32];
( v) S6 j0 w" L
long cnt;
9 ?! }. N/ D4 X1 Y% l4 o3 V
long val;
) j5 v. u8 M8 j& k% B$ U
long size;
) p( f$ g+ ^$ H' d0 f% z! m: D
int i = 0;
' B1 R- ]7 K/ W+ s) Q8 m* @
9 j- X- I8 q4 e$ N1 T6 c, k- ]
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ ^" u3 h+ l0 ~# B9 q$ `
addr = base + cnt; /* pointer arith! */
( i& `6 X) h; P' k
sync ();
6 w! R" [. s: D4 R
save[i++] = *addr;
* I' T! J7 Q$ g+ W* C' F
sync ();
4 l1 }. J2 O, |( j4 U
*addr = ~cnt;
. b4 ^# W- ?4 t4 l. l
}
) s0 l$ Q' b" a" T& Y# k% W
% Y" X5 M {- r* t* g0 h* f
addr = base;
3 Z: |# S% }: A: H
sync ();
, V6 q |* v' X5 l
save
= *addr;
8 N3 V, D0 G: r$ E- `: j1 O! N
sync ();
& Q* S, N/ E6 ^0 V" S- _
*addr = 0;
- |+ J. x7 c/ y3 k" M
: H1 Q0 l* s; b4 M6 l; k
sync ();
) O7 a4 p; \2 f
if ((val = *addr) != 0) {
2 H9 H% W# |4 K
/* Restore the original data before leaving the function.
7 g: }" S' t1 r
*/
- H* B6 N/ ]7 K) M; B! X3 d
sync ();
) C- M" B* l9 |! `+ U
*addr = save
;
, R) _& L+ E) T0 P# V
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
- C; j: P2 ]& ~* z- b L
addr = base + cnt;
w' c# c! f) l- R; @; U! i
sync ();
% p, k7 J$ E1 v8 ? }& W( [5 W9 C
*addr = save[--i];
9 D' V6 t6 z7 X7 s8 k
}
& M5 K6 Q0 D4 |
return (0);
3 u% v" E+ d: e9 o1 `( P0 I
}
+ P8 `2 _- `2 ?
1 M. \$ O5 J7 S; k) M
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) N& k' o& w3 r: K/ k" y# R
addr = base + cnt; /* pointer arith! */
% Y( T$ b' g: q; `, F1 b
val = *addr;
( e$ f: F& ?+ V7 H
*addr = save[--i];
/ T- X* _# }! Q# d: W+ s' |) u9 _4 ?
if (val != ~cnt) {
: B' w3 ]+ ~3 e0 S3 E+ U! I
size = cnt * sizeof (long);
1 i5 p/ w; j) b% M2 u
/* Restore the original data before leaving the function.
2 C* Q$ c) O+ e# u! \7 J
*/
! w' E3 G* Q1 X& b
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 o. w& `: a1 T8 e/ s
addr = base + cnt;
; r# [- L/ B6 z6 T9 a9 O7 z$ D
*addr = save[--i];
9 R T% C6 I7 K" w- P
}
0 w# }5 [2 k6 J% g0 T! P" x9 {
return (size);
5 ^; T: p8 }( Q" `: c: P+ t
}
0 L" M- L9 F! ]) h5 G+ s7 M( z
}
2 J* k, T/ a1 V$ q. Y; X* F" b
% u4 ]5 J) G3 F P( Q
return (maxsize);
7 H$ A( z3 B% d* l
}
s1 ^& S2 \5 S. o: G
int dram_init(void)
8 c4 P7 o( W: ]7 n
{
; R) r% T' Y/ e
/* dram_init must store complete ramsize in gd->ram_size */
; S, [! ~+ d. R( b( c
gd->ram_size = get_ram_size(
x, B% e, c; q- K
(void *)CONFIG_SYS_SDRAM_BASE,
9 k( d# c9 t( V( b J4 _& h* o4 T0 T( i" o
CONFIG_MAX_RAM_BANK_SIZE);
+ \7 ]( f) \$ m4 D; L
return 0;
6 G! x( r& _4 G3 g$ w
}
8 {- r% C6 ?: J+ D: G
$ G; \ q7 w' Z, B* b4 G
6 O3 a. K+ j; Z$ h. j3 H
- R" Y- U/ v( C6 u: d2 h# P
& _$ c; A0 q" {2 |1 C* {
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
I1 b! n. E' y8 e! t# u
z d4 J; ^7 z! L
& |; R5 r/ T# n; K
) k: n: x' C" h& T0 I& o
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4