嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
* V w3 P% | \, F/ z+ e/ X5 N
核心板2:DDR2 256M Byte NAND FLASH 8G bit
: C3 M3 i/ n5 {3 `- g/ x5 m. y Z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 Z5 a' s0 L& C+ {/ Z$ L+ u R8 c
% G# c3 d8 @& g, N" A% n) l9 U$ q
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 t( e! V4 ^8 s. U+ ^& h( I* r# @
, y$ d, h! }) G0 h* b7 l; U
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ u; W6 A4 {. i% p/ b1 x9 @
/*
! |3 n% F* [4 E; ]7 r$ B& C
* Check memory range for valid RAM. A simple memory test determines
; K+ w) ^$ Q# U5 W
* the actually available RAM size between addresses `base' and
" l% q$ w0 ^% k. x, _0 w3 I
* `base + maxsize'.
( f4 o$ T8 J. y) p. R. \% x
*/
* G# _/ ^2 J, |3 @4 X
long get_ram_size(long *base, long maxsize)
$ Y5 }6 s' x! R+ j
{
) J' ^$ {# _7 j1 ~
volatile long *addr;
( A0 D5 {# l9 y+ R
long save[32];
" A- p# s, v7 p9 y
long cnt;
5 R% C) y. a; L0 m/ F2 ]
long val;
8 G8 ^$ k, L* \( P, Z, `
long size;
0 O% K) P% b( ^; F0 A
int i = 0;
/ D- Y3 t" F5 [8 ?0 M
0 I c* I5 r0 }! x2 ^0 ]2 C
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% ^" e0 W9 I3 g
addr = base + cnt; /* pointer arith! */
! K# U# L) z( S' ~) ~0 h
sync ();
- i; y8 D) f. _' e& \% G
save[i++] = *addr;
: \4 t- y, e l7 V
sync ();
7 T: d% H- v0 x: E7 G/ W; |! T
*addr = ~cnt;
* {$ C0 [5 `' F: B& y+ w
}
5 F4 e3 b7 D& X& e
% D3 D5 t1 v7 Y8 x! k/ V
addr = base;
3 Q9 k C7 M% Q
sync ();
+ K; _' j- k3 D3 K2 n3 p( H) y
save
= *addr;
; ]1 d% }1 Q" g' ^; l3 J
sync ();
: a7 }2 g/ G, y i: y
*addr = 0;
2 J, D& W8 G2 K' b( R
. \+ r8 n+ D$ a
sync ();
, ^! V/ B) }5 w! t7 h
if ((val = *addr) != 0) {
2 v& P: i3 r- v; v3 R
/* Restore the original data before leaving the function.
" s1 u: m7 o# l c
*/
9 ?/ b! d* V5 H) D: N4 V
sync ();
! ?+ z6 w; n7 U; j* Q8 v9 e( F4 D
*addr = save
;
( V' s6 z1 u) }5 c: m0 ^
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: P+ d& t% F" B1 J3 Z' ?
addr = base + cnt;
1 q( U4 ~) o2 D* y9 c: x; Q* }! K0 K
sync ();
' T$ n: n; S8 M. c }
*addr = save[--i];
8 C; w" c2 @1 a! B' y0 n. ]2 V6 X
}
/ o, C5 ?1 v; A, j
return (0);
! l2 p: ^: j$ s( y2 P& G
}
. ]0 W) w! S) y7 A$ h8 {
. E% F3 @- L, c& r4 {) V4 w
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 H b$ b! n z& b' t# ?) r
addr = base + cnt; /* pointer arith! */
5 ^8 U, A, y( ~+ T0 U, H$ D
val = *addr;
. S. @! z: ^7 o* A7 G6 v0 S
*addr = save[--i];
0 x F# h/ P0 I5 z; b5 F
if (val != ~cnt) {
5 J* X- n: D( z$ L: k* }
size = cnt * sizeof (long);
$ J2 G9 k$ I$ N6 C/ t0 N" n) t
/* Restore the original data before leaving the function.
* B, V; ^ i2 D2 u t/ @
*/
0 J7 k1 J4 M+ D1 O* u- r
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
U+ h% k( O& g; r2 M3 ~- {
addr = base + cnt;
% ?; ~( ^* K% B
*addr = save[--i];
6 Y# _5 X; f3 O
}
3 U \$ ^/ v) v0 B# W/ C4 Q
return (size);
: K3 X2 ?: ~7 ^1 K( ?# R
}
4 a) `1 p5 a Y0 A0 S: w1 F
}
( o( I( l. k% U0 z& u! b1 i2 S( O
% |2 F) d" x" D$ o5 V; `# H
return (maxsize);
7 h& @3 q$ C" }* U
}
2 T3 }) \; e9 z# o0 N& Z
int dram_init(void)
1 r2 T O8 t2 P# {/ `' n
{
5 K8 D* Y" {6 V! ?3 b( ^3 V- T* \
/* dram_init must store complete ramsize in gd->ram_size */
! o! H" ?: O1 j% o; e
gd->ram_size = get_ram_size(
# g; b! @. J* \" f2 M% b
(void *)CONFIG_SYS_SDRAM_BASE,
- ~! U6 m) z+ D& t! {0 j4 s
CONFIG_MAX_RAM_BANK_SIZE);
" d( X2 d& d1 o9 W* Y2 T1 e) r
return 0;
. A; r' I) f9 z+ O Y
}
( |$ C- E( a9 ?4 F8 e/ x
8 W" [: }9 w" G) T/ k9 J" r! C: M" F
; S* Q/ ]1 M5 ? i' E; w, d& j
+ n4 N) e+ C g2 r4 O
% b. q5 f( P" A6 ^
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 @! f4 i& E9 G5 `
/ n# w: Y8 D, \2 C$ R8 H
0 X4 H- k. X' @" S
$ V" U3 |8 O; j* T9 Y: C. ~3 q3 Y m5 W
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4