嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
1 h: t& n. e6 z
核心板2:DDR2 256M Byte NAND FLASH 8G bit
1 C" ^" L5 M+ t* {
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
+ j) i. y1 ?' v4 Q
. k( C# w7 z" c. v
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* j/ {' e8 Z! W. B: F9 J
$ ^ M2 J [" d4 Y' f
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ j( t, n: j) D8 D9 q& S& J
/*
+ I3 x- F9 M/ T# ?; q t z
* Check memory range for valid RAM. A simple memory test determines
, U: A3 \6 I" e: G$ }& X7 v3 J
* the actually available RAM size between addresses `base' and
6 D4 h1 a# n. k" B1 f \
* `base + maxsize'.
0 V# v/ C& Z% ^6 \% I
*/
8 g0 n& a1 Z5 M6 k/ }7 |
long get_ram_size(long *base, long maxsize)
( R6 t( P* E! B/ j1 @* K" N
{
) y& S! n7 j3 _' I/ q' a6 E& ~+ B3 u
volatile long *addr;
5 K: ]- ?! p$ U
long save[32];
V& Z; B1 L5 Z0 i- J; N0 k6 H% ~
long cnt;
2 l0 G3 |7 p5 l1 q1 [. r( U
long val;
) h# u; J! q8 u' U" V5 F! ]
long size;
$ A) S# ` q" V' A' _1 G. R
int i = 0;
: I- t. V; \, j, F" |
1 b% a8 A- w9 W" @
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 f+ z4 Y q, u9 S4 N+ \
addr = base + cnt; /* pointer arith! */
) h% F) t/ {( i$ `
sync ();
- O5 h% o+ q! Q' ?# A3 P
save[i++] = *addr;
2 F' B: B' h! J! v$ w& }
sync ();
& s$ G6 A7 L; H1 ^# J2 }- b
*addr = ~cnt;
' `. D+ p* p+ N. f
}
P4 M* @2 m& j& W+ P
' @* ]2 E/ \9 _# N9 c ~6 E
addr = base;
1 o; A, @, R* F$ j" B; Q
sync ();
+ b5 m( A+ K N" b/ O
save
= *addr;
) G$ u3 @' N- q
sync ();
4 O/ s, ?* K* x+ x" N
*addr = 0;
2 \# S1 G) n& b. `' g: y6 e9 a
! |2 m3 g% ~& Z, F1 _/ Z
sync ();
. g$ O- b4 R% V" n- ^3 k
if ((val = *addr) != 0) {
) C4 K& j6 M, l: f$ m8 L
/* Restore the original data before leaving the function.
' f+ S- R Z8 r- l8 P$ }# M+ O2 g
*/
+ }7 A: r5 M5 d
sync ();
1 e( q% V! Q0 I7 t, v' r e# e
*addr = save
;
" x+ v' f( l" J; r
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ m' t* J- A( O, Q8 |; o b
addr = base + cnt;
0 w9 r, }/ _7 l8 C
sync ();
( T* E# R& F7 [$ a, a
*addr = save[--i];
( E- S5 e2 K% k! S9 ^ @0 w
}
1 y2 Z9 v1 b9 u# {9 ]; ?; \
return (0);
! P8 m& d/ e* M, l! O- W
}
) E0 w/ [+ M2 }1 o+ _7 l
1 s& q) ]/ D. B3 u9 z8 i' L
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ C: L# v# f) p5 ~4 {! x9 |
addr = base + cnt; /* pointer arith! */
$ X1 U$ S" W" `; d9 d
val = *addr;
. ^- C# c# C+ }# `
*addr = save[--i];
- A3 B0 ~, a! A: S9 ^( J' `2 S& |. j
if (val != ~cnt) {
5 Z- g g$ v2 r" m! a$ }) A
size = cnt * sizeof (long);
5 j7 X2 p( W2 I! |4 h' j8 M: D
/* Restore the original data before leaving the function.
/ M4 x0 l' c& n) q2 L- t+ ~8 u
*/
% M1 b2 `) x" h$ q
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 E& @: M! t9 N, a1 k9 q
addr = base + cnt;
1 V6 t5 X* r/ m9 W3 B
*addr = save[--i];
/ l) m) K' Q6 M6 k
}
! ^; I! d* o+ M! ~& w1 n y
return (size);
4 Q E- A4 r' N7 c2 i
}
, a- N! I. E9 e4 F' {% W) x
}
/ k( y" m7 X$ F* @0 i6 d
+ S0 G0 K6 U8 o: g4 t' b
return (maxsize);
. M4 l5 ^5 K8 f& [5 u" N
}
: |) e/ p W+ X0 z' e% e l- R: Y
int dram_init(void)
! ]8 _! g }1 ]" {! }# n% M
{
( Z# Z% K4 `' b: Z, ~% J
/* dram_init must store complete ramsize in gd->ram_size */
! C1 U6 e1 p7 I
gd->ram_size = get_ram_size(
4 T; ^' g; G! x# W0 n+ s* H, t6 F
(void *)CONFIG_SYS_SDRAM_BASE,
: W H- e- _7 u0 R
CONFIG_MAX_RAM_BANK_SIZE);
$ g, {3 n' Z! C% |/ j1 R
return 0;
% @* k$ m" O+ R8 x/ @- K; @+ N
}
0 `: ]7 M7 ]; N# N2 a9 A# S
/ h5 [$ X0 x) a+ ~
& d( A4 w. Z; d8 I& Z! c+ U
" X; u( q4 `0 z. F6 \$ e
5 ^4 U+ C' ]+ i% A' f- \
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
y0 n) K4 C+ e y: M
% ]0 S7 x" {3 M& W' G8 J
' b! ~, ?+ u9 M) {* W. B) t" f" R6 W
( O* @+ ?6 G Z* J& G
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4