嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
9 W- {( _/ K7 C8 O: s) h2 T8 q
核心板2:DDR2 256M Byte NAND FLASH 8G bit
! ?+ B/ _0 ]3 i E5 p2 Q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, W. @6 T w0 Q) Y4 B
) c1 E9 y3 v3 g3 |2 j2 v: E% h
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% K+ m- N! j1 n/ C; r5 O
9 m% \5 y; m6 p
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. [: O; V+ k5 P7 ^
/*
4 T4 C# @' ~3 V# L D0 o
* Check memory range for valid RAM. A simple memory test determines
1 b$ ]3 A6 ~5 R( V, v7 o. S
* the actually available RAM size between addresses `base' and
: N. U4 G1 @0 e4 {8 q
* `base + maxsize'.
, M" o0 Q j2 B2 Z$ \: U @
*/
2 o1 _. Y9 C! _9 |) h% s
long get_ram_size(long *base, long maxsize)
- [" e# w; P+ `: p' F
{
, @1 I0 n. f, _. u9 p* }
volatile long *addr;
, _! S, g( _, D! L
long save[32];
6 H! h; M; a- n) b1 e
long cnt;
! s, y& Z9 n$ b/ z1 g& }2 T9 D' v1 y+ ]$ ^
long val;
* z/ B- W+ Z/ `" l0 c4 p: `
long size;
`' @, ?1 t# t" b& ]
int i = 0;
0 f9 G) L3 _8 e1 k: ?0 V+ J
! m+ }" P ]9 ]1 x* y" i
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
V% l) J# X% }0 d9 p' e d+ r) w
addr = base + cnt; /* pointer arith! */
3 O1 L$ b- d, I: X+ c
sync ();
$ J+ s- ?( o: J4 u4 @/ M* B E
save[i++] = *addr;
, W9 ], Z& e, g
sync ();
. r: P# y2 z9 H( c7 z
*addr = ~cnt;
0 K- Y0 l8 L( n2 s& h. r* X
}
; t( ^0 c6 l" \' z
% O7 t [3 L# H: o
addr = base;
. L- \% H( F' `1 i, p
sync ();
8 i" J& L) _1 S$ s2 B0 X
save
= *addr;
' x' O, w) F/ {: p
sync ();
) r7 l9 Q! |+ L( N# }) C D
*addr = 0;
1 Z5 |' t7 D0 q' i) F, K
4 E! G, [/ y9 K! O6 |2 E: J
sync ();
. U4 N v( N2 h' t) Y) k# @
if ((val = *addr) != 0) {
; }# r/ d. B* P4 ^; A* I3 D% g
/* Restore the original data before leaving the function.
+ t+ J5 ?3 @1 T# ?3 s
*/
. A, v& ^+ [9 L
sync ();
3 |/ `& t0 ~- n9 X% c
*addr = save
;
' c# ~& X+ e, y6 T
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
" e2 ^3 ~5 }3 F# L
addr = base + cnt;
! k3 z- A4 r- _0 q4 X7 G
sync ();
. e3 z: _" Y7 a8 e k/ S
*addr = save[--i];
2 ]9 ~3 @' Y( v
}
' U* c: o6 W$ V* t
return (0);
9 l `. O4 N) h: q7 C1 c# \
}
5 ^ M- p2 Y1 K! C4 |9 U; n1 j
5 Q' {, l0 P* [6 I4 p/ s+ t- {* n
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' g, C W7 G; N7 X. D
addr = base + cnt; /* pointer arith! */
. D& _0 |# Q) Z& o \3 N1 H
val = *addr;
0 J) V. u( U, P" }! B5 |
*addr = save[--i];
T' A3 B t* s: f% H G. F
if (val != ~cnt) {
4 Q: L' m4 X' W
size = cnt * sizeof (long);
5 W% B* v. ^; X8 l: }$ W3 `
/* Restore the original data before leaving the function.
. p" w: M; ~4 @7 G+ N1 u
*/
9 n3 s7 V8 e) z4 {8 e9 O9 P
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ U- @2 G( i& r1 c
addr = base + cnt;
1 j. J5 @; I& L" d9 s7 n' E
*addr = save[--i];
4 q9 O8 {7 e1 Z& X: \; t
}
. n% N! v# S. a+ w1 h1 }5 E) e; Q2 ~
return (size);
" R1 Q) ^! v$ Q+ i, }' ~
}
+ G; i. d! W: y W: a
}
% X7 l1 [3 @, \( ^7 Q
: ?8 w, }$ ?/ ^! l
return (maxsize);
3 w* P0 u5 x- D9 V: `
}
; i1 q( G! ~3 {$ m0 n. `+ Y
int dram_init(void)
/ ~+ s4 E V6 u" s
{
0 A. }7 v* i5 I; C% h9 Q
/* dram_init must store complete ramsize in gd->ram_size */
, B+ K8 b h: E" g s2 m% C
gd->ram_size = get_ram_size(
( L& d- W' K9 ~/ ?
(void *)CONFIG_SYS_SDRAM_BASE,
8 D- S' \2 z% D: s% C! g ] n+ F
CONFIG_MAX_RAM_BANK_SIZE);
/ ?3 j6 X% A1 Y0 }/ c4 z
return 0;
" m# }' W7 g, l; a5 {6 {
}
* X8 X! D5 H& s6 T- v; d* X
! ]3 O1 r4 g( }, p
$ t% G1 t3 Q: ^' I% Z
1 ^% j: [7 j2 R9 P
" e( H* U) @/ t, W3 i* ?8 y" c* h# I
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 M7 }% q6 m* o
& a4 v+ y, P1 X. J
/ v a& e* S9 R0 ^. L
) H# N6 J5 e( }
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4