嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
" w! a, P7 r4 b* x9 q* ~9 p# H: V
核心板2:DDR2 256M Byte NAND FLASH 8G bit
+ C4 S" L! T0 e/ }2 s
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& ]( k: M0 o0 |+ z: {
, o! {1 J, }' W0 ~; w6 u& k& g
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
, b+ V1 Y* w7 @1 T+ j
$ U X( \& {) ~3 {5 g. z
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
' q( N# @. U6 ^: g: Y, Q) W/ |
/*
$ A% `3 T6 b/ a- r
* Check memory range for valid RAM. A simple memory test determines
! z/ O+ F7 }* U+ i
* the actually available RAM size between addresses `base' and
3 W. k7 M% f; P! L" c* c
* `base + maxsize'.
7 J0 F" E; L9 e9 d* u, J1 C3 b
*/
/ u, ~; D* o( {% z# A
long get_ram_size(long *base, long maxsize)
. T) p2 j! Z- m% J' {& z+ n0 a
{
* X& a1 C1 E# I% `" {
volatile long *addr;
A' T3 F6 K' ]" \/ d- P1 j
long save[32];
* D, Q$ l( f+ ]% f2 @% b1 I7 E- p: ~
long cnt;
# o q' q2 F, h- M, _
long val;
, U8 H& ?: |2 H' G1 L1 v
long size;
! g8 b9 t! K' o
int i = 0;
$ p+ _6 {; v2 H7 n% c T9 X
. v! C, @+ L$ ?4 ]/ E p
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, x$ K. M# Z! D, I
addr = base + cnt; /* pointer arith! */
3 k( k0 i" B! n L. _# _" J. a
sync ();
1 [2 t' y" G/ i9 S; d }
save[i++] = *addr;
5 @. x" M0 q O* H+ |7 u9 P4 k
sync ();
3 ^3 c5 B3 ?; p1 [! R3 @
*addr = ~cnt;
) D; z, { O- K' ~$ \
}
! p8 _5 R" W O* c
: U2 i! j# e7 q' u9 S
addr = base;
' k, Y. B% T) i' R6 x
sync ();
+ |3 T+ ] O, [. D d5 M
save
= *addr;
% S: Z4 ?% Z3 Y8 A. Y2 W% Y. h
sync ();
' F) N3 I( H3 I
*addr = 0;
8 ~, q5 |% w+ D+ B2 p* h' H
. y' p, @2 z/ ?8 z& ]
sync ();
# |+ d* _8 s+ I4 Z0 y. @) H
if ((val = *addr) != 0) {
+ W% ?' U. z7 O
/* Restore the original data before leaving the function.
' x, ?* H( N+ o! }
*/
, }2 A3 o7 y9 ]9 k6 N" f! v
sync ();
# B7 i4 L% j5 Q' k% N6 k% G
*addr = save
;
: p# X! B: Y: I9 ]3 @' u/ M
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) Z9 @( n+ `0 `
addr = base + cnt;
- i( g' K! V! g8 Z
sync ();
0 V* ?9 `9 }( E3 `. S; \
*addr = save[--i];
( M0 \ ~, A) J; g+ {# z
}
6 b) I2 X! Y4 E0 e! g* `% |8 S# y
return (0);
7 T7 b x3 y. R8 I
}
& n$ Q4 |! e! v p# U/ _
# j4 \. Q: Y0 q$ a) p6 u
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ I7 A7 N: A$ S& j
addr = base + cnt; /* pointer arith! */
+ m7 @! y# N6 f( W! E2 E
val = *addr;
5 a+ E9 ?' O9 k+ \ c/ m2 ] T
*addr = save[--i];
/ \) t9 E o! `1 N0 l/ z
if (val != ~cnt) {
" d6 Z$ o6 ]( r) f9 E
size = cnt * sizeof (long);
8 P1 w# [, J$ a/ U0 u
/* Restore the original data before leaving the function.
: @, v* I# M' m- c
*/
6 I1 l% \. [ |0 E" T# @
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* {. O I6 x. e) l
addr = base + cnt;
# m# O. d' f/ X/ p. p
*addr = save[--i];
! {& I+ T# ?6 u; J4 p
}
! J3 K. V4 e5 a! L
return (size);
, q" z9 g6 E6 [! ^
}
, v8 e7 }4 J" f4 S( p3 W. M" S( Z
}
5 Y$ l# r$ H% C' _, ^
8 I& h7 U; U* W2 m C& O
return (maxsize);
$ \3 A% I4 Q0 v- y. e3 L' V
}
, e# t+ I' Y2 r5 k' `
int dram_init(void)
; z" B- Z! |2 \1 s& g6 t
{
: ^$ q9 p6 X. B4 C: _" {% c. d' W
/* dram_init must store complete ramsize in gd->ram_size */
/ f N% [5 A; @5 \" N2 _- L
gd->ram_size = get_ram_size(
- }, e) f! b( D& P! r
(void *)CONFIG_SYS_SDRAM_BASE,
; R$ @0 j: g, R `, E7 A! I) N
CONFIG_MAX_RAM_BANK_SIZE);
# e: v7 R; n( h; {$ M2 c
return 0;
9 ^1 S+ E* s o3 ]6 A+ A/ x, V6 G" [! P& t
}
. n, o: L/ V: b' \
7 W: i% f8 g. K1 l! k
) Q; Q% S0 I4 D- [1 u/ \
$ k+ C% m" J3 D: Y
( H$ X+ G3 |5 u2 {' D G
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& S1 n" C& ~6 O- @& ^0 C) q
, L- d* R- ]& k% L% h
) l+ ~9 R1 z4 q% I
0 I9 b; e" K; o" o7 y E( [
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4