嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
# R' N: t. `) r5 c6 o
核心板2:DDR2 256M Byte NAND FLASH 8G bit
5 a: U8 c4 N6 S1 M* p) o6 |
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
~) {$ d0 F( Y/ x+ A' O4 Q" l4 T
+ a4 ?- x/ z3 W$ f( g. d
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) E- X, G# ? {' M4 t |
. r% N/ Q1 K) x- i1 }% x
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, r/ |$ m% u+ O2 `) |$ g
/*
4 X& N8 @$ {2 b: J0 j" E
* Check memory range for valid RAM. A simple memory test determines
( I# b# a7 Q" m i4 J
* the actually available RAM size between addresses `base' and
5 A* l4 }7 C! |0 R9 n9 y
* `base + maxsize'.
' f2 M; r/ ?3 [( _- o; l$ o
*/
; F, q. \8 _" ?9 D: h6 }; m
long get_ram_size(long *base, long maxsize)
0 i; E; d: U* a
{
k" c- s4 l( F; V
volatile long *addr;
. c: Y2 g ?7 z. e( |0 E4 x
long save[32];
' Z( I4 e1 O! o) d$ K) J0 L! ^
long cnt;
+ ~; j, G# V3 D" E% W! o
long val;
1 J: @6 Y& _; w5 T- u' l
long size;
' J0 x% l+ y+ x$ X* }
int i = 0;
# c. E I2 p0 I+ t, b" k* ~. g
+ b& y/ q- U. c$ ?! [9 Q6 @ B
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( O ^. w1 e! H* {4 m% V
addr = base + cnt; /* pointer arith! */
; N5 i! T' \) N `; m
sync ();
! I* l: O9 v, {' g& x
save[i++] = *addr;
( a1 @2 f$ L4 v
sync ();
& z' |0 h1 P( i t2 S7 J
*addr = ~cnt;
0 |; c3 X. b0 t6 X
}
+ K N; ^+ T ]% U+ R# z6 N: c6 [
0 k& x, X: G! J E" z2 \
addr = base;
( Q- }- V3 r+ A
sync ();
+ \9 [4 q% |% `1 X6 f* F6 W
save
= *addr;
* w3 h- t, A `8 j3 R( D
sync ();
7 j1 J5 c/ c+ m" g. c; D/ z
*addr = 0;
8 I0 T' _ R1 u' L5 c5 L3 g" `3 {
8 a/ ~4 U Y5 J+ G# w- k
sync ();
/ ^/ Z9 L! a. X, x3 T1 M' Z2 o
if ((val = *addr) != 0) {
! Z+ S5 q# d% ~( A) Y6 s
/* Restore the original data before leaving the function.
7 u0 |' \ l! q/ G& J# d
*/
+ i2 t* m1 {. U- p& z1 a9 z
sync ();
% g& q0 ?( Q1 y+ V
*addr = save
;
, ?( Z9 z. O4 r0 S4 q" x
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
G8 [# P- F& c
addr = base + cnt;
2 k' I' [- h* X* ?% K2 W
sync ();
$ C4 I9 [7 l- ^1 a! n T
*addr = save[--i];
- g/ |7 o' `# Q/ X/ d
}
5 J+ e/ }0 N1 Q8 ^
return (0);
r9 ^0 r3 E4 P* j7 j% S) K
}
+ I! M4 P5 W- D+ T
+ |) _: n g9 f) d$ G6 n
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 L& [+ R+ x8 s
addr = base + cnt; /* pointer arith! */
% N5 M+ f3 g# K4 Y3 a! c
val = *addr;
& `% e, x' K1 g. ~3 `
*addr = save[--i];
: V# q' a' m) y' a5 x; p
if (val != ~cnt) {
) ^* j! c; J9 s6 r
size = cnt * sizeof (long);
; c5 ~, ~/ v4 R+ n+ p/ z" i+ @
/* Restore the original data before leaving the function.
# q& M# i7 Y# q2 n, L1 ^
*/
# k y; y$ a' u& o- v. ~
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ E5 b9 I5 r; F$ o+ D
addr = base + cnt;
$ n5 t0 e5 |! {
*addr = save[--i];
$ F1 P4 J) p; J1 d* A" [) Y0 i
}
. t- U' C n Z- J Y. J: k( O4 ^
return (size);
+ u9 w& c7 y3 G' d ^7 u
}
1 w% H5 u' x4 b K
}
{. g, `5 Y2 h. s4 ^* n/ b2 T
+ { V; c9 A8 ^
return (maxsize);
. a$ z+ i$ C8 s+ L+ Y* v( E
}
! l9 G) q R% m: s& \
int dram_init(void)
# v. D8 \9 a. W/ C
{
' g7 t3 `$ a* n& X# y1 ]; F; X
/* dram_init must store complete ramsize in gd->ram_size */
& @" |% Z: J0 f. v$ @
gd->ram_size = get_ram_size(
) o+ a5 I/ m* p& W3 Q4 Y+ c! v
(void *)CONFIG_SYS_SDRAM_BASE,
: N& s( c) B7 `% ]
CONFIG_MAX_RAM_BANK_SIZE);
- I6 ~# V1 d5 s3 r) k
return 0;
7 j1 L% y: r& x; u+ W
}
8 H) u- b/ q1 F+ u
: d7 k# S) i! [4 D U, s
* Q+ L9 n/ {; M% J
3 x% t9 O* @% L* c- J0 J) g
( ?9 R2 r' Z+ w/ H* h
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ [% i S4 {6 p
5 L5 W6 Q2 r6 f8 H, V: \# `
& ?. f$ Q5 j, a$ Y* ?
4 J* h& @2 V) P( b9 r
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4