嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
. A& f" o: z' T; X4 b4 R
核心板2:DDR2 256M Byte NAND FLASH 8G bit
2 S' M& E4 b! {! T/ k& H: Q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
8 J d* J+ P8 B% g
& h+ ~6 v% V* F
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 U9 u3 H* `7 f& V
. [7 M' ?* {( h; J
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, n: r$ ^' s4 P
/*
/ b+ W. n* D q7 |! u; t& H
* Check memory range for valid RAM. A simple memory test determines
6 |5 m8 c' a( V5 h
* the actually available RAM size between addresses `base' and
" N0 P" g9 a% k7 x( L
* `base + maxsize'.
6 p K% Q. i" v5 F
*/
. B5 o# `" M: {+ {4 V. Y4 S
long get_ram_size(long *base, long maxsize)
8 x1 o7 q y# y5 a2 Z4 E
{
: K$ U. K/ b3 l
volatile long *addr;
4 t, p) M/ t% M( U1 @6 j5 c
long save[32];
$ `8 f4 c) F8 Q( \) A8 S
long cnt;
) e' j3 u$ Y0 p' _
long val;
: r, a% }& [$ O- T$ Y
long size;
8 g& T4 q9 }$ R% `
int i = 0;
1 E0 ~3 P6 {- `" N
* J0 W8 c2 V% [) M
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, t: F+ u6 R( w: F$ h
addr = base + cnt; /* pointer arith! */
& O3 y* E- F% S3 _; b0 q
sync ();
3 M. }: t" a1 q1 ?
save[i++] = *addr;
8 Z* a: u8 ?, o& ?& `
sync ();
- q) M2 Q+ K2 D6 f
*addr = ~cnt;
% J* l0 V+ m8 e5 Y* v- @
}
& g5 u; [8 d. i J4 i0 {# U
) h2 c# r7 G* B" w |
addr = base;
0 w3 J/ P! ^& k: n/ y: r) K8 q
sync ();
/ @) N2 ]1 b1 v/ c% Q* w P9 z
save
= *addr;
' U; j* ~* B+ t4 A& Q! _, a) u
sync ();
/ c* C4 q$ }$ C7 i
*addr = 0;
6 s- ^& o5 ]5 {( k8 r
# d9 Q8 g' Z2 \* W" y$ f
sync ();
4 t8 D4 W7 I1 f
if ((val = *addr) != 0) {
3 Z9 B' v& V: i' A+ q% t W7 V
/* Restore the original data before leaving the function.
+ o5 t5 v. \. k: r; k
*/
_0 w- U: C( q
sync ();
' H6 O0 D) { C. E- w: r" I6 H J
*addr = save
;
4 a* G l e6 F; V% k7 w: r; L
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ s+ T( c: R7 u- y; x6 w8 U& Y3 E1 h# c
addr = base + cnt;
; M, r/ X4 i7 f7 c# [
sync ();
# X. O; [' C( h9 S; M" `
*addr = save[--i];
' Y. c' O& ? U" p, ~- D! x
}
8 @ C4 _2 [6 e; b0 _6 G5 U8 D
return (0);
' A, _$ d. a2 Z2 `4 A( c% S7 n) r5 ~8 b
}
. \- b% w, O3 D% z1 u
3 I3 O. H1 N5 S% {' t) B6 S. i8 ?
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. t6 V; H- [- G9 s
addr = base + cnt; /* pointer arith! */
) A6 a1 |% U) N; \, ?! Y. }3 `
val = *addr;
+ i G6 Z1 ~0 ]9 ^" w0 d4 d! `& F
*addr = save[--i];
2 U$ y/ }2 ~/ j, q, Q0 Q
if (val != ~cnt) {
* @, G2 R5 [( h1 Y4 P3 U0 v' {4 R; w) O' T
size = cnt * sizeof (long);
' ?. c# c$ s* W( ~& s. n
/* Restore the original data before leaving the function.
/ c; T* V, s0 A- d0 P& J
*/
8 \( y% Z" Z9 ]1 \% |8 g
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" U, w, w& \2 ]6 y2 z) l8 W
addr = base + cnt;
1 z" G. M7 r+ S, ` S9 N
*addr = save[--i];
1 C0 Q, O! v- p
}
: }& Y; p1 H, C2 W B6 a1 v: ~4 j
return (size);
' y5 p# V" ?- m* J
}
) h1 F0 r6 H0 I% E. O0 W- I. E
}
! r+ p! [, B, E+ t
4 S1 D) H! r$ Y) A' C
return (maxsize);
% l* E9 p# J9 A' V1 Q6 F
}
% P" S, P( c$ E
int dram_init(void)
4 |; Y' c, R, z# ~4 x# \! ]) y; q
{
L5 x% }, S. h- K2 M, o
/* dram_init must store complete ramsize in gd->ram_size */
! q7 V5 i7 A$ Z) |% k- \5 V
gd->ram_size = get_ram_size(
! b% P% W7 D$ k* K# ]8 e8 z0 @- N. k
(void *)CONFIG_SYS_SDRAM_BASE,
0 {1 c# j. P$ E/ B0 F
CONFIG_MAX_RAM_BANK_SIZE);
/ o% ^+ V& \. S4 @/ ~8 @
return 0;
5 O6 X" }1 J$ G3 M4 L3 Y
}
* u0 g, c- x1 ]" u8 A! z! v+ w
1 \0 J$ Y. ]0 a3 r- s& ?1 V
0 c3 ^/ }; k& H, X. t0 j# P
# i% E2 l5 K3 f. k
; F j* ], ~) e7 A! }
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 R: X, G* Y2 ?8 E
, U% o) y# q6 `6 }7 X
! C7 V# U% H, b0 J6 V
& e8 j* ~& ^0 C' k" h7 [: f/ M+ i
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4