嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
Z, R$ u! Y5 i) m9 i
核心板2:DDR2 256M Byte NAND FLASH 8G bit
& y4 E! v) p Y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) k+ w: t# m9 r6 N" m0 [7 o7 T
" U9 }6 E/ ?' s2 c9 W4 ^1 @
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
9 E) @" S7 y V- i0 i6 J5 T( q/ ?
( o8 {* H8 O; R* Y2 F9 a# _/ D8 \& ^
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& W6 b! o3 h3 b0 D
/*
& E0 f1 P7 g" E
* Check memory range for valid RAM. A simple memory test determines
1 l& M) m1 n" V% l4 H# o" n
* the actually available RAM size between addresses `base' and
8 ]: q- F! \ j3 Y# x! z' y
* `base + maxsize'.
2 f. o! k; x6 f i
*/
" B* b A! E4 ]
long get_ram_size(long *base, long maxsize)
. x w# j2 F0 ^( [% j' P
{
, C/ z' S$ g4 Y" z; Z
volatile long *addr;
0 g$ i8 s/ Z- O- d9 j
long save[32];
& }( |# K, U# o5 P
long cnt;
x% j5 D* Z* C7 a8 b
long val;
+ g- A5 @9 k. G y
long size;
1 H! O5 M; O# P+ U: O0 Q
int i = 0;
2 ^0 i! B7 c2 r4 C# w3 V- z
5 s5 Q. k; k% S0 T2 M2 S }
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# s# D! \; {6 C0 E+ e( m* ]
addr = base + cnt; /* pointer arith! */
3 O8 Q: Q2 {) E) X; l9 g
sync ();
5 v+ y3 o S& h# A4 P
save[i++] = *addr;
$ C* u- z# F4 t+ Z) Q! }
sync ();
* N a% v, h. h. K8 c5 M
*addr = ~cnt;
; g1 g7 L& _8 t9 M0 t/ Q9 _9 `
}
; F& E) u% W: x' q2 L7 [
" {+ J9 }. V+ i$ h$ ?) i# z0 J
addr = base;
9 ^9 N/ E% j" R3 V6 d
sync ();
) h# L& B N* @5 Q: `) v
save
= *addr;
7 b- u8 j) I _+ a3 J2 w
sync ();
4 n2 V* e! U' W+ p1 X
*addr = 0;
& g. w7 m: L1 D) q/ |/ j2 y
$ v. P1 g! H8 z6 v8 b+ f
sync ();
0 D9 ]8 ?6 w$ v9 X) H! \
if ((val = *addr) != 0) {
2 C$ q1 B: {" }
/* Restore the original data before leaving the function.
$ b( c8 Y$ l" K* b$ F8 e( E# X
*/
0 R: X9 u: _ r1 T1 r
sync ();
w0 f* B6 h9 v- a& `5 Z P
*addr = save
;
+ }, |/ z$ H3 R, B: Q4 W0 S
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ U+ ?( n4 E+ k: K7 k
addr = base + cnt;
$ ^2 `6 g' y2 Z6 N" C
sync ();
. v! H5 M! f" p, e3 _
*addr = save[--i];
2 z4 @, K2 a1 v8 s
}
, G+ E) D9 G: s) R) n
return (0);
; M" r5 |& W2 l* X6 o% }8 r1 H/ e
}
# F/ Z+ q, M: {( C+ g" V1 c
: g& U. D. n8 s* g6 g8 i1 K
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% N/ m- m7 y4 \! q6 l5 h8 A" z H1 k
addr = base + cnt; /* pointer arith! */
, K$ b/ }9 |) ?7 @1 N3 F) g1 `
val = *addr;
9 ~* W' X7 k; Y: {
*addr = save[--i];
* B6 `7 e+ ]+ Q
if (val != ~cnt) {
0 z/ s" S, [! b5 ^
size = cnt * sizeof (long);
! [. E _. u8 Z$ I0 ]1 F
/* Restore the original data before leaving the function.
2 Y: Q3 k6 Z# }+ {: ~! e0 s
*/
4 l3 }" Y: |! t
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 E& M$ L7 J; j! `5 E
addr = base + cnt;
, Z( N" O+ d6 G: y( G+ ]# x
*addr = save[--i];
8 Y9 ]3 d/ ^9 o9 I. w1 s
}
# e2 F7 O9 G+ y) T) G: s/ v
return (size);
( ~0 _ j( L8 b, a; g& M
}
% g1 C9 v- y* ?6 D& C+ ~/ ]
}
% G" U+ x% E" U. E, r
' k! ~" J, g1 D# Z3 @1 @
return (maxsize);
4 I; p' e! F3 h
}
l; z6 N3 D4 R; ]: r0 n- s
int dram_init(void)
* O% Y) D# E. [% ^
{
$ L2 a( _, Q! u/ ^4 g, ?
/* dram_init must store complete ramsize in gd->ram_size */
+ B" k, k% c7 F
gd->ram_size = get_ram_size(
( ?0 W% p& T3 s0 T! ^- J+ ]
(void *)CONFIG_SYS_SDRAM_BASE,
0 d. ~9 h! Q+ r% E) X
CONFIG_MAX_RAM_BANK_SIZE);
5 a( `- ]6 W3 C; S* R0 j
return 0;
8 @; M/ A1 X5 S C& l
}
# H( V) B* o& V, B5 W
+ g) L3 X2 i5 s; o g! F o
c5 c @7 r' a9 e
7 u F2 Z0 z) z5 d" f; t
* P' R8 H' N& z( o: x& o- `
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
3 U/ ?6 d$ N% a+ U) u8 A
) a8 |9 |5 D/ u! V' Q8 W
( h$ D4 Q/ n8 M5 T' X5 g/ @! P
6 H6 z# ]- Y4 ?4 r6 U* G
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4