嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
' k; `/ i+ b, [
核心板2:DDR2 256M Byte NAND FLASH 8G bit
/ N8 @( a' L5 S
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. y4 S8 W9 o- T( z& v" x+ V
/ k: I# _4 a1 F V
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& P' O C1 ^) j
0 ~% A0 ? O3 z* o5 x
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) O" c" X1 k' H2 B
/*
' d0 ^7 c" _3 w/ z* }6 ^. k
* Check memory range for valid RAM. A simple memory test determines
$ l6 L4 @) w4 J* ?4 I+ w b5 y
* the actually available RAM size between addresses `base' and
; E0 |0 e5 U( L
* `base + maxsize'.
! R! ]5 H9 \- t" ~* G+ L# E
*/
# r6 G4 ` w9 L: W7 ]; x* E# ~
long get_ram_size(long *base, long maxsize)
& j" s. z6 ~8 {, _& n$ J
{
4 Z- }7 C! m+ ~
volatile long *addr;
) [' J) X- `! W7 P2 q! t7 A
long save[32];
$ `9 W0 i( S0 {9 q8 R# a3 \* u6 ~
long cnt;
5 d B' {) z$ S" R* W
long val;
" ?$ j7 P- N- }! v3 p" k" g
long size;
5 m0 @9 V% k6 \/ E. |! ]
int i = 0;
( F( n: k* \8 n
, W: f& W4 w7 v+ i1 j8 U
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# ~) b7 x9 S& H# P
addr = base + cnt; /* pointer arith! */
( |* F0 J* N* \) G* e! K
sync ();
9 D& G' z: n2 `
save[i++] = *addr;
* m9 N y V, Y3 I& Q
sync ();
& X2 v" s" Y' W& ~2 |
*addr = ~cnt;
' R c( x; z: T3 M
}
/ ^& f3 y Y' J5 v, R2 g
; ~/ q4 {2 A9 i4 H- ], X5 o! S" g% F
addr = base;
H9 W* l- {; [+ t
sync ();
$ w+ B7 U& Q* p- b5 U
save
= *addr;
4 V+ ~& b' V6 }; w7 n* T3 M$ t( o
sync ();
/ V. U: {$ \4 i0 h
*addr = 0;
. I7 |0 z6 o8 [3 ^, c4 d8 }
# \4 m4 R8 w. G9 @) V
sync ();
% C3 k1 T. q6 Z
if ((val = *addr) != 0) {
6 K5 U# f+ `7 }3 G
/* Restore the original data before leaving the function.
( V3 V# y4 }: D
*/
' {- B* A/ p; G h! ]! d
sync ();
8 \/ D/ L2 H$ p8 E* h
*addr = save
;
, Z: k' C) A$ q
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 o% C7 r1 x: S. q7 G
addr = base + cnt;
8 |+ R3 x% N2 u( R" r+ e9 ^
sync ();
5 `- Z0 }" U# B; e
*addr = save[--i];
9 F) _- T) A. a7 g
}
' x8 Y7 o- q2 R' Y2 O% c' @( D
return (0);
! n+ ^/ J) ]5 T- D6 h
}
, N7 {3 K, t7 X: g: y
8 j, m' n& I ^9 C* o4 V6 ^! ?
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& d4 j T9 C4 ]/ M9 F6 I
addr = base + cnt; /* pointer arith! */
: L: K; b. x, H! V" u9 z& n
val = *addr;
) T9 J+ T/ Z2 l& d: o
*addr = save[--i];
6 j0 W: ]+ f9 Q0 m- e% B
if (val != ~cnt) {
- ~; H' X# V' ^ F9 {* z0 B
size = cnt * sizeof (long);
q4 j. X6 X$ n$ X2 O; W$ I& w
/* Restore the original data before leaving the function.
Q/ L$ F! a ^
*/
% a* ~# s# Y1 L0 w3 n
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# i5 Y9 b' }, t9 ^% O$ R
addr = base + cnt;
$ c" W2 `. M9 f2 R; X
*addr = save[--i];
6 t/ k9 h/ M4 @, N2 t
}
6 n4 L; x: @/ S
return (size);
# c) R* w9 Z- ]+ I5 j
}
5 K4 I% a" Y$ g w4 ]8 J- X$ b1 p
}
) k) g# q/ i1 V3 t% O, g
+ F! b% ? J: ?# Z' _
return (maxsize);
5 p- Y# p$ [& L3 @
}
0 A& o0 x% x1 B' B3 }2 q& Z7 z
int dram_init(void)
( L0 j8 |/ \' S, t
{
7 K) X2 `; \, O5 C* p% R
/* dram_init must store complete ramsize in gd->ram_size */
) x) I. G- [' w3 ~* W% g7 f$ d2 P
gd->ram_size = get_ram_size(
4 z0 O. w4 K! D" y* g* O9 u
(void *)CONFIG_SYS_SDRAM_BASE,
& k5 {1 Z# s$ B
CONFIG_MAX_RAM_BANK_SIZE);
{9 U$ n, F9 i- d# @3 r
return 0;
5 O0 u; {7 Y. T) a5 @) S
}
* e' h- j/ G8 u$ m; T
A2 [. y$ E- V* x$ N) Q
3 g# o# b" [( B; t
0 |" ?4 Q; ^5 O
8 k" E- T) B% T) Z! I8 ]
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* A9 j% o( e0 j
) a- f% @, e3 E
3 T2 ^* `) C8 X0 c" L! t2 w2 v+ _
8 _: u" y1 P9 s6 B
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4