嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
+ i# `" v2 S0 Q5 i
核心板2:DDR2 256M Byte NAND FLASH 8G bit
0 D7 j) e8 m: ]
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
5 a& X" l# q9 ?1 F
# P, [- Z+ X9 G7 `, ]
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; B) t0 `4 Q% ?% }& N: u' }1 k
& x i C5 ?) Y4 P2 P2 O- ^
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
5 a2 `7 @8 C4 N3 G
/*
, \5 \& R+ G5 g- T) _; |
* Check memory range for valid RAM. A simple memory test determines
- f& p: a/ O$ R/ D
* the actually available RAM size between addresses `base' and
/ L0 f9 K; ^% k0 z; X5 p: j" y
* `base + maxsize'.
( G4 C0 H. P2 \' U' p
*/
, {7 [) j6 ]. N( T
long get_ram_size(long *base, long maxsize)
# q* A& ^" b0 L- v9 j1 \& D' P
{
' w9 J* O6 _, U5 u! Z
volatile long *addr;
# T0 j$ @8 ?. g( u, Y" N1 J
long save[32];
4 N+ ?; ]# q0 Y, f. F. V2 o' O
long cnt;
% l; K# @1 A- M$ C7 p5 `! y
long val;
. b# H2 ~7 D9 j* @7 o
long size;
7 z* h' V$ O% k0 U) ^* f! v H0 \
int i = 0;
# A) r% h3 Z# [% q# {
8 o+ J! `7 I- W) H) @8 j. M1 p
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 s" J$ k( d" p7 i; Q
addr = base + cnt; /* pointer arith! */
+ J3 j( c- k. E/ F, j' I0 Z
sync ();
( M5 m' M# f0 K4 e, ]6 k
save[i++] = *addr;
/ y" w" ^" a& ?
sync ();
8 z% y% Y0 J6 z8 p8 _9 X
*addr = ~cnt;
|2 D# I Y+ X% m) j0 w. Y
}
! X2 m% _8 S8 V
! ^: L* F1 q' M5 y+ A6 Y
addr = base;
& D" ]+ \+ O1 x2 m7 g3 \* Z+ U; D
sync ();
3 P1 a! H+ n9 T" F
save
= *addr;
; E. }8 A8 {4 k/ q3 x$ {
sync ();
8 N3 L$ c l; P9 H# d1 w6 R
*addr = 0;
( r1 u* Y0 y4 P B1 h
% C% I1 y6 @( K* Z& `3 j0 b' l4 M
sync ();
$ X7 I2 V% @1 J: Q- }# a0 `
if ((val = *addr) != 0) {
2 B- X" Q- y0 x) V* Z
/* Restore the original data before leaving the function.
3 }( O8 l/ q0 t q9 @
*/
1 p4 {3 Y a. @
sync ();
% O* q. M7 G3 {& u* r
*addr = save
;
' v& y. [' v: k
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 H* A# W: m4 q3 b8 y4 g& q4 S% L2 ], T
addr = base + cnt;
2 w& V! m5 ^+ ^' i% K* J7 @
sync ();
1 C( S: x# L8 c% P. _
*addr = save[--i];
$ J4 l% X- p' f$ Z+ h- u% C' [
}
0 L7 |% q3 Y, k% \
return (0);
, w% S. x$ J! o* ~2 E* i+ i% f
}
f# V4 |% \. F! o
* M- q' i/ H0 N8 W& a
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& W" v! R1 o0 M
addr = base + cnt; /* pointer arith! */
. W% [6 F# I& V( L0 z# H) D
val = *addr;
/ {5 H$ h4 o& R! N- D. P$ c
*addr = save[--i];
$ X: `2 j. s4 q% j! ], H, z
if (val != ~cnt) {
J* j% V$ ~" _ A8 H- ?% O
size = cnt * sizeof (long);
, o0 G8 T, \# R" Y1 q5 c5 Z- W
/* Restore the original data before leaving the function.
' \0 c4 a. ~- D* `2 }7 O! c
*/
0 h5 _4 O& P5 X( ?$ E
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 s/ S% {; Z2 d5 B. M- i
addr = base + cnt;
/ m; X6 A) z6 e7 @
*addr = save[--i];
r3 H6 c% }4 {5 Y5 ?
}
* e7 C( U( d) q- Q. H, f' f
return (size);
* E' c% D: p) [: \
}
; U4 V8 f9 ^ v( r3 A1 i
}
: \0 t7 ^- S5 s1 o. O# n( j
/ g1 S& C B: q" \3 e6 d
return (maxsize);
) |3 x- s4 X- M/ w
}
4 K4 X3 C9 V6 x9 A8 S4 y# ^6 V
int dram_init(void)
6 Y! i4 P% ~7 ]7 A% g2 w g B
{
* ^/ u H/ r2 h3 A% Q. v" j
/* dram_init must store complete ramsize in gd->ram_size */
- T7 p5 J i6 l5 B" d
gd->ram_size = get_ram_size(
3 [2 J, n/ `5 W
(void *)CONFIG_SYS_SDRAM_BASE,
/ h# B% B3 ]! o/ Y
CONFIG_MAX_RAM_BANK_SIZE);
" @- |# _1 C+ N& {( u" u; T
return 0;
. f9 }* i0 i5 H! Y" _7 X3 n: u
}
7 h# o. i' k. U, d# A& d) C
. g ]7 R5 q3 N0 l
5 b2 b* i; c7 k1 H4 L, t
/ }' [' B; u( v8 r' x
" l, g; H1 J) ]9 _
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& h! R; Q3 {$ x8 t% M6 {3 R0 \+ _2 g+ ~
, u5 a+ N6 F2 h/ f2 D
, J$ O6 X! C; v8 ?6 Z
c& O0 L) {5 [) d, [& `
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4