嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
/ k8 T9 s8 |' e+ X
核心板2:DDR2 256M Byte NAND FLASH 8G bit
- Z4 z d. d# @% Q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
1 J! }' I `! H, z' R1 w. h! O
; D K0 l; H8 m. j
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
5 s! b$ ] _; H. O* I
2 |: |: e8 w! U
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, d$ H. T, i1 p9 `( R
/*
& C S6 E ?2 y6 o+ R% m
* Check memory range for valid RAM. A simple memory test determines
, c& G' o: Q& q$ k: a- F" n
* the actually available RAM size between addresses `base' and
: ]& p: u7 |% I9 t$ u. S
* `base + maxsize'.
4 f1 V# V6 j1 c: \2 S! R: a
*/
. K6 e2 N8 G* g# ?, ]8 {4 A" J# `7 R
long get_ram_size(long *base, long maxsize)
) R; `7 V8 b1 K& r6 c
{
, A ?- K) X6 S, W# `1 w1 Q
volatile long *addr;
: h) f. s4 p9 H8 p" r
long save[32];
% h0 q+ a/ T& _( n' W$ S4 C/ u# N1 G3 z
long cnt;
, }8 v6 U# }$ v0 y2 s( |& R% t
long val;
/ x6 c! t1 e, c0 B8 k7 R
long size;
+ ]3 ~2 a! @; y2 Y/ A& p. l
int i = 0;
6 M: x9 N6 k* |$ z
! F+ c7 j9 B% d6 \8 _
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' o2 Q! @! ?) Z2 Y' `. H6 P3 D
addr = base + cnt; /* pointer arith! */
0 V; k4 s1 e5 O
sync ();
: _+ d& ?, Z. b2 O* P
save[i++] = *addr;
. R/ v. m2 n5 ~
sync ();
6 k4 O9 |4 l8 ?
*addr = ~cnt;
2 r$ y A4 o D" W3 @% `
}
( I" r+ `- Z4 i2 C- d
+ o0 R7 k4 L( ?- x- C
addr = base;
3 f, F: T. x8 W0 {3 f+ |
sync ();
/ b/ k/ h1 F: u! {" v6 [" y
save
= *addr;
! k0 m! U5 V- b' f4 H2 b1 B& h
sync ();
, l- M5 ~8 I: z; e
*addr = 0;
. b8 O# _, G5 C$ p: Q, K1 f
" x0 M8 o' M K2 L/ w, o7 c
sync ();
$ I0 r& q- ]: l! V4 [* Z
if ((val = *addr) != 0) {
' r( \0 {* ~+ t1 e" T6 `
/* Restore the original data before leaving the function.
# K8 _ \0 {8 Q' S U; X8 M
*/
( z4 R1 g( {5 K1 e/ d7 w
sync ();
+ A D1 b) Z: P9 C. m' o
*addr = save
;
- S0 d5 }4 f7 t0 G
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 \! A! k- b, v
addr = base + cnt;
2 I5 ]- w; j, b% ]
sync ();
M2 x9 e" U. y7 ~
*addr = save[--i];
' v8 B2 n; f# I: E" F" L
}
( H% q8 U M2 n: l4 v' ~
return (0);
/ s- f D& S: H
}
1 X- U2 ]' u/ \ ~4 r
* {. b" n: x2 V! a
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: A& n# o; h5 C3 e" V2 `
addr = base + cnt; /* pointer arith! */
8 I# ^( L. j& R; [2 ?9 `
val = *addr;
9 N3 y7 X$ ]# v. ]' V( w
*addr = save[--i];
1 |& C& `! N R2 e9 o
if (val != ~cnt) {
+ Z: @7 f7 }3 D( J- Y
size = cnt * sizeof (long);
7 o4 }( j' p* R0 \% x; @' z/ |
/* Restore the original data before leaving the function.
( `& ]% w5 w$ Y( `) e, D
*/
8 [' [2 z# |4 a D
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 Q; u9 ]7 o H% Q; [! u/ D
addr = base + cnt;
$ ^ R0 k. A5 l9 W
*addr = save[--i];
i- ^' w- ^0 I+ B8 f+ Q7 h. f
}
2 u ?! I* R( N9 ]9 G" H! N
return (size);
+ a2 L* _: Y) K2 G0 X
}
4 ?% @- G+ p% O' L1 y. R
}
$ C: u1 n7 g5 c4 K4 T/ Z
2 A {) N I! k r1 K) y
return (maxsize);
8 [4 u, w% j R+ S
}
- y! H: G, f* O' y2 u
int dram_init(void)
% O* T! @, h- D# ?
{
4 w3 u5 p; J! f8 H% V, i& X
/* dram_init must store complete ramsize in gd->ram_size */
% {8 F* H1 ? h, O1 w
gd->ram_size = get_ram_size(
* C4 _# f: F) h, S; Y
(void *)CONFIG_SYS_SDRAM_BASE,
- d0 [4 n# ]/ B1 E
CONFIG_MAX_RAM_BANK_SIZE);
7 s5 I8 y' p& X( s' r" Z9 E/ R' a" D
return 0;
. Q6 ]1 E, p. O# w9 Y
}
1 _0 W, L+ Y+ `, Z3 r% [) U
, ?5 G/ x+ h: y$ e6 C; p
% T }9 ?$ f" I/ K1 U
; i0 C+ r: I& j+ F! J. L
( n: ?5 d, O- b, T
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
9 U/ ^9 @4 E; X- A% z
) V- u2 B5 s! }; ?: H% _! q
$ S! D: A2 O) a5 E' C& ^0 T- m
/ {5 n4 ?0 c) g" l
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4