嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
0 l5 \1 b, W! G9 ^5 }1 D5 M5 V' n
核心板2:DDR2 256M Byte NAND FLASH 8G bit
& g$ y, d, d7 F) z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 \: `9 h! ?( W
/ @1 V. n8 @) z" g+ z: N7 h
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 b k4 F" J1 E; t+ [
1 |$ Q0 G; {& c: l8 j4 a4 r: ]
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! o' V5 H- t6 C( T
/*
( }( g. {/ S6 Q4 i1 e- ~7 _
* Check memory range for valid RAM. A simple memory test determines
% S' s) b: ~% o8 c& V; I
* the actually available RAM size between addresses `base' and
8 s+ A6 I4 |! U$ R* W
* `base + maxsize'.
4 M+ b5 E6 P0 V$ `' F; p1 I3 V
*/
. t) ~4 K' `) Q% j) V; J( s9 g
long get_ram_size(long *base, long maxsize)
" _5 [6 O& ~9 t' H
{
I5 _! w) s+ J* v. o
volatile long *addr;
% P _8 q6 { S' Q' S; o) Q
long save[32];
( q0 J# {- j6 P* G1 u" j
long cnt;
: g! k1 R' ]! e2 B8 B5 W( r
long val;
1 v9 r; A; `& u
long size;
; p# ?' `; s2 u! T
int i = 0;
& B+ a4 j2 t) F) U
0 l4 ]! w) A' l# |7 x7 w8 J% T# A
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
; j8 Y F: r0 d: f" Z& `! p
addr = base + cnt; /* pointer arith! */
& D7 u# b: h- N, E" ^/ I
sync ();
) U; z0 `6 n1 D, V% P
save[i++] = *addr;
* q. j G+ {' W1 k& I: m( f4 _. w) M
sync ();
5 f; ? Y% H, X4 r7 |$ V
*addr = ~cnt;
# Z# n+ O7 j# s7 l+ X
}
U6 v1 v0 l: Q. {5 Z6 D; D
4 m6 s- b/ Q9 _2 t' [! g# Z
addr = base;
{9 F+ J- S! x
sync ();
0 Q8 D. v/ u% J y- @, f
save
= *addr;
1 X$ a0 S: j) w
sync ();
$ g N# {8 D4 ^& B* j, W1 Y' c
*addr = 0;
5 L% i+ q2 [" G4 c# r' n
, o8 q' @+ s% ]% ^$ A) P7 Q+ z
sync ();
! _+ a& ?& r- Q" _# Y9 }& p
if ((val = *addr) != 0) {
" W0 d3 p" v$ t7 U3 _/ X; @
/* Restore the original data before leaving the function.
. u# w* D6 Q3 l! L7 X( `
*/
2 C2 g, ?+ F0 R3 G. I$ J
sync ();
/ f1 q! b6 }* E2 ^+ v; l$ Z2 ]
*addr = save
;
) M0 C. I: ?' W: z# \/ h) u3 n
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& c( M; @- D1 A$ g" ?% q6 }
addr = base + cnt;
9 I1 c/ l- }# l+ C1 \
sync ();
( I& ~5 R6 X% x
*addr = save[--i];
' I6 C( c+ s$ ?5 O* X
}
- g3 N) i0 y: h) j z5 R
return (0);
0 z. O$ t$ z5 X2 r
}
6 f. n9 l# N% _( A0 t2 T8 K
6 v) F* p$ |3 R9 p% y
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ q2 n! I; d4 d1 U" `; q; @
addr = base + cnt; /* pointer arith! */
/ [0 ~( `9 _% U0 B
val = *addr;
o) P8 M7 j. Q' J/ [3 ~
*addr = save[--i];
5 g4 a: v4 |/ t* k# ^/ L8 A
if (val != ~cnt) {
3 S5 g7 z4 C) O# x
size = cnt * sizeof (long);
$ c5 X* Y# G; G6 e
/* Restore the original data before leaving the function.
! [; Y. V) l6 b
*/
" I$ L- ]# m% Z: V
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ m6 n# [, C0 s# x3 V3 b+ m
addr = base + cnt;
- H# m& b' K/ }% b) i
*addr = save[--i];
( u) \% m) u+ B( a
}
* F0 r# l' p+ ^1 _3 D" h# l' E
return (size);
Z7 ^$ `% Q1 O- Q/ L* _
}
f1 F4 n6 _4 Q* X8 {
}
3 ~; \" `% N1 P, r
4 P9 @" Y7 G! s, J
return (maxsize);
, T8 T8 `& W2 h0 X! s; ~6 [9 X) d
}
4 d3 b1 K0 y& B! z8 D
int dram_init(void)
. k5 v3 A5 p) N# w" B5 q
{
' \4 E3 O8 E: v1 V6 |" D
/* dram_init must store complete ramsize in gd->ram_size */
2 w. E: N+ O+ {
gd->ram_size = get_ram_size(
0 i8 q& t2 ~( m1 Y4 {
(void *)CONFIG_SYS_SDRAM_BASE,
& o: l* [& @- C. ]+ b6 {1 O2 @1 b: S5 B
CONFIG_MAX_RAM_BANK_SIZE);
# [$ }) \8 C, E0 n0 i
return 0;
8 j k: u: X* M& E
}
0 o4 t7 d7 M% p1 J) L
. Y. }/ a7 p4 k
& y0 ^8 X; H' N
# x; {/ C) m! b5 k: G( T, @
" T9 z& Z2 a4 N6 @9 C; F
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% p6 K; a" v2 {, h3 i, q! S
5 O" h- L) p& m2 S+ ^# Y
( k6 K3 [: t( I; \" H% K
& Z4 X) k& G. D& L, S& o9 j
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4