嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
/ L5 \; s' k0 @0 w3 ~# h( N
核心板2:DDR2 256M Byte NAND FLASH 8G bit
' b6 w% A- d: l; C; w2 W; U+ @
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& Y# u+ p6 X) t8 v/ y7 O
6 e& c0 Z0 }/ \$ F8 c
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 ~% A; o0 @6 o3 A& w4 [" |
~ f% G8 H1 C0 P8 u/ E/ W- h
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: w8 ?3 R/ ^; [0 P! T
/*
/ I* Q7 w% i! W& ]3 A# Q
* Check memory range for valid RAM. A simple memory test determines
3 ]( u+ g8 K- M4 t: G
* the actually available RAM size between addresses `base' and
4 L- L3 B3 X, t6 V7 O: k5 ~
* `base + maxsize'.
A1 _. s1 P$ A( p4 ~+ _
*/
# y5 Q" q" t# h0 d( f
long get_ram_size(long *base, long maxsize)
3 z' r+ S' M5 [9 Q1 j/ C" n
{
( C- Z- M. s8 h) z
volatile long *addr;
7 r" V% G/ T0 {% O0 Q" J7 g
long save[32];
- }1 I2 j1 D/ j3 q* \' ~( c
long cnt;
8 I; ?5 \& r: V& \$ D
long val;
, C) y+ |1 K( a5 {' t
long size;
- m! ?9 N* q/ u, v
int i = 0;
' | ]9 Q3 h) a
( l! N; E* a+ o- w' E) M+ o$ m
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& \: l7 |4 N9 E$ C3 }
addr = base + cnt; /* pointer arith! */
. e) ]5 ?5 ~. Q8 s# p7 s
sync ();
0 g- b( Q4 f+ C+ d
save[i++] = *addr;
. P6 }/ E q. h4 {
sync ();
6 j* d8 M4 Q8 K( b/ c
*addr = ~cnt;
. T1 f$ L0 v; e: a
}
* A4 W, p2 |- [# U6 Y( h" u) v4 ^
- s) }! [: H) [! T# ~5 z
addr = base;
9 }5 N+ S9 E! g( O3 O
sync ();
2 i! y" V z, p& ]. ?* o' W
save
= *addr;
1 o* S% l' _7 B
sync ();
! @. G+ {& g* N, x, B2 m
*addr = 0;
7 i2 v/ @2 I; P9 `! z6 m
9 @/ b8 z8 b# U% `$ u4 g0 U
sync ();
; R( b1 ^# k! @. \6 e; _
if ((val = *addr) != 0) {
' l! U/ s1 l5 [1 K+ W
/* Restore the original data before leaving the function.
. N3 p6 c& {" z3 _" A
*/
# W2 v) }1 H1 P) X7 ~+ s
sync ();
3 M* ]% X- a8 G6 G+ `
*addr = save
;
; n- {3 k) b$ K( O6 W
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 u+ F; [" Y0 M' j/ N1 c6 r
addr = base + cnt;
( y% m1 Y2 a l
sync ();
* Q: S9 \. W8 z
*addr = save[--i];
* [/ u5 G% E |! ?2 o
}
1 c& o2 f/ D( s( j, {4 [7 r
return (0);
h8 ]; } v9 E- ]0 T: K7 I, W1 i
}
# b2 @! u1 K" L3 n. N& S/ x
. j( }5 m" y* Z' k
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ P b, P' k! G% a' b9 O1 O) D
addr = base + cnt; /* pointer arith! */
& y# N2 |2 T& w8 }6 a
val = *addr;
+ `- @8 T" v8 t0 m, `' z! _
*addr = save[--i];
& K# Q1 _# z+ q4 j; s
if (val != ~cnt) {
1 h, Z6 x4 O# q$ T% X
size = cnt * sizeof (long);
& g+ i9 z/ n x7 c2 g3 C
/* Restore the original data before leaving the function.
5 _% @4 M3 r3 y1 E+ P( y3 d
*/
( T! }4 a) f$ f+ y8 |
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- o; h9 W I& `$ e- a# Z& S- C
addr = base + cnt;
( r: s- _6 T2 n
*addr = save[--i];
0 b) L& u% s4 ~& l' y
}
; k$ ?+ { `9 H
return (size);
6 [/ }5 C H9 i R0 {& e
}
7 E) J! u% Y3 E9 ]
}
: x0 W% D/ ^% D+ ~5 f" s
/ {/ ~5 R. c2 V2 ~' O
return (maxsize);
0 _) U' C) ^; f5 w& ~
}
W1 k" Z9 V6 G% T
int dram_init(void)
/ R* N& y; i1 j. b+ C/ v0 d
{
. {9 u; X i `. e4 W; C
/* dram_init must store complete ramsize in gd->ram_size */
( C h( s/ O$ A; R& t5 r! r& s1 i
gd->ram_size = get_ram_size(
/ J) M3 e3 J6 O' A! Z) t5 Y( \
(void *)CONFIG_SYS_SDRAM_BASE,
! q0 D8 S4 m: y ~0 Q+ q
CONFIG_MAX_RAM_BANK_SIZE);
& @: k" u4 B: A& S$ j6 }- W( g
return 0;
% ~. M$ F4 U3 c5 ~. A
}
% P5 {; Z" f1 h
' [% H6 r6 ?( [3 B
( {4 P6 @. b8 x4 X5 s* }
' K* n2 W9 u" k) ]
- P* b o a W/ m" r* A
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, ]" M% U- ?. i% M: H* i
# O% U. g: H; L+ N7 I8 y1 E
" N' I/ J6 L0 `* p9 z5 u2 y7 M9 E8 v
3 ?: \: t* P5 Z5 ]; T
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4