嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
e" I) Q) F" A1 w/ U
核心板2:DDR2 256M Byte NAND FLASH 8G bit
3 ]/ ?& b% d/ E& Q$ Z- m# [
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) @6 o K. p7 S' {# A" R
- j$ V( S( J3 n% u+ ^* H$ m
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
- l% l: T3 ^4 ~* L1 x5 e
, q& K/ [7 g5 |
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" X: X5 [& D& I1 P, e
/*
9 U# L+ _/ C8 b8 H
* Check memory range for valid RAM. A simple memory test determines
Y+ @, k! }0 r4 l+ Y9 R
* the actually available RAM size between addresses `base' and
0 Y4 w+ k4 f! X4 ^
* `base + maxsize'.
# | {+ @. O- L7 J2 Q
*/
1 X% b3 M( u4 T1 c& m
long get_ram_size(long *base, long maxsize)
* @" p& K: f3 k N
{
2 Q5 A% t' x2 L$ w! U
volatile long *addr;
+ B0 f; K$ `/ T- a1 \0 y ~# M
long save[32];
/ f8 q. I7 W1 c9 m# z* B
long cnt;
6 g. @ j" H" w% l# A. n
long val;
4 B- A0 s! C! s
long size;
1 r6 j$ H# n- q( X/ l1 ^
int i = 0;
' B2 h# @0 h' Y" _4 Y! J% P
|, G8 t: J6 M1 r
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: I+ ~5 j! V# I: X( I6 N
addr = base + cnt; /* pointer arith! */
7 s4 _* [; L) L9 T* d
sync ();
. O z+ @0 R& ^* K9 S! n
save[i++] = *addr;
$ f1 v0 O, `" s. ^ @ F( ]
sync ();
. A# H: [6 r( z3 Q. @ z3 \
*addr = ~cnt;
( ~0 z+ B+ H! D2 J# p- R7 c
}
4 a9 g8 R) ~# @- w. t; n
+ ~5 C6 P% @. r: Y5 i# N
addr = base;
* [& t& M" F4 r m5 ?
sync ();
& E$ s1 c& c! Z8 v# N9 O
save
= *addr;
. A3 I! w+ A: q% f
sync ();
/ A; j. L& R! [" Y
*addr = 0;
c6 Y( U* R! p2 n3 m {9 {* E8 L4 U
* J l- U: o1 W/ X! v2 S
sync ();
7 @* [% w4 G# |& z: `' M7 `
if ((val = *addr) != 0) {
) b/ I s' M) x+ O; |9 Q3 [. A
/* Restore the original data before leaving the function.
. r. y- ~$ \2 T) A7 Y8 b) f
*/
4 s( y6 |% Y' _9 f: q! H
sync ();
, S# D" |! G, E2 L9 n4 _1 Z D
*addr = save
;
) ?: f% L. G5 j2 j$ f+ ?
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& r4 {. L( V7 `
addr = base + cnt;
$ U) l& A; c) F; @, k
sync ();
6 [8 O8 R0 @4 h; ~; b$ l% i
*addr = save[--i];
: b% M& h/ Z$ P5 q& G
}
8 y- k, x) O* k4 l+ q
return (0);
! p9 f. M! E# A, Y8 a
}
8 H8 r/ B4 m/ E/ a8 w. E( h5 e
1 W7 t- B3 }& _& W+ c& ?, w
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% S- D9 [/ r0 e9 j# p; y, ?9 M
addr = base + cnt; /* pointer arith! */
5 \# m/ x. a& b8 F1 z5 X( P
val = *addr;
/ H2 Z2 _9 e, N7 f4 ^2 S- \
*addr = save[--i];
6 t1 w/ [& l* ~1 |( h
if (val != ~cnt) {
" Q0 v! ?+ v0 J6 L
size = cnt * sizeof (long);
W% N- d7 G, b
/* Restore the original data before leaving the function.
: c" ?) p& M* ]+ h1 Y8 c* C
*/
9 H% @* A6 ]+ k# F; z4 j2 M+ m" h2 K
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 Y* r0 g9 B0 K- B7 O7 \
addr = base + cnt;
6 m7 C+ s; R1 ]* }* H# S
*addr = save[--i];
5 \! ^" g7 V$ i$ h
}
% r# R4 b& M" S: T
return (size);
; d" L; F- J8 O, }) U- N
}
9 k' o7 [0 T1 V& F: ]5 V# _7 t
}
1 O* V8 [# K3 ^6 y7 w5 ]
2 A8 X1 Q; w5 n2 {) a( @$ @1 ]4 }
return (maxsize);
; [3 B# g% S! i! u" v$ j
}
4 @* m; \9 H% |% O
int dram_init(void)
+ i8 D3 ~! i: _$ P( d
{
7 d4 o4 P6 g: o: o1 Y( v
/* dram_init must store complete ramsize in gd->ram_size */
) R3 J+ O0 ~3 _# N0 O0 X
gd->ram_size = get_ram_size(
/ u! i: Z3 v9 w$ Z D% c
(void *)CONFIG_SYS_SDRAM_BASE,
' ?4 o+ ?9 N/ F- H- G
CONFIG_MAX_RAM_BANK_SIZE);
7 L* `( c4 `+ Q! ]& ?; _
return 0;
K; l9 I" ^7 h7 D# m& d1 p( _3 C
}
5 |7 a( U1 M5 Y0 k: R
' J* G0 Y$ P% n
0 x3 \3 b* `& {% o
9 v% v8 G' c* G! u# T
4 b( n6 X( u8 ^- L/ [
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
: C* D8 w4 c: O" V
; V3 j7 D' f }' Q
, u5 B* j. \) p; S
+ ^) [* q. y: y6 T L
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4