嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
, e& m7 V a5 T
核心板2:DDR2 256M Byte NAND FLASH 8G bit
( b0 j7 u( u# Z4 H6 S) \4 u
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ @' B- y4 v& x
) `# R, i& X$ C. \
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 y+ r7 T& J, L! l! q! I
/ A, e& [1 K" R/ c; o
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& R: o2 S' R% ?0 N
/*
/ ?6 c( m( `$ H% D% t# {
* Check memory range for valid RAM. A simple memory test determines
: H2 {+ o+ D/ T& _7 v! j
* the actually available RAM size between addresses `base' and
- f; I8 | w& R4 N2 z8 v
* `base + maxsize'.
* E: S% ?9 y: h3 r) P% u: o
*/
1 y p: a* }' v7 u- b
long get_ram_size(long *base, long maxsize)
* {. ?# Q5 D7 k4 V& R' F
{
; q# F" O/ D* f D+ h9 h5 q
volatile long *addr;
* @0 u+ S1 L8 x. a5 J2 ~0 j- L
long save[32];
$ s$ M' f6 F* |' z
long cnt;
) r7 Q# P2 {4 R2 ?) L6 Y5 V( R r
long val;
4 I! d& X# n2 V
long size;
, y4 n! J, p' f7 b( @
int i = 0;
! Q; R7 v) Y) t: v% X) o4 t0 S1 t+ F
4 ?/ \$ j; g* b
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ H$ G! \, Y, {7 o l( W# Y Y
addr = base + cnt; /* pointer arith! */
2 `+ v, z5 N& B9 C& j1 `* _
sync ();
9 U) k1 C! ~: a: v
save[i++] = *addr;
' S5 m5 |( K( E& S* F
sync ();
" E% ~8 A7 H( _
*addr = ~cnt;
# e2 W# h; z8 H
}
. f. k" }. P n! g1 q# F, `1 ?. S
$ ^, ?+ v+ \% B& d9 U' E
addr = base;
7 A/ |+ i+ m8 |8 f" Z
sync ();
$ G$ R$ B% Y( {% ~! ]2 N0 {+ {+ c
save
= *addr;
7 y" e! A# d7 S, \2 B4 `8 w, n
sync ();
/ d2 j5 I$ g, h% D# T
*addr = 0;
1 ^! \4 U: }' @( w6 \4 u5 b) u
8 ~# l% n# M$ L
sync ();
! |5 ^ r/ q7 |
if ((val = *addr) != 0) {
: Z& y8 A4 l+ L6 ]$ d2 R5 |& g* g4 _
/* Restore the original data before leaving the function.
% B1 B3 v% ]& Y* m3 j) { F
*/
4 N7 y8 q& a, M; y3 c& M; r% Q% k! }
sync ();
% P' O6 X! I4 ^: f9 P
*addr = save
;
; z6 b: T5 `& J( v3 H
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 t G/ P8 O! V0 V
addr = base + cnt;
. L1 j5 L& e m, I) R
sync ();
1 k0 c( ~( | J! _
*addr = save[--i];
: c% P' y3 b* s/ m9 X% k
}
2 o0 k1 s* x& b. m2 O' d
return (0);
3 R7 _6 F1 c! }0 d& ]
}
- `3 h; V7 p2 Y) M
. S, w1 Y. j9 S5 h, x
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 K7 m& J- s7 k- [
addr = base + cnt; /* pointer arith! */
$ d, W4 h8 U6 }2 S" o, K# r) M
val = *addr;
- ]( Q; K' T7 e* Z
*addr = save[--i];
- r4 T' S! v4 c' s5 y
if (val != ~cnt) {
" t \+ e& D( d. J" m; l3 J
size = cnt * sizeof (long);
) i% c: B$ R* _4 v% [( {1 r' I- ~
/* Restore the original data before leaving the function.
( D' t2 G. p2 G' m2 d1 n9 U" w
*/
. g& \$ x3 m, O1 X; @, y
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& o6 J; n1 Y% K+ [4 r& E7 I# ~
addr = base + cnt;
6 Q: Y/ w2 v( g" P- T7 @
*addr = save[--i];
. X2 V7 \/ M, V, V
}
1 U7 i; M2 t$ T; ]; W$ V8 K+ }
return (size);
% d2 G4 f& R! ]9 c1 Y8 I
}
, |0 h" ]! Y5 D# |: K/ J7 F
}
5 J. D, c g' [; W8 z4 d% E3 E
[7 M- g+ L" B& J2 R3 F
return (maxsize);
6 g2 ^8 l+ F( \# g! C: r
}
: Q, h' d* g# J( |7 q0 G
int dram_init(void)
& G% p/ q0 W$ H6 @! n9 c+ l
{
2 t. A* s( r7 ?, z
/* dram_init must store complete ramsize in gd->ram_size */
0 } H7 z) e& _
gd->ram_size = get_ram_size(
8 [) ]9 A, I$ A3 N5 n3 A% d
(void *)CONFIG_SYS_SDRAM_BASE,
7 f8 H9 @9 q4 B0 h8 b+ z
CONFIG_MAX_RAM_BANK_SIZE);
, \, c) q/ ?0 x
return 0;
+ V/ Y3 k7 b' E) H
}
/ X, W( W+ A3 k# s9 V' S
) Q+ p7 `$ F: H* T7 f- d: F
0 D6 J; {$ }& R
" R6 }2 R: C8 s2 G# \; h8 F: z [
# B1 @; ^* r% s$ w, F
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; g+ }* s! D* d+ b
j& [) J8 f$ G" {. n" N
8 a5 f9 m) ^3 C' G
0 Y3 L- F6 T, Y% V# q
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4