嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
. _, O& X, {/ S* Y
核心板2:DDR2 256M Byte NAND FLASH 8G bit
% Q6 \- ?7 T2 k/ y% {
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; ]! p' A' J. M! _( [
' g" p8 ~- ^% P+ y3 P
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# x3 F) E0 P2 V- S2 W7 t4 Z* ~
% _! Y( v6 R% q2 u; q
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 l7 {, r2 _% N: A* P- u3 ^
/*
8 p1 x1 ]+ U) B( I3 n
* Check memory range for valid RAM. A simple memory test determines
( v4 X5 E/ V, ^
* the actually available RAM size between addresses `base' and
" B8 `$ ~: l# b
* `base + maxsize'.
: D, d O2 [ l/ N
*/
1 `2 e9 I1 S- X) f! `+ N
long get_ram_size(long *base, long maxsize)
5 n4 ~4 }! r5 w: p2 w' j6 P
{
# }- u: Z4 Y0 X7 C; ?! g6 C
volatile long *addr;
) ~0 O$ Z3 e) o+ Z' g* \3 t% V- _
long save[32];
) k- K2 Z4 L" y1 N/ m6 J
long cnt;
]/ s1 }) N0 F1 I$ M$ U
long val;
& T: S6 K2 {0 P+ T" s
long size;
) ]' _* [! M+ T+ f* b+ m, x
int i = 0;
- Q6 b% s3 ?, g: ]; a
, }/ H4 E2 E2 Q/ h! ]; U
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ r7 M- e' ~9 W; y9 {# L! ~
addr = base + cnt; /* pointer arith! */
* l5 g, K2 A, [$ t
sync ();
3 C+ y& f2 f& ?
save[i++] = *addr;
9 j$ y* c5 H0 {3 V) }; n
sync ();
e; R) m) F) j* A) s
*addr = ~cnt;
- F Q. K$ l! y9 J& V
}
' q! [) J; i# w( |: c; K. J
; W3 d" A; `9 e2 N0 F& u: Q
addr = base;
1 U' q9 f; X2 ?3 l
sync ();
: x. g! f3 P3 H* i K; j1 p) D
save
= *addr;
" w2 q9 D, Q l. ]; P
sync ();
, I; F& c j* x W* J& J8 ~
*addr = 0;
0 {! U& V0 b9 M+ F- c
* W- D) \6 Q6 g( {+ v- L
sync ();
$ n/ p' P. r0 [
if ((val = *addr) != 0) {
; ~5 U w4 y6 t2 h% C2 s
/* Restore the original data before leaving the function.
$ Q; f0 b. w- G; C! f/ }/ s
*/
$ F* ?- R8 [. z1 n+ `+ l- K7 a
sync ();
6 M; U6 b# T) F9 M% ]( Q% g2 m) s3 L
*addr = save
;
9 h1 X1 h7 O$ {% {8 S: Y/ E3 n
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 L( G* G; Z' [9 _" F; T- l
addr = base + cnt;
' X: u y3 [7 A* f+ m0 u- T
sync ();
3 h/ \+ o3 j% I, Z
*addr = save[--i];
0 _! \ u) y6 y5 y
}
" E$ s. d* Y$ U! C" `- E. I% N
return (0);
7 s6 T0 K& ~7 F7 K: p4 I7 \
}
9 h. r" Q1 z1 t( S* l# S
# R/ O) ~8 u A) Y/ U; m4 Z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# O' n% T3 b0 f- _6 j
addr = base + cnt; /* pointer arith! */
% g0 t6 e% X" G; |. B! i6 @
val = *addr;
0 R) R3 \ c% u& \0 J) `4 v
*addr = save[--i];
0 J Q' L" g' [- y
if (val != ~cnt) {
: W; v3 Q$ b* [
size = cnt * sizeof (long);
# t# S: w# L. t0 V( w
/* Restore the original data before leaving the function.
2 x4 \. [) f# [+ p5 C0 X2 g
*/
. m9 W, S; ~9 B: l' ] m5 a8 _
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) ^! @! v. \( |; N5 Q0 C) q
addr = base + cnt;
8 L! b: E4 i" F$ `
*addr = save[--i];
, ?' O6 ^* {# z: c; T
}
; m% _0 |" {: K8 |0 D9 r
return (size);
# Z% X$ n/ s) j) \
}
0 P# I: z" n% Q: ~: |- W3 S
}
# U$ E! p- ~! h
) i$ g. V& m& _9 B- t/ X
return (maxsize);
9 D' c6 b6 M5 @$ c: @& u
}
" p& r1 \) X/ ?: S0 U
int dram_init(void)
8 E! X0 O0 S# `8 J" e0 C
{
) ~; l/ m, ? a& F: J. `
/* dram_init must store complete ramsize in gd->ram_size */
! G1 z5 i! R3 s* D3 s% r. Q- y
gd->ram_size = get_ram_size(
( x% i" C Z2 e. A- ?
(void *)CONFIG_SYS_SDRAM_BASE,
1 v! | L- i, a- |
CONFIG_MAX_RAM_BANK_SIZE);
5 _2 k% d$ c* u. l" E* f" f# T
return 0;
8 i% K$ a0 ~2 w% L2 t5 \
}
) o8 Y+ _/ @" r: }
9 x; F2 Q3 K. `, F
4 ]" E6 g$ [5 W0 q W, T) s5 [( s- W
/ E- f0 k# ?/ _ S3 k& R
7 E6 _1 I/ P4 R Z' M
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ @- [- t7 R: x; f9 M+ @5 e% ~
* g! O4 D! ~5 r+ q# M& O& d
& |0 l; s& ^' x; E; x1 o; l7 U
* Q, T2 L' v- T: i W: Z( o
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4