嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
# d' Q: M+ k6 m2 c8 i
核心板2:DDR2 256M Byte NAND FLASH 8G bit
8 w- b$ h! g' ]7 k5 c4 ^
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
+ i' A' X% S; w2 {' P
1 [5 t, [4 c/ O f! J. d
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
9 @4 d4 Z i: X
$ p' v" i" C6 T6 b/ Y' x
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
; x) k: c7 D( i" I" l, h( f9 T
/*
6 G! [" D4 y+ B1 J! t$ q3 w( R Z
* Check memory range for valid RAM. A simple memory test determines
5 H) F/ j" b, Q. A; w4 N1 b
* the actually available RAM size between addresses `base' and
, e+ `) l$ w3 l& ]+ m
* `base + maxsize'.
4 B: j5 Q. h! c+ Y% C
*/
8 T2 G( t* Q2 X( |5 l
long get_ram_size(long *base, long maxsize)
" k+ O# V9 x! J1 g, }) W v8 D
{
; E3 f, ^8 @ s: z8 _4 E3 n
volatile long *addr;
" p* a/ }" Q* T! a7 |* _1 v
long save[32];
x9 T' e; x4 e" G; o
long cnt;
9 a4 C& {0 S2 x2 N
long val;
# i) |" K6 ], Y! ]/ P" K& q
long size;
# [% V% s" v% B7 N, ~
int i = 0;
) ?; r: I0 N1 g( J
\7 `! }' U2 b4 G
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 k x, T) x/ t! h
addr = base + cnt; /* pointer arith! */
8 A7 c; ~# s6 N3 D( x
sync ();
7 v+ l/ N# N% h X# ]# j
save[i++] = *addr;
6 z/ Y0 I9 ~ Y/ D1 n- m% V
sync ();
! Q+ f7 j( |- b" t4 Y" |7 w! J
*addr = ~cnt;
1 Q( c0 n b3 `
}
) X' \. F. a+ p+ i& M' c( {
~/ j1 t7 R! ]6 H$ d7 V
addr = base;
3 U0 r$ m# ~ s ]
sync ();
2 d' G( u5 V: N* _5 v" f6 r8 k
save
= *addr;
1 @+ \4 l/ a( ?. z: X+ t
sync ();
, f( @9 D" U1 O" v* N4 N* c/ O
*addr = 0;
/ j! |$ D2 g8 B7 g6 g/ g
( n/ f! W+ U C2 C& P& u( F
sync ();
. }8 x- |9 r, ^% p n, f4 t8 K
if ((val = *addr) != 0) {
7 j' ^/ O, f* m% ~8 {% Q3 E
/* Restore the original data before leaving the function.
; ^6 N5 Y5 \( C$ d# e
*/
: \9 e$ F2 r1 n7 r
sync ();
G$ |$ a- y1 f9 e3 k( X
*addr = save
;
& d$ Y5 O; R3 V. {5 [
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 {- Z0 h& D; X0 A
addr = base + cnt;
8 h0 U0 u. k% H. n' h9 F' \
sync ();
, z+ O7 @1 b4 ], b7 c: G2 l
*addr = save[--i];
. A! [" \' R9 |' o% R: a8 F
}
# i6 S2 _0 T/ L
return (0);
+ s; f% r0 x# g& _0 E$ ?# b' q
}
2 i' n7 Q& u5 \. s5 U
* w2 ~ I% v+ p3 n- A
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- g& g$ F7 W/ d: p% |) u1 y" l
addr = base + cnt; /* pointer arith! */
% K; e3 j8 X. C- ]' s! l
val = *addr;
- `8 B8 u; A* ?0 f; z2 Z0 u
*addr = save[--i];
0 o f7 z) `. M* Q+ x
if (val != ~cnt) {
' f9 H2 s. M2 l. D% H2 w: `
size = cnt * sizeof (long);
- S: |+ Z+ }0 Q3 o8 A0 k+ V
/* Restore the original data before leaving the function.
1 S9 L( O! |7 D- g4 U0 u
*/
K2 b& {& V: o6 S: D4 K3 K
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 ?0 w% a7 @" c4 J4 D4 |
addr = base + cnt;
, h) U( \+ X! a/ E# E
*addr = save[--i];
! V: l9 g& P, _9 A3 x) E
}
( s2 m! Y+ ~& U' U6 d
return (size);
; p0 ?7 q6 X% g" K" g% X
}
1 {( @3 n3 C( [% M+ l
}
! [+ Q+ q4 X0 F, J+ j
- a" i9 Z/ g& ^/ H; U6 {
return (maxsize);
8 D$ o0 k; t) P" \1 {5 C
}
( x" k+ Y4 e- ^0 J
int dram_init(void)
, G0 G8 K+ X4 U0 E9 i! `* Z* `
{
, ?& w7 s+ i) [% Y1 {
/* dram_init must store complete ramsize in gd->ram_size */
8 |: v6 P& @3 g
gd->ram_size = get_ram_size(
6 O8 I( v! `6 A& a& p
(void *)CONFIG_SYS_SDRAM_BASE,
. f/ F# [' g+ h& r( N
CONFIG_MAX_RAM_BANK_SIZE);
" I) W7 @2 H, Y& E# L
return 0;
2 H( j6 o- F) R' e1 t! n* m/ |$ `
}
! ^1 X: q) Y* t8 W6 W" c0 p* ]
/ q1 W, K$ \; u3 R
2 _1 X# H1 l9 s/ l- K; {
3 |. T9 \7 n0 X6 Y( @4 f! A
; j4 N! U3 x# ^! u m
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 R! @0 z' z5 F6 U/ p3 ~9 e- @
. A5 B$ t* m2 X' Q+ k; G
g, C6 P) a0 Z( |9 S) `
. ~ s* P: H5 E6 X
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4