嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
1 k) i5 [* S$ ~
核心板2:DDR2 256M Byte NAND FLASH 8G bit
6 k! s. P$ S% d) w
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ T: i; X! {$ Z( n
% k j$ J' B6 h
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
6 j- o+ q7 S* G1 h
) {/ v) h& G3 [1 n4 w
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 l" O; S, v, j$ g% ?) }; ?
/*
5 H. g, I1 m7 g/ Y+ D4 a
* Check memory range for valid RAM. A simple memory test determines
6 r" q' V3 @# E* P, i- _( `% A9 m
* the actually available RAM size between addresses `base' and
5 n+ x5 r/ ^( Z& z
* `base + maxsize'.
& P! G: v0 C% c$ W( v
*/
$ W; ]7 \ ^9 F# D+ M# s" A
long get_ram_size(long *base, long maxsize)
( I( h7 P5 }9 `- L/ g, R
{
3 r6 d) t4 K! q3 w- a1 Y* k
volatile long *addr;
R" o& x: c0 l. u% G8 s
long save[32];
: k2 R& Z B* J6 T$ z3 c) Q
long cnt;
/ _9 g) J) C- j1 R5 ]: N! b0 D
long val;
: g0 x/ M w9 l6 f$ I
long size;
* x7 d+ F. W9 _9 K7 ?5 S
int i = 0;
r' D) P! L" \5 [$ i3 d7 j, P
% Q) i: o! X) v7 M8 A
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! K: q+ Y4 }9 I2 v1 v" c ` J
addr = base + cnt; /* pointer arith! */
& r2 T2 l" w0 c9 }3 K% Q- `
sync ();
" T3 K+ y. @7 d# W, t, h- P$ V2 M
save[i++] = *addr;
" E4 s" d$ Y; |; @: x: A4 c- n
sync ();
) w$ w+ W# Y8 T% b: R% U
*addr = ~cnt;
( o7 z# o* A) u4 @8 ]7 f4 K, G1 ?$ N
}
. e( z/ e5 r9 @, A
8 C7 i! Z0 c; i7 R
addr = base;
; K( ]2 Q) x3 |8 y& I
sync ();
^. e* P9 S9 I* ~
save
= *addr;
, ~/ i% u1 a4 ~" l0 Q7 l0 ]
sync ();
3 F, j, L3 g- C3 F/ h
*addr = 0;
H! }+ j' V% C& V: R- _ M9 R# J
/ T! v* t$ E* W7 D+ A1 x
sync ();
! B0 J/ d8 V2 t* Z8 T8 _# t
if ((val = *addr) != 0) {
; t% Z' N0 v4 b8 I+ C# I+ U/ X
/* Restore the original data before leaving the function.
! ?) Z, n; W7 d$ \
*/
' U, R/ z8 o' q+ w7 ~) D8 _$ P
sync ();
, M6 O$ o' K( O5 O3 G% M0 c' F7 S6 E
*addr = save
;
* `3 j7 s7 f1 w$ f- t; K
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# P& `' \; ]% X" l4 l
addr = base + cnt;
4 C; X: d) k6 m3 s, Z$ \
sync ();
# v7 d. u$ M) I# J/ A4 i( l
*addr = save[--i];
8 @* P% z5 F+ J# @! [6 d! L/ d* ?
}
/ n8 R( v- c4 m- S3 M
return (0);
2 R3 m, ]8 i" W% {
}
( v: ~8 k/ {1 V2 ~, q! m
* Y* [4 a) u1 c1 H" W) n; L% g; J* n
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 k) @% ]" c @! k
addr = base + cnt; /* pointer arith! */
5 n8 X* b9 v3 ~6 J' e; n
val = *addr;
0 m2 P0 G9 o1 ~# q& F: C/ |+ i) t6 F
*addr = save[--i];
6 P9 u0 k& I0 M+ B
if (val != ~cnt) {
5 F4 D0 V. ~8 b* u+ F7 h
size = cnt * sizeof (long);
8 A$ w* X s. `6 E6 n2 a
/* Restore the original data before leaving the function.
" ~0 _) {( @5 y. V2 p: K
*/
2 X' Y s( `2 y* Q3 p
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# }6 r, f- v& P G0 C7 k$ |6 Y# I
addr = base + cnt;
7 {% h- \* c- s' D- I+ Z1 L, `
*addr = save[--i];
0 J: q' y: n" U6 O
}
% I7 g$ K; A6 w
return (size);
/ ~. |9 |+ a6 A! X" g$ v. A
}
: d: M) \4 \2 k/ h
}
9 W i7 E* X* D
7 i+ L. k, T, n7 L1 a( b
return (maxsize);
, \8 O: Q# e% x) g* S3 O( j6 m* F
}
4 U) l; G8 o* V/ T- A
int dram_init(void)
0 \9 u3 [* C9 a% l& }3 a3 e1 K
{
5 {; S/ k) B& R/ J" @. s. M
/* dram_init must store complete ramsize in gd->ram_size */
3 G# _; F* @& {1 p
gd->ram_size = get_ram_size(
" c8 O* j) ?4 E2 t8 q; F$ s
(void *)CONFIG_SYS_SDRAM_BASE,
: X8 u- P, n" V1 y5 B1 v1 v h" X7 h
CONFIG_MAX_RAM_BANK_SIZE);
& \; e& A0 o0 E
return 0;
1 T8 b* z6 g$ Q8 H4 a
}
e( b+ q7 a1 `6 u& y
* C9 K3 P7 F: X3 z
2 d: a4 ^) V, B
! V7 Z8 M4 v; d& `& [; v$ |( y
. t6 {/ [5 Q4 W+ g; P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 K& [2 s' L- T8 S! |: J k
* N. _" J4 I+ X
: p+ O) e8 f! w; o- O. ?! l2 V
' k% e0 Z9 ^2 ?. N b( U! D
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4