嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
. ?) H; T) P- Z: R
核心板2:DDR2 256M Byte NAND FLASH 8G bit
) s- ] i4 |/ e$ p
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) M" L7 ~, X! w# \0 |- s9 d; K" i
4 w" w0 U: q0 m$ v
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
, q; S2 T2 I( C
1 `) ~8 u; }; k) N; |6 D& ?
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* @5 ?8 t. H" r, w
/*
: v4 i4 B3 J6 m. N; X/ T9 [
* Check memory range for valid RAM. A simple memory test determines
- q! @% [, q: n/ b0 M
* the actually available RAM size between addresses `base' and
. A. u, P: o H+ Q. m5 U
* `base + maxsize'.
5 u* @5 | A3 a1 F D J
*/
* J) Y, i0 x0 g; {* D9 S. @; r5 S
long get_ram_size(long *base, long maxsize)
+ d" n9 ?) I9 a2 @
{
* H2 @: A0 A- i [: |9 I4 }
volatile long *addr;
+ Z( P( ~& U! c3 d1 x; n% e& a
long save[32];
* m. }" T" b0 J4 x1 P' I
long cnt;
1 J, I! e! v- K8 k; V* g- J0 O4 y
long val;
6 W. U8 z3 t Y- H4 @: @) W9 F
long size;
- H7 p+ S+ J! T& e
int i = 0;
. p+ `9 a# {! j
. ?# t1 Y1 Q/ G9 ]
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
. y5 _4 ~2 a) E. I9 S
addr = base + cnt; /* pointer arith! */
6 a. t. i; S! R
sync ();
" {/ e$ I; E; T% T; I& w6 a$ d. ?
save[i++] = *addr;
Z; c; E K4 x9 W# P2 J3 x1 J- k% V
sync ();
5 a! E! S' `$ G* S! u
*addr = ~cnt;
$ Q/ M+ ]# V4 x* @9 F- \+ a, J
}
+ }% g3 f2 }2 d! Q6 Y6 E- e f, O
* M- F! l8 s6 R f' }3 |' P
addr = base;
+ A8 F2 H0 n# Q
sync ();
6 S! N2 a K& k9 v: p5 ^
save
= *addr;
% _# b$ R: V3 ~2 x8 g h
sync ();
5 K( U& k$ t9 i* R1 a2 j* l
*addr = 0;
7 @# E* ~' B7 p5 \6 t" X+ L; N
+ n7 X! u+ Y; U# L8 o
sync ();
( T$ u/ E2 _! [9 C; |/ d
if ((val = *addr) != 0) {
, ]/ | e( x/ ?1 M) L) x
/* Restore the original data before leaving the function.
+ u8 g- p% g+ {8 ^4 m
*/
# |. y1 {7 y* g Z
sync ();
3 a" w. I& B7 {0 o5 i
*addr = save
;
" K2 R/ W9 }& v9 d3 D% [
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ h: ?& j( I+ s* X3 S! k
addr = base + cnt;
- T4 T" g# R& Q( Q& T3 k- U# m
sync ();
e! h' a5 Z; [" Z s+ ~
*addr = save[--i];
9 K2 c, F7 Q+ I; w; o/ D' x
}
" s8 M7 b, `# j9 B7 u% K
return (0);
( n& |$ C( l, m. R M: D
}
7 u* g8 @" Y8 h. ^ x1 _( u
- z, q& q4 C8 i" i; g% [& r
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 E1 C$ I; L) |/ S+ g0 Z G
addr = base + cnt; /* pointer arith! */
0 L, t# `7 ~: e6 j n% X
val = *addr;
7 P8 }6 m6 L: [. h! J
*addr = save[--i];
* o) e$ U/ [; {5 o$ D
if (val != ~cnt) {
4 _; E6 H/ c0 R2 |& O7 B8 ^( B
size = cnt * sizeof (long);
" p8 B0 X9 \- U5 W% Z& j: f' z1 Q
/* Restore the original data before leaving the function.
3 P. H+ Y/ ?, ]" Z0 A: ?
*/
6 ~3 C/ k. r$ s r
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 N/ j0 z) a, _* I' r1 }
addr = base + cnt;
, N$ G- b, \( j4 a
*addr = save[--i];
' |7 s2 N. }9 L8 J# X- Z6 b1 j
}
7 O( b2 L: U. Z9 j6 e3 g
return (size);
0 d# X9 U8 g9 k" h. H3 N# ]
}
3 N! W' S- x6 @1 W& a
}
8 l, `9 ^3 j7 n- K1 |
- n9 M+ E, h( \, a3 c
return (maxsize);
( t$ w$ h% m/ K& K# l5 z' Q6 A
}
) ^7 Z: z. ?7 }% i
int dram_init(void)
1 u& c" @* C& K& I5 F5 k1 \
{
' b6 `7 Y, _" ]6 O
/* dram_init must store complete ramsize in gd->ram_size */
9 G; h* {: ?+ d8 c, H& H* y5 u/ A
gd->ram_size = get_ram_size(
: J" w6 k5 X5 |; e
(void *)CONFIG_SYS_SDRAM_BASE,
* X# j. i- N0 I Q
CONFIG_MAX_RAM_BANK_SIZE);
+ p/ z) b n9 w4 n: A$ o
return 0;
7 S% r% C. d5 w! R
}
! j! U8 t! b1 D8 c
8 U8 g E) z" ~. P! o
0 ], D4 z$ M L6 a: ^
; V! D8 Z' x: q/ ~3 c- P: E, ]
3 y$ u# W; R* A% b @
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
9 W, Z% B8 {, Y; m
# [( O4 N* d4 |
3 z4 l {+ j) N% c+ m. z/ ?
% d8 T, D5 n6 w7 A& B2 M9 ?
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4