嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
8 J/ \% ~% C1 L
核心板2:DDR2 256M Byte NAND FLASH 8G bit
; ]5 g1 ]( @% S/ E7 w. \% B
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* K( x3 g+ b. ~* l" H
; s+ z7 d% h$ ^; l1 Y& F4 E
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' L! V, c2 _$ a: @
% Z/ n [8 X: f a" j4 A( J, C
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 |. n( W0 B5 ?4 Y; g
/*
7 R2 I( d( G# V$ z9 }/ y" Z
* Check memory range for valid RAM. A simple memory test determines
. S4 @. t$ z; c6 L% ^
* the actually available RAM size between addresses `base' and
2 E+ O& t+ D6 H- e6 K' R2 E
* `base + maxsize'.
8 X: b* D5 U7 P' D
*/
' a7 b @( L0 D/ J" I
long get_ram_size(long *base, long maxsize)
7 `7 l) y9 X3 K: k
{
7 H" ^' T) [4 F1 b
volatile long *addr;
" N$ w+ z5 Z# q f7 X
long save[32];
& i( e. t& l( [! @+ @
long cnt;
5 H) U2 K* h* c( |8 y
long val;
# f( q3 g9 l+ ~7 \; i G" C
long size;
8 g1 T# b1 t6 I; n+ r& @/ }5 z
int i = 0;
% ]3 J7 y7 k7 Q+ w
' r, _! u$ v; k
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
4 _: p# [9 O; V5 f5 \+ q% c6 W
addr = base + cnt; /* pointer arith! */
+ R' M: A% S2 r0 K, `" |( W
sync ();
0 v* Q; E, o& r: Q
save[i++] = *addr;
2 Z3 S- @5 P) M) |
sync ();
" ^" i$ U4 k3 z* o
*addr = ~cnt;
4 |( l+ v6 ~* V% C& T, i$ h# ?
}
% K$ ]1 M$ z0 M" |( Z
$ q: @" w- c4 T8 \* w; |
addr = base;
" C; A) k3 C7 m7 f N) }
sync ();
* `) Q& V* X2 V. u4 J G. ~) s0 R/ Q
save
= *addr;
) [$ k: l- p2 q1 [% F# Z
sync ();
X' _4 j' B# q7 M8 e& K G
*addr = 0;
5 L5 l y4 B+ [$ l
6 M8 N7 ]& i' G2 Z+ _/ \8 C* R
sync ();
0 X7 v1 y# q9 A# N w# Q
if ((val = *addr) != 0) {
+ F: B# R. j) o$ ^$ h/ r/ l; n
/* Restore the original data before leaving the function.
4 l$ V4 `6 J% P/ ^
*/
- M" i2 Y: b" @$ N% z
sync ();
6 |7 G q2 e; ?! O3 f- K
*addr = save
;
4 j! x, z2 N7 W
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( E# m* C& m% y8 o I
addr = base + cnt;
9 A3 R0 \# {, D* B( N
sync ();
) V x$ ]3 ` l# z7 ^; T ]$ b% O& U6 Y
*addr = save[--i];
' _: V% u1 z2 e: V
}
1 E+ R4 |3 b: A, j. z, i' o
return (0);
" E/ G- E# Q/ X) l. T
}
7 @) Y( f- t: a: X( o0 z% S# }
- Q7 Y" O% O# ]2 F* h7 c
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" {8 s2 p. C7 N+ ]% l3 X
addr = base + cnt; /* pointer arith! */
$ d" a5 D0 A0 Q, ` [
val = *addr;
1 n" O- ~. z! A% B5 l& c3 V: l
*addr = save[--i];
g7 H: {2 d0 c( b
if (val != ~cnt) {
4 j3 q5 D% P) x! R, c
size = cnt * sizeof (long);
& ]; o' h" Y; I/ }
/* Restore the original data before leaving the function.
# o5 W8 j- Z! ~
*/
. n* A% w: w8 z
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& S/ K2 q9 J$ i
addr = base + cnt;
7 s( m. ^+ {2 k {2 S( n
*addr = save[--i];
/ Y2 O) ~# ~* Q( P, ~
}
' Q* X& n, A# g% U
return (size);
2 l+ r" x3 e2 d% y. R
}
, s( n; o* s2 w
}
5 d7 w7 F! m" |
: A5 K; r! W& ?( m5 \) X
return (maxsize);
0 t2 G$ t- Z2 {" q
}
* ~% a9 q/ E8 \! Q5 k& [- `
int dram_init(void)
7 s' l% W. v& p3 `% |& g
{
- N5 I! h1 T/ _ a# E9 @% ? X+ n
/* dram_init must store complete ramsize in gd->ram_size */
' y& B- o' P5 t q, w
gd->ram_size = get_ram_size(
: J6 E. t. g% N8 C0 ~
(void *)CONFIG_SYS_SDRAM_BASE,
" E# |$ Y4 L. h; d4 Y; X
CONFIG_MAX_RAM_BANK_SIZE);
$ A" Z) ^" Q7 M! s" z
return 0;
6 f w9 u6 H% c. Q" }
}
3 U6 m$ q: _" K6 j& K7 n, D: P
3 ?* t4 g" L( K" a. e! D: Q
* d* D5 R T8 L! k
* C7 h- T( _: d5 y/ f
+ M, }1 k# Q% D5 I1 S
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- r1 B3 [1 h+ x6 `$ r! s, ~7 B
* ~# j h4 O Y! L" Z" `
6 `9 C7 F3 z! r8 b1 |6 C* T
' W: T4 Z- |) W6 o! ^
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4