嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
u: v& v6 g; L: z: ^
核心板2:DDR2 256M Byte NAND FLASH 8G bit
. R& ]" D {0 u! e5 f
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. O3 u% O3 D, N! v9 J* `. L. T0 T
n8 {; O* g2 U; }8 r/ a
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 w( e+ N! P2 y ~$ Y9 ~5 P
9 _: Q4 b8 y8 _. H" E
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! e6 ~& j8 Q* ^' j
/*
# Y3 p4 Y/ b7 `# ]) t' X
* Check memory range for valid RAM. A simple memory test determines
# a& T$ [ G' Q5 B8 p3 S
* the actually available RAM size between addresses `base' and
5 ^1 t* w& r1 ~ ^% o
* `base + maxsize'.
0 G/ s3 J0 R1 j7 D: I8 H
*/
, Y5 x0 k" e: K: X
long get_ram_size(long *base, long maxsize)
1 J$ O" u; y! [; C+ X
{
5 [( `( D# G" S+ }3 _/ R* r& V
volatile long *addr;
8 l9 b# _5 [- j
long save[32];
4 P1 M0 Q& F/ U, A+ U" [) |9 x
long cnt;
3 z! v9 ~. m: F/ ^- k1 W
long val;
$ ]' A4 R9 {3 q+ p0 M- a6 U" p: [" d" W
long size;
& _) Y6 y3 K, Z6 d' V9 u
int i = 0;
- e( }* ^ Y9 J1 K2 k- @3 L9 k% g
& Q( f) e: e Z6 H; ]8 T7 N
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: \9 s( B2 w. s
addr = base + cnt; /* pointer arith! */
- \3 D2 f! |) O+ d$ M/ [; M* M" h
sync ();
% {' |: A7 F# \, Y$ R+ ^0 C
save[i++] = *addr;
/ h# N+ d } ^; `" a
sync ();
$ m+ q& s. E/ a7 }0 h- ]! l& c
*addr = ~cnt;
) r9 I: A& t: I2 M8 h
}
* O( ^8 q6 H+ ^$ y" S
- @; Y; v5 O* d1 X) a- d3 @0 [
addr = base;
: i7 C4 Z+ L; L1 y# e
sync ();
6 F% ^' d% U" O8 H6 [' w& \2 ~! d
save
= *addr;
; [/ F3 H: H) P' J( U) g
sync ();
" w6 J) _9 O5 `' |6 s/ I/ G5 o9 z
*addr = 0;
, ^0 y7 y6 W. e' \2 L* Z4 E5 S
0 B' X# d. l' i2 A
sync ();
. b R8 p+ ]$ O
if ((val = *addr) != 0) {
( B: o/ J) @& z
/* Restore the original data before leaving the function.
7 m# z. ?; Z5 j- B G9 C
*/
3 U, f, P% D. W; P, B
sync ();
/ y1 } Y \4 p2 K' G# j
*addr = save
;
( D# n# w8 q/ d7 b0 W1 b6 I
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; \! Y5 d5 ^# [: y3 Z' k+ u6 l8 K
addr = base + cnt;
" l0 l9 |% a+ ?* q* @, X
sync ();
$ p0 v( D' |# ~" o
*addr = save[--i];
; B/ j& Y1 J L/ H" l! Y
}
, [+ h/ a4 X! P% {) J
return (0);
( s1 ?0 W9 \( _, A5 f. u
}
) _9 ]% j$ ]" j6 e3 H% G- h
- |6 p8 H, a2 g' W( V" A
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 Q4 ~! S1 ?) G" L4 R! p
addr = base + cnt; /* pointer arith! */
4 T1 S3 Z6 L4 F& J
val = *addr;
& o* B: k4 ~2 z8 J
*addr = save[--i];
/ a0 w9 A) K- ?/ |
if (val != ~cnt) {
$ g# f9 a; s& i/ ~& D% a0 v
size = cnt * sizeof (long);
4 O" I( [9 ^# x- ?7 X
/* Restore the original data before leaving the function.
8 O: O. I0 e, M
*/
" _& P6 p& i, {" s0 l7 q
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 x s. t! m8 s1 k
addr = base + cnt;
+ ]( Y$ k' }5 g9 i0 T
*addr = save[--i];
" \' Y C4 C0 Y% @* e2 R" O
}
" A: S7 ~3 d) M1 }' D
return (size);
$ y; U4 P' s# O; D7 d# K9 x
}
+ m) [" G; d" m5 _! q3 y0 ?# g, _
}
7 C. ]& A: L, B' T0 C% t+ Q7 P" J) ]
: B# s7 d* t0 n H: q
return (maxsize);
5 G6 R) Y$ i: r2 `( Y+ w
}
* i9 p) [9 p) c! g; g! x% ?# y
int dram_init(void)
/ h$ t+ N- x- H8 P/ Y/ M; M1 q( B
{
; f7 a/ C) y% i, Z
/* dram_init must store complete ramsize in gd->ram_size */
* _4 b1 b/ m' A# [4 @5 q5 q3 A
gd->ram_size = get_ram_size(
# C2 A( o7 @" y4 y0 M2 B
(void *)CONFIG_SYS_SDRAM_BASE,
$ x1 `$ @7 A$ Z c, |* m
CONFIG_MAX_RAM_BANK_SIZE);
6 ~8 K A* ]$ w) P- {3 q/ `
return 0;
# i% w: G! O2 ~" R8 b' ]5 D( ]* J
}
/ f& v& d! D/ \: \1 e2 W
, h) l; O6 u$ Q. l+ b
, I9 {: C1 F) R$ o
7 {: b2 ]5 ^( V- c/ P
% u* r8 z" n/ B4 y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. u- U$ N9 c, _1 R0 l
% K9 Z7 T" ^2 M' Z- Y! \4 I, Q
3 ^. |+ R$ z. Y: P# T% c( Z+ W% ?: f
\- p# Q" m) G- W v! z$ R
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4