嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
2 P. i7 P, h4 j: N, R6 _# N9 M
核心板2:DDR2 256M Byte NAND FLASH 8G bit
0 W f( r6 ^( J( E3 N1 k1 N
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
( |7 O. F5 c( U) w" ? B
8 z; J! T7 d0 G6 w
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: J+ X8 C, B' C/ s6 [- }! z$ Q
1 V( z- H1 P- y1 |
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 m- q/ u z+ G
/*
" t9 z9 x; q* q+ K
* Check memory range for valid RAM. A simple memory test determines
9 ?6 O Q0 \) I7 [2 R. \' @7 P
* the actually available RAM size between addresses `base' and
9 \# `( @- L# W. f% X% ]; }8 }
* `base + maxsize'.
j3 A1 }* _7 }8 y
*/
5 u( C; P! E& c1 I) ?/ G2 [, h
long get_ram_size(long *base, long maxsize)
9 {' h: |: n; t- Z
{
9 l4 d8 r4 y8 D, ^) S
volatile long *addr;
& D% M6 j; L% @
long save[32];
) G6 ?5 y D% G+ w. W) q
long cnt;
$ [4 l" B. v# }1 l! G/ V
long val;
Y; H ~9 X( P
long size;
7 k3 |' K8 o n4 [+ Q9 V, Q/ Y+ T
int i = 0;
) |4 W; X4 {5 z5 X
o7 W2 m/ \$ Q, u b: F* p
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( Q8 N& b7 w& M# `. p; \) o
addr = base + cnt; /* pointer arith! */
6 h! v9 H" T# ]6 g9 G8 k. ~$ R% ?
sync ();
5 w: O+ q3 W3 x" R0 n
save[i++] = *addr;
' y5 d2 h1 u+ U3 W, z
sync ();
/ S& _9 L; l5 w B
*addr = ~cnt;
8 i5 M8 E3 B. A. {! w/ D, j$ d
}
6 Z$ e' I6 ~! t
+ t! `* M) y4 G6 F- Q
addr = base;
) x) m3 w& z7 f' J, m
sync ();
; Q* Y/ M5 D9 D- U
save
= *addr;
; u2 J8 z7 Q4 Y8 g
sync ();
/ U1 j, u7 t3 \$ G; z8 ]
*addr = 0;
0 T! u% f |+ h/ d/ L5 L
/ r( P) ^& K: S* z5 X Z4 t& z
sync ();
2 l! U8 G" y. Z( w+ K
if ((val = *addr) != 0) {
: d( y5 }$ B/ b* F0 \% x$ [
/* Restore the original data before leaving the function.
) `) Z8 `0 g s5 q+ i/ Z+ G
*/
, U" W4 h# v: j0 e0 p
sync ();
% i+ g% x' w) |) [
*addr = save
;
# ~" m: j; W* h
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
" k' O7 |5 O% r4 `& e# O7 r. l
addr = base + cnt;
: Z; ?& {5 f7 W8 u5 F2 x
sync ();
- y' a. h" [) r
*addr = save[--i];
) }6 l5 u8 p5 u% C( f
}
2 N9 F' Z5 [4 I* K1 o
return (0);
! s+ g( Y' B% y/ k( i
}
3 K r2 S" Q ]6 Y9 j3 `; J D0 o" P4 L
! b# V5 {4 m/ u( k
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ A6 j( k! o: o! E8 z) C1 y
addr = base + cnt; /* pointer arith! */
5 M9 p6 g4 _% H4 S2 j. ~! U0 w
val = *addr;
8 W7 G; x5 S1 I* `, V
*addr = save[--i];
' r% f9 D( {4 j! W
if (val != ~cnt) {
8 @) f* Q6 k2 v0 y
size = cnt * sizeof (long);
: g3 p. U1 K L e0 R9 v
/* Restore the original data before leaving the function.
/ n% r. H0 A+ R! i {
*/
' c$ b, t0 A/ r1 u) B1 t
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: q7 ^$ z9 @/ W z) ?. t
addr = base + cnt;
6 ?1 _8 r1 n; r0 X
*addr = save[--i];
; [4 b1 F4 c" ~, F
}
. S8 ^1 p0 p( J0 |9 I+ E* p/ R' ]
return (size);
' P# d! Q& C g h! i$ g( ]- J
}
# v* Z/ `# R) u$ P, Q
}
4 f# ^* q" L+ v' j
9 |3 Z2 T+ t. H, m
return (maxsize);
9 }( j, {5 Z% z0 T3 k* _' {
}
4 X5 P8 l: x1 P# V- H
int dram_init(void)
, z! c, y; U" U# N
{
- r2 M$ ?$ z& W3 j. F) S
/* dram_init must store complete ramsize in gd->ram_size */
% {! N3 K% O" T% v9 g
gd->ram_size = get_ram_size(
' c( Y+ a, W( J" P
(void *)CONFIG_SYS_SDRAM_BASE,
( o( ?- [* v1 `# i9 ], Y
CONFIG_MAX_RAM_BANK_SIZE);
9 N* v) ]. L- e0 q' O0 z
return 0;
/ v/ r [; G n* S. y. M0 @- T
}
6 v( w+ I0 I. M$ l3 D1 q2 x
+ r5 ?5 V- Z& E O5 K
- Z- Z# S- c# @" l+ v, o2 _
( Y- C. ^$ D8 y/ h, l- Q- Q
* e f6 L. V4 l. [1 y/ n
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 j4 T" k5 R) R) t
0 l6 x; v# Y2 [' j! [$ v8 p2 Q
9 G, _* M6 c) F- U2 w6 a
) G4 l9 a/ K9 G/ g Z' V/ w6 o8 n
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4