嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
5 Y7 v6 Y* _0 g8 O
核心板2:DDR2 256M Byte NAND FLASH 8G bit
% B$ {' ~* Z9 e0 u! Y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
( c# ?, R$ t; {5 b
' F. |! E1 M3 U$ e7 V
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) G% l% Y5 z+ @& U9 \
- x# Z! A. S9 G/ L
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 ^2 y) H1 a0 S2 d+ L
/*
" ]0 \, a1 w8 D* [1 l* |" }
* Check memory range for valid RAM. A simple memory test determines
1 ?. x) Z- D& s
* the actually available RAM size between addresses `base' and
1 B% Q ^+ B S- S( E
* `base + maxsize'.
. ?5 O( q" l/ z5 r* j' K8 a7 B# G
*/
! x7 q# C6 {; D2 L; J- A
long get_ram_size(long *base, long maxsize)
* Q' C0 K F& e0 V" H
{
3 X" u4 U& T0 a2 C9 T& a
volatile long *addr;
0 E' b6 k2 g% K, E' {1 D0 f( g
long save[32];
9 Z. c5 s9 F! K% c2 D* I5 Y
long cnt;
4 }2 c( @. o" U4 g* }9 @
long val;
/ O+ k* _, n% ]; v
long size;
# S s! X P" Z2 N7 ^
int i = 0;
' n& r3 v9 E5 H2 J
( L- O" p+ t& b& K# j+ W$ n
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( K8 ^, P8 U- |$ r2 l
addr = base + cnt; /* pointer arith! */
! N2 B0 V7 @7 y' m, I# z2 m
sync ();
5 \! `8 @; q. ~4 z' X
save[i++] = *addr;
5 Y1 |7 R/ |: X
sync ();
8 w0 [( D+ L' T% V- z. s; R/ c
*addr = ~cnt;
: q1 a9 D. C' M
}
$ n. Z/ d1 u3 Z! F. y) @
: q% D8 ^: I' X& P: Q8 ^7 G
addr = base;
: E/ p) T" P: Y. J+ m& Y+ Q5 ]
sync ();
4 ]% I( E8 ]* v5 F3 [! D
save
= *addr;
# O; s% N- c3 e# @2 _
sync ();
8 x- w0 }" d5 ~2 W" x6 a
*addr = 0;
* U5 L! b0 u6 C1 z. k5 R
. }* f5 Q X/ h4 c C
sync ();
3 H& K6 f, L* Z. ^$ l
if ((val = *addr) != 0) {
% D, X3 o* Q6 }: w1 b$ K
/* Restore the original data before leaving the function.
$ X) p3 w4 Y) f! H; I7 n
*/
2 q' Y J4 @, L" k) W3 m0 G# s) B
sync ();
, M8 j7 I1 j5 [3 g- E
*addr = save
;
# H1 i' I/ X; Z0 x$ Z" }4 ?% R: p
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. x* M( c7 ?. P+ \
addr = base + cnt;
# y4 S8 V/ v5 O
sync ();
/ y6 Z. n" s6 K! G& D/ T/ h
*addr = save[--i];
, C4 I- _% q0 S- G; l! w2 P0 ^, P5 Z
}
. F3 y) u E5 y8 b n+ E
return (0);
/ S* f+ H1 j6 p- d7 y( Q
}
6 c, r! f9 m6 A( R" Q+ g
' n% E/ t2 \3 @; m
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, B# k, n- P& ^+ h4 D
addr = base + cnt; /* pointer arith! */
5 Z4 U3 X7 i2 ]6 r* i6 F' _
val = *addr;
) P1 V5 G9 }/ H
*addr = save[--i];
. X- y5 E5 P% V0 z* h
if (val != ~cnt) {
, m% F$ o/ `% Y6 ?, z9 M
size = cnt * sizeof (long);
( n5 @9 T) u2 p9 A7 Z, [
/* Restore the original data before leaving the function.
3 z9 M( R% G) C+ c; F
*/
6 Y3 w' n3 { V1 ?
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 B; ?- B- R' F" u5 S0 D4 F
addr = base + cnt;
2 t* n' D1 I7 q
*addr = save[--i];
' K: u7 y8 w- R( H
}
5 {: S5 i1 M( @& Z# l, [, R9 K" x% G
return (size);
2 I7 H- S1 e3 s& Q4 i- }
}
9 B8 T/ D7 h4 L5 k$ Y1 m& h
}
& ?' b' A4 b- R- S- x; {
0 t3 u) E0 s6 I
return (maxsize);
' n0 e9 ?0 R2 C9 J y9 Z
}
7 L3 U5 o' b: I1 k+ V& A
int dram_init(void)
4 G A E2 Z ^4 X+ C- M( H
{
5 w: n' x& v* t
/* dram_init must store complete ramsize in gd->ram_size */
; ]7 `. M+ f! b0 N: k
gd->ram_size = get_ram_size(
; `7 g% `) t) b8 M4 }% o
(void *)CONFIG_SYS_SDRAM_BASE,
4 _, `& [) y5 L( @: q- w
CONFIG_MAX_RAM_BANK_SIZE);
9 G6 Q( Q9 w, v8 o6 r5 E
return 0;
l1 ~2 Y* z# ]# Z) c: s$ D7 x
}
, r9 G/ l1 z( l0 X$ w
4 U" x7 X9 {" L* H. Z+ b
1 d' k# Z* W6 g
% F% E% j; Z( m. W/ s H- z
# N0 W! \8 T) ], [1 J% i9 B( S0 @
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" V& B8 G. h, ^: _, E& f
1 o% D u3 N% Q& { P. s2 @5 t
0 X: c9 u+ _) N/ k& f+ {; n7 U
, U2 {9 W4 |- c. m
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4