嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
5 T% B I" u; ^. ^. F8 p. y
核心板2:DDR2 256M Byte NAND FLASH 8G bit
' D- S. e; b4 q2 P+ ?9 x
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
$ f0 _. w# ^- K& G2 s: t& G% G& V
1 f" }3 ?1 f* I. z; |
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
9 K M+ Y% x* B5 g5 }; f
' A' \! j3 X% f9 I2 |4 e& f9 K
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: Q. T% A$ M& J3 o* `1 P4 S' G6 @
/*
4 p0 P0 V. p1 B6 y# ]8 m- D% `/ C
* Check memory range for valid RAM. A simple memory test determines
; R+ s9 R. f( U- ?1 P
* the actually available RAM size between addresses `base' and
" X5 E% C/ V# k7 N
* `base + maxsize'.
5 Y0 M7 \; v/ U$ Y; U$ L
*/
3 O( d' L, K1 ^4 I
long get_ram_size(long *base, long maxsize)
+ _. r' u5 y1 }4 D9 I
{
4 A7 j* t n9 [+ d+ G N- U
volatile long *addr;
7 V" t2 i' s& Y. E3 J( L; |
long save[32];
* G- W/ ~# K8 e1 f+ E/ y
long cnt;
7 {2 d. \5 S/ t0 s
long val;
# `3 E5 \ B* M7 h7 }" v2 j( c
long size;
" t8 B$ g+ |$ i2 n
int i = 0;
1 K: s* R5 O7 O- J) J
1 n! B: G0 F/ k( E3 C+ o5 f$ [
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 Y; s1 @0 ~! f2 ^8 l
addr = base + cnt; /* pointer arith! */
, ~5 K) R# j- U2 Y Q. G% E [
sync ();
' Y2 x7 L8 ^' u+ L0 h* n
save[i++] = *addr;
8 h0 }/ a& O5 S5 |' o$ f' K% t
sync ();
% S9 d# }3 b$ b+ s
*addr = ~cnt;
; Z' g6 u6 F q3 i! `' T& ~
}
9 X( D+ p3 o5 z6 G6 A( J: h2 L
; a- N5 R4 S% `/ D
addr = base;
. G0 G+ J* j4 r
sync ();
/ ?3 i" z3 V. H) }" [* U, S
save
= *addr;
# {7 ?% H+ }: v+ y
sync ();
' ^; n2 u D5 i# x+ U' G% A
*addr = 0;
! p0 d6 ?2 K1 S9 s8 x* p7 u
) ?0 {9 I# K9 y( @3 D+ U8 f4 L3 @0 W
sync ();
7 s5 L% o% A/ v |' J: ^
if ((val = *addr) != 0) {
9 G7 N0 P! X+ [5 e8 a& |7 A6 r( l
/* Restore the original data before leaving the function.
9 S* z: Q8 Y/ @
*/
" ^& M) W: N. M P; g1 }
sync ();
. N3 @( ~0 A7 X, ~, Q
*addr = save
;
4 S% \+ m( I7 K
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ Y$ H; c$ c: V3 G
addr = base + cnt;
7 b; _: G" X" Z2 P& f4 i- Q
sync ();
( r* Y% s7 v/ M$ }. Y
*addr = save[--i];
% u/ B$ `2 C3 Q# I
}
. _+ d. A5 X- k3 n7 I7 G6 u {; u5 C
return (0);
9 G' L* Y' @! N
}
7 l% u6 A9 r0 s
% V: j' [6 ~* {& d, w
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 m4 d8 e6 p9 N0 [$ y/ k
addr = base + cnt; /* pointer arith! */
! j" n F- G' ? \
val = *addr;
' y* P9 G7 i% |5 ^
*addr = save[--i];
9 A# E+ S* z+ Q4 z6 u, d
if (val != ~cnt) {
; }9 u2 t* `0 u. c% x
size = cnt * sizeof (long);
2 p @3 t3 m- W/ {2 x
/* Restore the original data before leaving the function.
3 i% i3 G3 L0 I/ `% r
*/
* x, [9 }8 Y" E; A* r
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
N0 M2 J% E+ l* E) u
addr = base + cnt;
! J5 y# g1 l& J2 T* y
*addr = save[--i];
6 N H" K1 o0 v; ]# q# j
}
" W2 i s# Y6 E2 B* v/ ?: z
return (size);
: c' I5 }5 U6 S; |% L
}
Y! p& A& `: H2 c" o3 K" h
}
/ S+ ? q) L! K) J
) L# U3 \" a* z" U+ d; M
return (maxsize);
: ^% }: d. W/ c4 N) V( U( \
}
1 R& |" U( O. J! ?5 r6 \1 r
int dram_init(void)
9 J( n' g5 l I" ]4 a, d( H
{
1 Y8 ]: W3 H: {; {4 `
/* dram_init must store complete ramsize in gd->ram_size */
* K2 O5 R w M' i. f
gd->ram_size = get_ram_size(
& W' q- _1 V& w+ `/ {. _5 M
(void *)CONFIG_SYS_SDRAM_BASE,
/ `1 T6 N0 o/ `" x
CONFIG_MAX_RAM_BANK_SIZE);
* o6 K8 X* g" e' X, C& S9 U
return 0;
; }+ f( e' k% X& M
}
! R" F2 L" @# w' b* e' q4 L
. x" m% O: @/ M; z# L
9 U9 T0 l/ y9 _5 {7 b7 Q
3 e$ l, c E! Y2 d# J8 y
4 z% N; l. n2 ]5 @$ _7 \9 C
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
b [, }+ B+ H% j- Y) b1 K
- w, F; D" x# s3 e# x! x
* V" j6 k( V/ v9 K
6 G$ k9 [4 |; l$ G+ U6 ~( D
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4