嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
0 A3 _% @* F8 ?
核心板2:DDR2 256M Byte NAND FLASH 8G bit
: T- J" ~9 \1 v
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% w( ^, ]' B q$ G* v, Y# b+ `4 N, L
* h5 V: [5 ]8 A+ u8 W) V
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# Q/ A8 x5 {! ?/ \
/ p6 k V; C9 ]" H4 n
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, J4 I9 r P1 t2 M9 b. d
/*
! h0 U" v- E) C! i, f; h) e; h" l
* Check memory range for valid RAM. A simple memory test determines
8 y+ l* N4 A3 b
* the actually available RAM size between addresses `base' and
- m- O- h6 z' N& m1 g
* `base + maxsize'.
* I6 U5 i. w+ h9 q( K+ \2 h! S
*/
) e1 s1 M; U3 M' L8 R9 d1 p
long get_ram_size(long *base, long maxsize)
8 m+ V+ m3 Y7 [1 ?+ C I
{
1 }. x' p. c+ x* W9 ^
volatile long *addr;
( E7 q$ C$ e) G8 @
long save[32];
( e, q+ v, @$ @" l, K, i% }
long cnt;
$ m6 W* t( J6 l' Z
long val;
& I- i- {3 }3 T: i8 |
long size;
G2 R; D, L7 M% w9 Y9 [
int i = 0;
2 Q" [2 v6 _+ k2 N9 |
! ^1 q, z4 b- y
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( p/ K' E8 k! Z, O2 ^3 g
addr = base + cnt; /* pointer arith! */
6 m1 E- e! s9 J1 r7 l; D& D4 j
sync ();
6 d5 h0 a4 {9 W9 k- z- Z
save[i++] = *addr;
$ G5 j6 m) i5 B2 [
sync ();
6 z3 W4 ]0 r2 S# M& x- C! i
*addr = ~cnt;
8 f1 J& y0 m7 B1 U) o( ~5 n
}
! z' Y4 r! U3 R8 S' V7 \
3 ]5 {6 d k5 [1 N3 N2 n
addr = base;
) g ?* ^1 v, v$ t
sync ();
. v# A. P0 f" i
save
= *addr;
/ E9 ?! @0 C: ?& V0 e: C
sync ();
3 @" j# _! a; i9 A
*addr = 0;
- d* R2 j9 N0 o* y: ~& ~
7 v$ V0 H8 p# ?+ I7 o0 o
sync ();
1 s* N* T. g( H
if ((val = *addr) != 0) {
# P% W$ T* Q L* S- g; E
/* Restore the original data before leaving the function.
1 l/ H G, |# n4 V7 N3 I
*/
) k& @/ w) H5 V" r
sync ();
) \( a, _, U- t1 c3 x# ], G$ m
*addr = save
;
) N$ d3 `! [, @
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 R$ x' \/ F1 d% ?# g
addr = base + cnt;
2 U$ K! D6 w: e& l( m" X! G A
sync ();
5 I9 g! M3 y! q! t% [, g5 A
*addr = save[--i];
3 ^# R4 c0 S, G9 W) M
}
: u) u0 [ d- r% W
return (0);
& @0 d9 [6 Z' X' z) b( }
}
) A, \0 |$ Y* X; E Y
$ I1 n; q8 u% v# ?1 t( v& l
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ b! ^/ S. f2 f( e6 R1 c. O9 B5 `3 T
addr = base + cnt; /* pointer arith! */
: G: N$ f" p9 V6 z6 n6 [- Z
val = *addr;
' p R& u: E" m; h0 @
*addr = save[--i];
( B8 }: x8 K0 `' Y7 i& f
if (val != ~cnt) {
* l/ k8 g% Q F) P4 I7 g- q# p5 B
size = cnt * sizeof (long);
6 @, w+ k6 L: ?% Q1 r
/* Restore the original data before leaving the function.
, y9 S, B; \& j
*/
# C! t6 |3 |2 v1 i4 s6 C
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% e* ?/ b) I/ h1 I" X3 ]
addr = base + cnt;
% Y- t# [1 f2 ]3 v" c
*addr = save[--i];
- O- x( w% q$ H- a( [
}
+ H% ^& z' ~- K+ J* B
return (size);
/ a- W5 m* T: E" d. ~6 Z+ r `
}
" k. X1 r2 Q4 n. n8 f2 H* U) y
}
! ?3 [( }$ C& K$ s( X s9 Q" o9 L
U* I5 Q4 Y4 o. W
return (maxsize);
3 o) w9 e9 o5 h+ w
}
: z1 s& ^: G2 ]+ r, u
int dram_init(void)
/ Y( w4 L. p( M4 R# r3 E! A
{
" A( S! X" u" d3 t5 @7 W
/* dram_init must store complete ramsize in gd->ram_size */
% R6 ?" A. A- r) F7 E
gd->ram_size = get_ram_size(
; h, y3 _0 d" n* n3 d, _
(void *)CONFIG_SYS_SDRAM_BASE,
8 u% s3 J I! u: D g1 R
CONFIG_MAX_RAM_BANK_SIZE);
: K9 P j8 z, L+ x+ L* W
return 0;
* j4 v9 c4 Q, S
}
! s. h6 L+ ^9 e: F9 j
. l- V# `: q0 L2 Y! ]) c
V1 a/ N: Z4 x! Z
# L# E% G/ e4 W+ I2 \3 U
! O. \5 @& ~( N) T
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 s" W' P( |5 r) x+ w) g0 z
; g) }( i9 K3 I" F1 }5 \! M& R5 M
9 x7 o9 X/ T3 c+ T
$ F! n; C* i/ j# M% }5 S
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4