嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 N! L' [* t) u* Z( Z0 Z" h2 w
核心板2:DDR2 256M Byte NAND FLASH 8G bit
$ g- N" t- x+ h( h
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 C" G' X7 z+ m. O
4 k `" w6 m& p# W; p1 e
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' k' i+ ^7 E7 s" m ?% g
! J; T9 \) F( r( A f: C; \
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 i0 {, }$ A* N7 C5 I+ K7 Y; T
/*
+ ?" p5 K5 m* R3 r8 S9 J
* Check memory range for valid RAM. A simple memory test determines
}+ y8 i: e' Y7 Q" Z, N1 _$ `
* the actually available RAM size between addresses `base' and
+ O" h) O0 M5 U$ E$ o4 a
* `base + maxsize'.
) S7 U5 C/ M5 t/ a1 v1 b4 R. d* i
*/
: X) G! ]/ G, ?4 L/ Z
long get_ram_size(long *base, long maxsize)
4 N# K. L" w* |% f
{
" k1 z! v4 m4 \) ]
volatile long *addr;
& `0 g& I8 m, t* {9 r. o
long save[32];
; Z% }, |/ d9 o
long cnt;
1 _3 G4 X& a4 Z# I; m d* w% r. I& h( \
long val;
) d! U7 U' k* P( z7 u& M7 j
long size;
4 Y7 D/ K f. b5 n. b4 A. i
int i = 0;
) c3 B8 [' d" P8 P% J; K
3 S6 l) }& z7 u, \% M! o
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ R5 r' W# p; H5 ]! s
addr = base + cnt; /* pointer arith! */
* {* y% ]" m$ f) u
sync ();
* }8 h8 |3 e5 T0 I4 ?
save[i++] = *addr;
# c1 P3 T4 C* i
sync ();
9 }* x n# G! u/ T" u6 x; `" w" a
*addr = ~cnt;
. E2 ^5 v; G) j9 D
}
- L3 E/ B* L' e( @6 y- ~; ~' C
7 h5 |! J* }. {( N, J a! G
addr = base;
- m- _) W/ O- V$ U
sync ();
- \% g2 e% Y1 e: @+ e8 {- X7 Z7 A, c
save
= *addr;
4 } H% O7 b% |3 V) l
sync ();
+ {" |& }9 U2 \7 N! @' W
*addr = 0;
0 t: Q; V+ ~! A
+ e2 |" Q9 m0 E/ E( v
sync ();
5 g S2 X8 F0 I P( F2 M! s4 H4 e
if ((val = *addr) != 0) {
- ]* s) U3 s7 k- Z' R
/* Restore the original data before leaving the function.
8 ]+ q1 |! P4 Z" I# n3 H
*/
5 g- j. ]% D( K' a
sync ();
0 S2 Y E1 S9 u, R8 k6 B( Q. M
*addr = save
;
# f: Y" E+ J% O
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
G# x' w; B/ q$ i
addr = base + cnt;
/ @1 I% Q* X, W/ j, I2 D
sync ();
1 O9 T3 ^; C& G% }
*addr = save[--i];
P* a. b+ n" H9 _3 l) T9 M& e! A$ }1 i
}
7 j: A: H4 K3 A( }1 |( o
return (0);
! J; F! j! U! m4 t
}
# Z' \9 L P R+ c* T
3 u( F1 R+ o7 o# L8 \
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; u% J+ n- f/ R( ?/ W
addr = base + cnt; /* pointer arith! */
# c' W3 q; Y, A6 Q8 o2 @, V, D( ?
val = *addr;
1 H+ s( E% a% e" e
*addr = save[--i];
9 s( P% K1 R* P0 b& Z
if (val != ~cnt) {
8 A) W6 ^% P! z0 a" g: a, F
size = cnt * sizeof (long);
% L$ @. X) h# w
/* Restore the original data before leaving the function.
) @" ]9 u! R0 U3 y. U/ u# S
*/
+ U1 P% X) a6 s- Y
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, K3 {9 J& r3 u
addr = base + cnt;
* D6 I7 ]* w @5 b6 v P; ^
*addr = save[--i];
5 `0 ?8 |. Q1 R9 g. D
}
: L, {4 K% c) j- B
return (size);
: B' _$ T/ H* U9 j
}
; j% ~; e& g* e( f: w! m& ]8 @6 b- E3 ?
}
9 `5 Y1 n! a5 v; k
% [+ E/ }, M/ Q- w- \
return (maxsize);
4 Y' J6 K$ o' k* i8 v9 R% _6 I
}
1 W o" G& u" |% k
int dram_init(void)
7 o- k5 ]/ Y+ V- l) k0 S
{
1 ~* G% {6 o& G
/* dram_init must store complete ramsize in gd->ram_size */
8 M( w1 s0 I) J- M0 l8 [
gd->ram_size = get_ram_size(
1 r3 _' I* l1 H& f7 t# n5 B
(void *)CONFIG_SYS_SDRAM_BASE,
- U F- G( z. P- M7 C3 Q& b# l
CONFIG_MAX_RAM_BANK_SIZE);
- D7 g9 A( X( v# t# g6 M
return 0;
7 Q6 Y& D3 V' C q$ R5 X. ?- @
}
( A) J( Z6 _) ^( W* c, x2 ?" m
& N% ?! a0 F j0 y. e- k! x
% \# ^) z/ }4 k$ N# D. @6 G' y
" ^& C2 l, V# O) v7 ?( m' e4 [
9 {) _$ d) Z4 x& I. G9 l
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- v0 n* S" m( U
, C! i' B: u, L7 S3 h( P
, X o: [+ G! R( h* `% M
8 D# H$ Z6 a$ ^9 `* z" v
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4