嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
% o& j9 }% B$ }$ {: [+ B
核心板2:DDR2 256M Byte NAND FLASH 8G bit
% [+ L) `, ?" N( h& `5 J2 z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% T) C8 l, Y3 |& q! _ Q* u" ^
1 R/ q7 h$ L7 g" N
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: u/ R4 X+ w- t2 @' A9 l
' |$ R( `2 a& e% H
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 `3 { J. i: `* l
/*
* _+ f* Y, ]0 l/ ?3 S
* Check memory range for valid RAM. A simple memory test determines
" s' G; R5 H) \- E$ J; M g
* the actually available RAM size between addresses `base' and
5 ^! g$ M9 P; y. X0 \5 j
* `base + maxsize'.
]0 ^2 X0 q) |" L Z# B' X( `
*/
# g7 H6 I& j2 C, m5 ]0 E& Z
long get_ram_size(long *base, long maxsize)
7 ]/ [5 Y* |; ~( R2 q7 B% _
{
& l- H/ N& `3 A Z
volatile long *addr;
" Y9 ~" `8 k1 X% [
long save[32];
' Y# q* G" d4 b3 v
long cnt;
' A) l" v8 J/ `& A( O1 B
long val;
" P1 n# t% ~. M" B; [' y9 D% ^" }2 u
long size;
( g- Y0 f6 Y# l) M. D; q# }
int i = 0;
2 U" h' P0 X7 X+ [/ o
3 j8 C" o P: y- ^+ L4 W
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
4 {$ \# ~0 v( [! I( i
addr = base + cnt; /* pointer arith! */
) s' ^3 s ?8 I8 e6 _7 ?( h, M
sync ();
. V7 i5 o2 a% t% ~
save[i++] = *addr;
5 n5 G) a8 O/ w+ x4 M4 w" A
sync ();
- M* N0 |7 D1 Z5 u6 J# k% X
*addr = ~cnt;
2 f. g+ B) s5 ]) N1 O/ s
}
. Q+ v* G$ z1 [7 L
; n( q2 d$ w0 K
addr = base;
6 j3 K5 O1 X P1 Z7 S
sync ();
6 P# }, s" X9 j6 A* ]' f) n \/ D7 v
save
= *addr;
) j4 }) x1 _9 B9 h& R7 y
sync ();
& j" ]+ X7 S. w. g. y
*addr = 0;
4 P5 ` @8 H' k! p1 r- p
! r M q1 e6 l) ? q7 E
sync ();
; R3 R( I5 i' [ ?
if ((val = *addr) != 0) {
0 y, d* E3 X4 d, J6 N) I
/* Restore the original data before leaving the function.
! V( L# n. b3 o3 e( ]6 c# d% b& f* b
*/
4 ]% ^# M: V. _" m8 N' z; D; X J
sync ();
- K) C( x" S# ^- g7 Q
*addr = save
;
1 }& A4 N- E% n4 F; x# x
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ H9 k1 f# q2 F' T$ u
addr = base + cnt;
3 e) d) K6 Y: t( B" K
sync ();
6 y5 v3 L3 R9 y0 k* R
*addr = save[--i];
, _7 K& A8 m1 O0 z
}
% t+ j, H( W% h. y d6 ]
return (0);
7 e& Y& C0 v5 z
}
1 ^: O& W! ~. F7 h, j e" q, Z
/ T% h4 |& L2 t4 O0 H; H0 H
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 H8 p7 S& h/ Y B% V7 w0 u
addr = base + cnt; /* pointer arith! */
* O y, w! B# \, K0 R5 o, ~
val = *addr;
3 S4 ?' y: Q t! N
*addr = save[--i];
5 o. Y# c* |+ ~5 s
if (val != ~cnt) {
# [, u: q% C9 s% ~6 v
size = cnt * sizeof (long);
% J, Q$ `/ {" b9 w
/* Restore the original data before leaving the function.
' a+ `1 M: k- a+ w; ^" _" W, M: T' Q
*/
# l5 `" t( x6 _' U9 \0 ^2 O% Q
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( d/ |, U9 W( J: Y# O9 I) r
addr = base + cnt;
5 i6 w) J2 S6 T4 z. q
*addr = save[--i];
# j$ E* \( P3 s3 I
}
|# o9 [* v; o) R2 ~) l' W
return (size);
6 b( y3 |& Z) X9 v' s
}
2 D' f9 W8 _5 L* b5 h% v3 |
}
& @0 Y' }7 {5 |8 R0 _
8 ?3 ?& n2 Y! v* l+ E
return (maxsize);
) ^, z9 S, h8 J. b6 q5 m3 R
}
; J$ a4 B+ @7 \4 _* Z- E& R
int dram_init(void)
% k7 u0 A/ a, S# i
{
; S: _' o8 H8 w \
/* dram_init must store complete ramsize in gd->ram_size */
- A0 t% i1 R0 a) D
gd->ram_size = get_ram_size(
( |1 f+ X& y: {1 e0 K
(void *)CONFIG_SYS_SDRAM_BASE,
& Y- b! |; R4 t: \. r
CONFIG_MAX_RAM_BANK_SIZE);
& I3 L$ @/ }# H
return 0;
. n Q9 F- ~4 d
}
7 j& `. A, v1 N' f* D/ _! @# W# }
; W H& W% U, ^. a; _
# _( D+ ~+ z8 h% X8 ?+ E
" ^4 b0 y: b5 j6 d+ K2 R& H
& @& R) J- \; r* I3 t
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
$ [7 Y, X. y# F9 V' G
3 @1 `" P2 l' k* d/ x4 S) Z
) O: K: d1 ~6 I& R& J/ E) x
* B5 H4 t& G; c) K* ?$ {
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4