嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
5 a0 k# c: P1 P1 }9 d, l
核心板2:DDR2 256M Byte NAND FLASH 8G bit
) C i. O% J# C M) s( C7 c+ G8 \/ z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 ?8 H( I' `: Q
& U0 Y+ } ^; K
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
+ V4 x) s6 d1 T9 F
0 ~9 z) s% e7 ^& y* R
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& P9 I+ B6 s2 Q' p1 [
/*
, Q7 k3 Z; \3 L) X8 r6 E- S
* Check memory range for valid RAM. A simple memory test determines
0 c" F% \7 N6 K7 H& n- \
* the actually available RAM size between addresses `base' and
7 U2 {; F- h. {* t9 Q# f
* `base + maxsize'.
" f4 m' S: K9 c0 J, @5 i
*/
% h% s* ~ {$ l, | E, ?
long get_ram_size(long *base, long maxsize)
* c$ `; j' w/ K7 M! e* `/ [) S, o
{
( S6 K& o0 ^0 L- K4 ?" p4 {0 s0 r$ R, C
volatile long *addr;
3 C$ n* E# ]7 X9 F" v* K3 b
long save[32];
! E5 P/ L+ \. b
long cnt;
' @2 {! ~- V: g, f9 E
long val;
+ K# U7 `: J4 M4 Y! e, Q: X
long size;
: g9 y9 ?' J' u! ?/ h7 k: l) |# Z
int i = 0;
7 V; s6 I. U" k# r; Y
( Z8 D( X0 N- _1 n/ ^
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ }' {9 \* F5 t2 c
addr = base + cnt; /* pointer arith! */
/ c+ {# f. y2 ~$ Z8 r. a# ^
sync ();
. \7 z. _ Z* }0 L( R
save[i++] = *addr;
5 \! x: L' Z& k, w1 N6 p8 Z
sync ();
! o; [$ _& H. R
*addr = ~cnt;
# L2 ?3 h) f* J
}
5 ]* g9 L& z: a1 Z& U) W
" h1 p9 j `6 j7 T: W, u/ n
addr = base;
5 q6 a% v/ C: E( l2 j. O
sync ();
, D$ ?( V; n. N% ^; V4 ]
save
= *addr;
O- t+ S$ D5 C7 ]5 n
sync ();
: k4 P, \/ J1 T
*addr = 0;
; \% S3 {, F7 ?' r. g. G1 \
. p" l( ]! L1 l5 i
sync ();
# S+ ~' |: I. p' _
if ((val = *addr) != 0) {
' R7 L" T* j7 L
/* Restore the original data before leaving the function.
~2 u) ^9 q! _' L6 p0 W
*/
8 M5 o Y P7 O/ a5 ~; D
sync ();
: f3 S" A, N4 N3 A
*addr = save
;
, a. V* I8 p7 Q2 k
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) ]5 p5 H( |# ~' G: H
addr = base + cnt;
4 U3 u( O n/ t3 _7 w/ c
sync ();
; i+ K! l: z+ _" `. w2 c1 e% _
*addr = save[--i];
S h" D$ D8 o8 w& H$ a6 |! O: a
}
0 [ _7 H# k a ? \; c, Z
return (0);
+ W% f5 G; u" Y2 Z7 k
}
. @6 s* x& f7 [& m
; B. i" I4 s! N) K1 s
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ p, t# \/ n1 b9 i% C2 k* J0 A' ]
addr = base + cnt; /* pointer arith! */
. _ k5 f. `' e+ f8 r( ?/ \: {
val = *addr;
; e5 i3 X" K) R. n$ E( W
*addr = save[--i];
7 m; S" E7 m6 o3 Y! D# t1 L$ O5 Q
if (val != ~cnt) {
/ I) z! r% N, J9 t% T( V
size = cnt * sizeof (long);
. n2 m7 m: Y3 f
/* Restore the original data before leaving the function.
8 d& M* z s# b! c1 J2 z Q
*/
( W; Z2 G4 x8 {0 g! Y
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 i8 K" Q; e. t r( @/ s
addr = base + cnt;
j. s0 M+ E- `' L$ v9 F" L
*addr = save[--i];
; \) X* |1 G5 D" ^1 h$ b
}
" o" ^$ M4 a2 f
return (size);
3 z& ?8 r+ M C/ c$ b# O2 d
}
) }# s6 U& ~- F+ f2 ?. t9 } E5 u1 @) Z
}
% c: a x+ e' E; n/ ]# I6 Z4 X7 Z) e) h
w. Y5 D9 T4 J0 `
return (maxsize);
" S1 e6 L9 B/ D6 U! y
}
1 x% y- P) g- t0 `( _# V0 d0 u0 L
int dram_init(void)
# v6 Z% z, p" q: x/ S4 z+ k
{
5 e& T' P( i# J, B
/* dram_init must store complete ramsize in gd->ram_size */
) i, v4 j4 j) B2 G9 p5 {
gd->ram_size = get_ram_size(
+ }2 r& ~/ ?! r; L& u
(void *)CONFIG_SYS_SDRAM_BASE,
& u @- `# ]3 d8 m4 ^+ ?9 z
CONFIG_MAX_RAM_BANK_SIZE);
9 D' g+ o8 g |* t. Y
return 0;
3 ~; B1 F! R; X4 C
}
: y+ ?/ I$ a+ |7 |6 }
( }/ }- D3 g; A5 T Z2 W/ _- I
: u: J$ e7 }- V, ^! k9 v( J
3 z( t0 t, b3 J4 ~
5 {% ^( X9 t4 Q% i+ H; d
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
! p* i( K% c) u! b2 H$ n
3 C6 T! S5 ^' u5 J; q7 d# k N
" z6 U" F3 U6 ~/ m/ Z" Z% Q+ a' b. r
5 t" o: @1 `; V' \
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4