嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
& \) Y) B, c$ s0 y3 I! b1 Z8 u
核心板2:DDR2 256M Byte NAND FLASH 8G bit
: O% k5 s9 c! A. z6 P+ X
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
' n$ T6 u: B q
0 f4 T( N& I7 f; ~; b; ?2 D
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
5 E+ ^2 ?; @$ P5 T3 C0 q
! J. Q, J$ Z# t( D& D5 \
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 Y& Y! K* r# y8 F
/*
, g% ~; l7 p: Q
* Check memory range for valid RAM. A simple memory test determines
" |, ]6 q$ z$ ?. M" R }
* the actually available RAM size between addresses `base' and
, } G/ }" A* u: h3 |& \! l
* `base + maxsize'.
/ Z8 B \, P8 J% @% T
*/
/ x' f9 [( I. W: l( P* }( a
long get_ram_size(long *base, long maxsize)
. ~" Z3 k1 m( }- o$ o3 _, F
{
6 }- A- R/ J% N" e! v* a
volatile long *addr;
; X2 c" a% _8 @, ~
long save[32];
8 I; ^8 K- m$ b+ Z8 v
long cnt;
& [* n6 E6 |! Z, t# I* \
long val;
9 R% u- M) A: ~2 }$ f9 ?
long size;
$ P* C- b3 F6 E. D0 ^9 g
int i = 0;
3 q4 T" g T+ D; o+ I) X) v, O
( G0 l) S0 w6 e4 C7 l0 `
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# b' S# o" @" e, @: U' @0 i
addr = base + cnt; /* pointer arith! */
6 b3 E, |0 l/ T$ D4 Z7 y( h
sync ();
! v2 {. m- y" [5 z, u( |
save[i++] = *addr;
2 E9 Z2 u$ g5 ]) m! l4 `5 e4 m
sync ();
3 F2 K& y! B3 K8 j3 `1 T% \
*addr = ~cnt;
/ K/ @$ {9 T, K8 V$ X+ D
}
- q7 `' a! @3 |4 f
7 D2 c, Y+ z# A
addr = base;
l" I7 A! K' D! A: C! W' l4 i
sync ();
8 \# c. f0 q5 R
save
= *addr;
' B8 _) p" z8 ^+ p" V* k* t
sync ();
, R2 _7 ~4 M7 f
*addr = 0;
& i1 m4 k; _( t" X! T
. v: [. e) c1 M& F
sync ();
$ D c8 M+ t0 [* s1 G$ }
if ((val = *addr) != 0) {
+ x; b$ s {: H! ^3 R1 M, o5 V
/* Restore the original data before leaving the function.
% ]0 {' k0 E) C; a* Z$ l. e9 |
*/
7 p' a. {) C! f$ Q, r2 i$ W1 m( J- S
sync ();
/ O1 A% H8 a k: f
*addr = save
;
* n# b; K: Q3 x- {
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: ~$ y6 k# A* h4 J5 Q
addr = base + cnt;
# `1 a2 E* F' A8 \4 d
sync ();
! P1 j7 J! \1 l1 }, S; ~5 u; L( v
*addr = save[--i];
$ j/ |& X2 K. G! }8 ?. c
}
- F" c, F* K; [3 {
return (0);
$ ^5 I# Z. r2 Z( @4 z. B# J* m$ L. Y
}
+ x7 A3 Y' o" b/ c% K5 d
8 ?5 x9 W; K% Y4 ~% T/ ^$ u
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' A& d4 a1 D) y4 Q2 j
addr = base + cnt; /* pointer arith! */
. d/ w, T% s" P$ n
val = *addr;
' `4 f/ l8 R$ I6 \5 O
*addr = save[--i];
6 p8 }7 X( g. U' S8 X9 V4 ?
if (val != ~cnt) {
8 ~+ s. l( `& L/ E( o0 [
size = cnt * sizeof (long);
1 S; d0 {( e$ p! C5 O. |
/* Restore the original data before leaving the function.
: B% `0 V3 T8 { |
*/
, J1 w( l" z9 @
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 m/ X# \6 U2 p* ]! f. j0 `
addr = base + cnt;
+ z0 \ h& |6 `9 M! L% [
*addr = save[--i];
. Q6 F5 J" _7 e, d& k& n7 Z
}
. I( T4 j; I$ `
return (size);
- `3 U! \# B3 R$ Y3 o1 u) f7 Z
}
5 H+ D) V, j/ w R9 j! X4 W
}
5 x O/ j3 j" A
* ]# E1 l } m2 X# M
return (maxsize);
. A$ d; T5 M _- [; _
}
, Q+ g. l' x4 \1 t V2 o
int dram_init(void)
- ^; ^( h! A8 _: n9 `$ {& a% _+ [0 D
{
9 L# W' U$ m$ D7 t
/* dram_init must store complete ramsize in gd->ram_size */
% W; R8 W0 @, t2 ^) W8 {; G
gd->ram_size = get_ram_size(
* r$ T: e7 Y4 v+ H
(void *)CONFIG_SYS_SDRAM_BASE,
$ W; O8 [ ~; q7 `$ G: E
CONFIG_MAX_RAM_BANK_SIZE);
( ?# r: T2 j7 O4 p- _) P& T
return 0;
$ Z5 I3 b: D3 h) ?7 H8 n8 z
}
5 Z& G: Y6 `8 r0 [% t! J; r7 j# t, w
. n3 K0 A7 h# F4 v a' ?
! J% @" j8 O9 ^' D
/ x+ ?* t7 v U
/ e6 e/ K1 p& `* U
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' z, O5 B" r9 a7 S* n& E1 e* v
" P! {. D9 }, {6 M) a# i5 q
( |* }/ ?4 H% O; s, \+ b
4 b+ U! N5 t" q8 Q, B2 N" Y
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4