嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 G, P0 U- f/ `9 F8 E: Z
核心板2:DDR2 256M Byte NAND FLASH 8G bit
x/ |3 R4 G5 |- J* E
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
# }- b, H2 q" R# b7 o5 B8 j
# u, X4 t) ]( \' b( X
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 v6 c/ {5 |5 N/ U( u% n
- j8 G0 P/ p- \ b
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: n" v, P o8 T: [ o5 L8 K
/*
8 n9 q: l/ P3 L6 X! u; ^) [. i
* Check memory range for valid RAM. A simple memory test determines
5 S0 ~4 C3 C6 R% t$ h, O2 m9 h6 y1 D7 e
* the actually available RAM size between addresses `base' and
. T9 p8 T* G6 b1 Q. c) h; Z
* `base + maxsize'.
: e+ g5 m) l+ \. h3 v$ |0 m# k
*/
, ~% z7 U2 B$ Y, ^" ?
long get_ram_size(long *base, long maxsize)
7 H: [- ?3 y4 i4 O8 ?
{
5 w! M0 ?' Q$ ]1 h4 s
volatile long *addr;
& {0 `) [: v" h6 u, R. |
long save[32];
" k4 a" ~$ p# _. y7 }
long cnt;
# n: j, F3 s4 |) Y, E
long val;
$ X0 U C; n+ |$ T3 Y; q' I
long size;
9 ]& r; x* b3 g( B. w4 Q
int i = 0;
" u* t; e( F* {6 k8 D
) v+ S3 ^$ l- r, F( `
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' O* a9 @" |7 M6 c
addr = base + cnt; /* pointer arith! */
" F) g$ Y0 f/ r8 ]5 B! V- a5 ]
sync ();
4 U$ N: L! Q* Q" b5 p
save[i++] = *addr;
3 T6 _9 Y: ~3 V3 L4 [ d
sync ();
. o1 K1 X4 j5 k0 M3 ~0 c5 w! w7 S {
*addr = ~cnt;
- L' I' q; Y$ W
}
0 ]$ I. { K! C3 b2 \" t
& @7 O4 a' j2 P6 Y p8 q- u
addr = base;
7 {; E0 v# D% F' a
sync ();
1 W8 K+ P( j, {# [( E* r+ [
save
= *addr;
2 W; S" ?8 J' m: M
sync ();
# A: g/ g% f4 @% ]
*addr = 0;
9 F" Z8 [3 K m1 H3 v7 x* _
0 m" X* l. ]* I+ o/ g
sync ();
- \: x3 F! P6 g& M8 b
if ((val = *addr) != 0) {
6 W# r# _3 u9 P
/* Restore the original data before leaving the function.
# p8 m# I6 T L0 R0 u$ K. e
*/
6 S" x1 @2 d3 V6 ]5 r) M
sync ();
7 t$ g9 a% V1 c1 @, k$ Z0 Q
*addr = save
;
! H' Z# W) h5 \5 m$ u5 q
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 G& e- P+ v1 F
addr = base + cnt;
+ m' s. L9 y) g0 e& F9 Y) @+ D
sync ();
# Z# ~ ]( N8 R2 j& B5 @
*addr = save[--i];
$ C \$ E5 m, J+ ~) }7 v; a/ g6 i
}
/ u9 o3 y# V# c; _. g
return (0);
5 [7 m" n4 H9 y. x; d1 q" p
}
) ?% U# h: d, K8 | _4 Z; S
5 A8 G; q: Y" e9 |5 N8 v$ O
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; b8 L/ C) k) b( t# K2 [
addr = base + cnt; /* pointer arith! */
# ?9 q* W$ d9 N0 H1 Z
val = *addr;
) b! {& h5 P$ {
*addr = save[--i];
5 i R4 ]' t. ^, Q# ]* h, T0 ?
if (val != ~cnt) {
; e2 r& k7 A( s- l8 V8 Y, B- W
size = cnt * sizeof (long);
; _3 l/ t0 i; W+ @/ V7 q2 ~
/* Restore the original data before leaving the function.
7 ~( ?+ O8 z! T5 X5 ~& O2 c
*/
3 N7 o6 _8 U! Q& I5 a" Y- T
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
_7 q/ U8 [* b( e5 `9 p% l; B4 g
addr = base + cnt;
7 j) |, C1 R6 S9 {( w
*addr = save[--i];
: F: q( ]- q5 k0 }/ `2 W. {
}
7 y! J/ t W w( j7 [$ F
return (size);
7 L5 a* W. J( U) W
}
( k1 v7 b" C$ a
}
4 ~1 Z7 u0 l: ~4 b
J# A; q/ l" `
return (maxsize);
& t& j; c& L- G4 r& r0 H
}
] T9 H6 t* i/ V7 `) z- {
int dram_init(void)
1 }8 {# S- `2 }! Y" p( D0 G" o- X
{
2 i0 Z# Y6 @& z5 g+ g, R
/* dram_init must store complete ramsize in gd->ram_size */
& G$ ~6 e, V3 [$ J: ^+ S2 Q1 A
gd->ram_size = get_ram_size(
; g' e9 {# }2 T# A Q
(void *)CONFIG_SYS_SDRAM_BASE,
" p" e0 ?) C j: d
CONFIG_MAX_RAM_BANK_SIZE);
2 c+ G* o2 C) f/ u% u
return 0;
" J% L3 \* ]* e/ g" n/ h' d7 _
}
, W2 O o& d8 ~) e" H: _4 M+ E% g
m; h6 O# ]" i/ w7 P( {
, }3 O5 v4 d9 m' ]( `
! {6 _* ~9 T2 f. @
: e: u5 B& @9 q4 I8 T( c. G9 J$ H
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' b0 U+ t. }7 q! d3 ^" r$ L# L
' a- q- j/ p" A4 ?( ]
f) Z& _* n) R4 Z. [8 A: Q
- }6 F+ w0 e; `
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4