嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
* b5 S% n" ~+ b* T
核心板2:DDR2 256M Byte NAND FLASH 8G bit
9 N# W0 l. [3 J
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
' {8 |2 i( T, r) P f& M
2 j6 e2 ^$ R' R- m5 n* ^" @
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) L" p+ b" S, R, F. x- w6 V: O
5 m: R/ E8 L Z% A- w
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
; `& k4 M& O5 v/ \+ I+ x0 H0 D/ n
/*
- U5 F' i/ \: V. V: Y2 H7 _
* Check memory range for valid RAM. A simple memory test determines
2 W( S3 A1 C. j" D( W2 x6 X) `3 g
* the actually available RAM size between addresses `base' and
1 j0 n4 _: W5 M% }+ }* @
* `base + maxsize'.
$ {. {& @0 L% f8 b" V# j
*/
9 H/ z1 q4 L! s6 a+ Y" `4 I2 ^
long get_ram_size(long *base, long maxsize)
1 u# ]1 H# A5 z9 a' g# u: Z' i/ o
{
/ E2 b% {* k& B* Q4 t
volatile long *addr;
# Y" G7 \3 |# }- {2 f9 k) y
long save[32];
* e/ z+ ?/ S" v( M, K3 c8 \! {$ n4 T
long cnt;
+ E5 h- W8 ~6 c3 L/ c
long val;
5 x0 A+ E! V3 B, f! F9 I' w8 p
long size;
8 c6 J4 P( O b+ |. T
int i = 0;
& v/ X. r' T+ R5 m% K
* ~2 F" F: J, J1 W2 ~% y% q
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
1 Q1 c' Q8 q# J1 y1 k; B
addr = base + cnt; /* pointer arith! */
( v( B" f! o9 u5 K+ t
sync ();
" V, U( n, r1 |
save[i++] = *addr;
9 F2 ?( m3 G, c2 Q8 C2 W/ c) e
sync ();
1 E& g/ _; I3 Y$ {$ k7 K3 A% f
*addr = ~cnt;
9 `: {; |6 E5 H7 Z
}
_3 Z+ d9 A6 S: v1 N3 z$ c! w
* q/ X( l3 z7 D' {
addr = base;
9 I" a5 i- H. b
sync ();
8 Y; n: g' C2 S% _5 N& y) k
save
= *addr;
7 h+ B3 B+ ^* B. }
sync ();
7 h4 \; H; c3 g- Z
*addr = 0;
1 I0 r- o# U" Q# c
) Y( @' ~6 L2 `
sync ();
! V" l6 ~* _# f$ r: ~ ?4 P: o( R
if ((val = *addr) != 0) {
9 R/ i. y) p. ~8 G g- j8 a
/* Restore the original data before leaving the function.
9 l9 F9 O# G0 @7 |, E
*/
+ A7 F& v3 Y6 ^. e
sync ();
# V1 z( N8 C+ a& G1 z
*addr = save
;
3 A* q* q- b8 ?) ~; h$ x9 t/ l9 i& x
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* p$ f' u/ Q5 c' i4 J
addr = base + cnt;
3 y- T1 s# ~6 M
sync ();
) P$ M/ X' R% P w9 O. F( c
*addr = save[--i];
, U# q |7 j C/ z5 w
}
' {9 S5 k" b2 n) M
return (0);
# G# {* u/ O3 j/ ]
}
- \! q9 L. t4 m' d* a
. q# f! U" E; E7 k- s
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( _& v$ m- s0 y# N! H g+ m1 f
addr = base + cnt; /* pointer arith! */
( N( S$ }. }4 D
val = *addr;
: M' B& l! G) ]2 Q; \3 K5 g
*addr = save[--i];
3 |9 G# _. x6 g$ E) X. ]' w9 T
if (val != ~cnt) {
9 Z+ Z3 r* h4 O
size = cnt * sizeof (long);
0 w! i8 h5 Z9 P. c, b( E
/* Restore the original data before leaving the function.
, ^' R4 B5 l! u* g3 _" N
*/
3 U1 |* } W9 Z% r, X# ?7 @
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
t8 M' @) \. C+ [, ^& \9 l
addr = base + cnt;
; c: @6 j6 c3 ]4 H3 k
*addr = save[--i];
. L8 v7 _$ w7 p. M: p% W
}
/ m- f) W3 L& R8 V4 {* @( o- g
return (size);
; N+ U1 n5 J/ E: E" p
}
' O0 q. p1 I0 ]( v: r* L
}
& N! W: ]9 b4 y& s* o, b
/ S) `" m8 W. M7 z0 N5 W
return (maxsize);
$ V" y+ _0 C6 B9 g( k/ k- {) v" ]
}
. L' N% }7 Q. |, i @
int dram_init(void)
3 w1 {: [4 E/ }/ w: X
{
" T; R5 _+ T2 W* R( C* j6 \
/* dram_init must store complete ramsize in gd->ram_size */
/ Y; H, Z( l0 z# c; i: ~3 h
gd->ram_size = get_ram_size(
: T) G( S+ x2 ^! _5 d3 C* d; _
(void *)CONFIG_SYS_SDRAM_BASE,
3 o. @4 z3 q( W
CONFIG_MAX_RAM_BANK_SIZE);
! x9 B1 u/ V5 z# Q
return 0;
$ J& Z* j; a+ b& K! O; f
}
& \$ ^3 z7 Q8 Z9 j
: w$ a' ?2 Z; k3 V; K
$ l# r, h( R1 @+ m; L: I
1 b2 }1 j/ O0 j9 l7 }) A) d s9 E
& W4 O* n- }2 Y A- _; D) M9 u
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 E- ?" @6 I8 M( l1 l% i# o8 r
/ Q2 x# u& C0 k* S& ^3 {& ^( _! o
7 i2 ]- u* R. G1 n
* U+ e* M# K* [: z8 G8 ^8 a3 a) x
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4