嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
) ~, Q: X% M. b- _1 m
核心板2:DDR2 256M Byte NAND FLASH 8G bit
: ?) d2 v, O9 @
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- K' c8 [! s4 P2 r$ K0 r) b
4 @3 a) _: R3 H; T- O: L
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' N" o- ~- j9 W
5 m" W9 S: E' a0 r4 [' g4 N
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 X. M+ U& B9 e- V
/*
) j. q# p. @9 [ f$ w9 v
* Check memory range for valid RAM. A simple memory test determines
9 Y/ z6 M$ C; ^8 v/ x* z
* the actually available RAM size between addresses `base' and
+ T a% n5 a& L. k9 a1 U! p' A
* `base + maxsize'.
- i; H& o' d4 s u( z6 ~
*/
; h& s3 E% V& }% ~. \
long get_ram_size(long *base, long maxsize)
7 y8 N7 g) r1 R! N% f G+ U2 X
{
8 \. r/ c' I$ ^6 ?/ V8 Q; K
volatile long *addr;
+ p1 z+ v% R- J5 j5 d d" Y
long save[32];
8 K( E: C8 u% p6 X% b; A
long cnt;
8 q/ l7 q! h9 h
long val;
* t H3 l9 z7 [9 @7 G3 A
long size;
" {) y7 @/ ~/ L
int i = 0;
* m; E- H/ b& c- L6 Q4 O
) S; H# t+ z/ H! D' C
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 T7 M7 G2 Q. ]6 _/ l/ A" h5 L( M
addr = base + cnt; /* pointer arith! */
3 Q* D, T; b d9 K. s
sync ();
% C$ B/ [7 e) }9 j! \* |' S$ i8 C8 g9 y
save[i++] = *addr;
6 u$ j: ?6 [! z' K; r# m3 U( H& Y% r
sync ();
2 l8 P( q: F: e/ w4 Y4 ^
*addr = ~cnt;
! T6 c! \9 f/ o* x# L+ i" T3 F) K
}
: u( g* W! Y& z9 z
' Q- {3 A4 S: U- h8 X
addr = base;
# t0 R5 e1 m {- `5 Y& p! ^
sync ();
! ]; J5 a3 ?- u% X) Y P+ ]4 [' X. t
save
= *addr;
. o" J( F9 V F! z
sync ();
" n; d" H" i0 Q8 g; p- k& G3 G; Q
*addr = 0;
/ L8 q6 O" K ~9 ^5 r7 b# E4 o; H7 \. V; p
{# a, ?' u' N+ t: J2 G# C
sync ();
) d& x: k! \* O- Q3 t- { \/ D
if ((val = *addr) != 0) {
( @. e# b v) c' k4 u' w
/* Restore the original data before leaving the function.
# c/ p$ c) E3 C8 {* f- i
*/
) p' o! N" T* z7 c G% O6 |0 {" U
sync ();
& H, `/ P% Q6 M; Z" r! }: ?$ j
*addr = save
;
F+ g2 ^4 X1 R2 K
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 w% K8 j6 p/ h! W3 e
addr = base + cnt;
6 a: m0 ]! _0 C$ Q- l
sync ();
0 Z2 D0 { a* ~
*addr = save[--i];
3 p' G8 ^4 z. J. z5 z3 {7 x
}
, |9 f; K, ]+ }$ ?% G9 ?% e5 z. w
return (0);
. }% S1 `' L0 Q
}
; F0 _7 f' H% W/ d3 y* K( U
, G9 }" x7 E( J% N- A- e8 s; q
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 o/ Y* X: p% t7 j3 J+ h
addr = base + cnt; /* pointer arith! */
2 a2 e5 A3 u8 @
val = *addr;
( F9 x: I& ~* e4 k# N
*addr = save[--i];
K3 c6 f. t9 [* g" J
if (val != ~cnt) {
+ |1 e! t, {! K" G& w
size = cnt * sizeof (long);
* q* h9 W& H2 n5 j3 F# `& O
/* Restore the original data before leaving the function.
( e) E" F8 Z+ S- m/ S
*/
* y: D. b2 V; q$ a, ^
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# T* Q& m- c* ]( H$ C
addr = base + cnt;
# @4 u- ^- ]7 f( m
*addr = save[--i];
! q6 e( ]* c; m; t- I
}
4 m: |: C& F. [, o
return (size);
@7 I) X$ Q7 r
}
! I/ ^! Z, k5 q9 x+ F
}
$ R" Y0 w+ N% t" Z
( U; S, F# l1 ]
return (maxsize);
% b+ }7 ]! t9 |" l% K
}
5 y- G' L) {; P3 h8 ~4 J* z) A
int dram_init(void)
1 l: c% u! r+ Y4 ]0 f; f5 Y o
{
; [, O' p z; r# r$ F; G( u) E% U9 C
/* dram_init must store complete ramsize in gd->ram_size */
6 N1 D4 s' W' j t
gd->ram_size = get_ram_size(
: I! U( m4 k; W4 _* C3 J
(void *)CONFIG_SYS_SDRAM_BASE,
) q4 `( M( ~8 @$ X4 z/ e5 b: I: v
CONFIG_MAX_RAM_BANK_SIZE);
2 O; n) ?+ `( ]/ H Q) @
return 0;
! Z$ O2 y% j7 T4 h' J7 v8 I: S
}
) R" v1 C1 W. |7 R
1 y- u( ]! }* G2 ?
. O; _- ~# R; J7 K ?. J& ~, M
5 F+ ]& _+ r1 g% x- j
: N. y9 B1 N5 L: {
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
9 f3 z; A1 \( s: \
% r9 t( X$ {5 U3 e) x: v4 `* P# q
7 u& f1 y/ k' e0 f; H8 ^
( l8 i! P# d( D
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4