嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
. a. l, `+ @7 D+ n; f+ n" K* q3 K4 W
核心板2:DDR2 256M Byte NAND FLASH 8G bit
; ?8 U0 \* Y- z9 ~: T+ V1 Z# Z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* g# n3 K3 L+ r# [& F
4 ^$ P, x6 V8 P7 }
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
+ y% b4 b( v+ K
3 c# j* L5 w" g" E2 f
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 `8 T p( B9 f' o
/*
8 A0 K( e) u4 c1 D7 W- Z5 A
* Check memory range for valid RAM. A simple memory test determines
( A% P$ Q$ n: y
* the actually available RAM size between addresses `base' and
/ w* w5 s( u2 y7 S
* `base + maxsize'.
. Q" A1 Q/ v& e/ d* d. l
*/
) Z. q4 m9 T4 T. U) g" g9 S
long get_ram_size(long *base, long maxsize)
$ F- T+ f9 U' Z/ I* {% C, b
{
% C0 i# W1 T: e! z; L
volatile long *addr;
^9 B5 @3 D6 R( f* V
long save[32];
" @ y9 p! n6 o& } i! b4 [
long cnt;
7 }% H+ Z0 g5 b8 v+ F
long val;
3 v4 M: t' p* x, M, w
long size;
6 _5 k8 y+ C' q7 ]' r1 ~/ f
int i = 0;
0 N+ N' `( k+ Z% u; ^
! m6 l. ~' n. Z* x) E
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' D9 C+ A1 p" p
addr = base + cnt; /* pointer arith! */
7 ~' L, ?) K# m3 S; r; a
sync ();
7 y' O# `) u0 {& P7 o, P
save[i++] = *addr;
! Y1 |: J) X5 M. n) X i. M# }
sync ();
/ {1 K: \9 Y: H! c7 W
*addr = ~cnt;
7 o$ m" N7 L( T" `
}
: P0 P5 s6 ]; `2 i3 V
$ y$ {- l5 }& H* m; [9 {- H. V
addr = base;
( D/ W3 H) A7 h. Z
sync ();
~/ f* e$ T- Z+ P1 \$ p4 W6 G
save
= *addr;
8 u X* S; ]- C; k, E3 X5 l: b
sync ();
6 a" r3 t- H: W
*addr = 0;
. t, L4 E9 X' @
8 k' x4 t6 P' L( r2 S" |2 l
sync ();
$ e2 i v5 }' f H, ~: e+ W
if ((val = *addr) != 0) {
! ^4 r' a- {% l& V g1 T- x
/* Restore the original data before leaving the function.
* w2 m. C( H! s
*/
' c$ n, C( m. R6 g% z5 n% f, i* z2 K
sync ();
" r' u2 l- [2 N# ?& g, J2 V |. n
*addr = save
;
4 Y) U2 b* [" j+ a1 o2 o/ S
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ s: x! t$ u+ p$ y8 C
addr = base + cnt;
* i! e2 q; [. U s/ x( _& L
sync ();
- \' p# o7 I9 m
*addr = save[--i];
9 i: j. D1 j# b0 m1 g1 o6 H) f
}
7 M9 w# E7 V, H" C! h' `' ]
return (0);
, p4 ?: `7 T8 L# f! v" ^$ I5 M
}
3 T2 z4 Z( L7 V; U; o
1 [: J8 v2 V' J, ?, k: b4 Q
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) B. L1 a/ ?0 h
addr = base + cnt; /* pointer arith! */
# S4 J% N8 t0 Y" B# ?/ s& V: J
val = *addr;
# i' W, [; g3 `' s( I2 k+ _
*addr = save[--i];
) I+ `3 N: g* L# C$ ^
if (val != ~cnt) {
. N% U/ `* T8 m6 s9 F7 k! _0 W
size = cnt * sizeof (long);
* D. @" Z5 I5 X$ _/ P. x
/* Restore the original data before leaving the function.
% x% g. C z9 i! {- h; [/ V
*/
/ m/ g; X O' B, \7 i7 l
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' [# ~) y. G- D& z& n- P
addr = base + cnt;
3 h# L; D F% i- N8 Z( R
*addr = save[--i];
! X" l6 y" j. l2 Z* l
}
! t$ O% L/ j6 `( U8 V/ U
return (size);
% { ?* |; n6 I" v, u
}
$ R% O4 J1 D3 s
}
" ~8 a' Q# s+ _- Z
p( K5 S0 v! r g( N
return (maxsize);
' U+ D, Z% o7 O2 I9 {
}
U& l! x3 F5 a+ V- L
int dram_init(void)
: d" t1 s+ o7 ?3 l/ ^" I. p+ ]
{
% G7 k6 a! x) N. }; e- n+ s
/* dram_init must store complete ramsize in gd->ram_size */
. ~4 Y# Z% U# x: r1 O7 s
gd->ram_size = get_ram_size(
; L* K% L) E0 a2 m' I# N1 W
(void *)CONFIG_SYS_SDRAM_BASE,
" v8 K! N) I, A$ o
CONFIG_MAX_RAM_BANK_SIZE);
. `3 r5 I& h; U4 d+ W) C
return 0;
; I# i. g, A5 O$ o* @
}
5 p: ~8 M. P: {! \
2 B( d) P% e' K3 G/ o4 |
. l( P1 n# w) T G, q( N
# I7 V" j9 K5 `' ?5 |* R! Z5 c& i
S3 o! a- E# K$ ]) S. b( F
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 r7 U7 K3 z' y0 ?0 f$ y( a6 e
" Y8 b" V4 c" K
* z# }) C' J! s4 X4 ?6 J d. B
# a; D6 w: F, k+ E p
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4