嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
: f K6 b. t: `4 S0 R9 c9 [) K
核心板2:DDR2 256M Byte NAND FLASH 8G bit
}6 a' T2 A; H8 d- |
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% O, d1 J3 L) ^. D L
0 g0 [8 K# [% i% p) `! f! Y/ O
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% k A$ l# @( H- s3 d; S
8 o: c; w8 Q- E& B6 ^
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 @/ h) S# w: e7 x, K, T! }+ M. J. P
/*
; j* d3 Q% n5 F( {) @( x
* Check memory range for valid RAM. A simple memory test determines
8 s/ l5 Y' H" ^3 }# ]
* the actually available RAM size between addresses `base' and
8 b# _! \9 D% q9 B
* `base + maxsize'.
$ Q9 R) [( r |: D$ |' q, Y
*/
% w9 l( z% q) Y! K# R0 G9 i
long get_ram_size(long *base, long maxsize)
9 _ f) V! P9 o2 Q5 Q& b/ \8 r
{
, T- m* p c. i7 T8 I# G- T
volatile long *addr;
$ [. ` ^- T6 N3 O8 A$ u! z0 L* ?
long save[32];
: O' n1 ]8 T$ q: t: @
long cnt;
1 C& |, K" t: } t. ~; E
long val;
& [: D5 U, s3 ^" V
long size;
8 g- M5 U t' R8 U+ v# P+ p: s
int i = 0;
1 t0 Q, e. o6 e: Z* v
% O3 r( Y1 p) s% c/ X) }. D# E
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 g) M) _ Q. y! A; Z: d# b
addr = base + cnt; /* pointer arith! */
9 h' M6 ^8 J9 p7 x5 E
sync ();
) z2 z0 O+ Q- J2 _/ Y$ c8 J; Q
save[i++] = *addr;
5 Y% k+ }% D& y. j8 y& B
sync ();
! j( m) a- i3 I0 H! M
*addr = ~cnt;
) L( R, i( k# y5 E+ r
}
" w- [. O2 ? s* W4 a3 {' }" L, ]
. \1 p- z: E( P! G: H+ u
addr = base;
1 ?7 m1 M; q6 f! Z8 \6 b# Y
sync ();
+ T$ A4 S- T& |. z N$ Q
save
= *addr;
# s4 f: i5 Y' l" Y m5 k- o7 F
sync ();
( I6 j; \$ e& w9 W0 Z$ q# m7 k) i* D
*addr = 0;
. r& \9 R. [" A( L0 ]/ g3 H
W" `+ B+ N( o" m3 ` U$ _* G4 H; i
sync ();
! M |6 S Y( O! B% G4 m) p) p
if ((val = *addr) != 0) {
1 _ g! R# K, M8 N) c
/* Restore the original data before leaving the function.
Y! N! S4 G/ {
*/
! K8 j4 c5 t+ A a: T
sync ();
. o; t( _$ h. g) m) U6 o" R3 O
*addr = save
;
& a/ |) c2 Z ~1 x
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ C. K$ s1 i" o6 _7 e4 E* L
addr = base + cnt;
) L0 m3 e' b8 ^8 i
sync ();
2 H0 g7 H8 i$ f% L
*addr = save[--i];
) X- }& ^7 _, D2 z' h
}
$ `( o: b6 a# U/ l; M* f; ]1 Y+ y
return (0);
& d+ y% W9 |- E. u
}
% {. \0 \! X2 O0 x9 D p) _
- v% k [# u7 X
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* ^& ^* P9 V' K1 h( G
addr = base + cnt; /* pointer arith! */
% J+ u8 z8 K. h0 _" o1 _( ?
val = *addr;
; }* T- i+ F/ X
*addr = save[--i];
. {6 G3 s2 F o
if (val != ~cnt) {
$ L; g m# c- F: \1 A
size = cnt * sizeof (long);
: e6 m6 s8 o$ z: B, V# _& _; C, y
/* Restore the original data before leaving the function.
6 Y- N6 d9 ^. u+ X& M! N+ O
*/
" {7 T9 u* u( P+ O, [+ S
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 X1 E5 `; O! n7 _- J
addr = base + cnt;
) _. S( a. o/ @. L$ ^, D" U# t' m
*addr = save[--i];
; {! s+ K3 m$ x, a' c
}
% g1 G0 F) p2 p/ n/ W
return (size);
9 _6 Y/ w L/ N; S2 E+ V
}
, c1 O8 c) ?8 ~: Y- e
}
7 U4 d* J; J& u' P5 \0 p* B
8 L" ~7 v% H& @2 j. A
return (maxsize);
$ ^$ K3 d" I" Q
}
7 | K& Y g2 v, X% P) l
int dram_init(void)
+ e4 B" p3 _7 y# `0 U# ?
{
2 c6 R; f" E7 e3 G
/* dram_init must store complete ramsize in gd->ram_size */
0 O' q Z. x! O' |( n
gd->ram_size = get_ram_size(
9 M9 v, j3 K1 J
(void *)CONFIG_SYS_SDRAM_BASE,
1 A+ M; V% ~3 T3 N: [7 q
CONFIG_MAX_RAM_BANK_SIZE);
9 D1 g+ x% p! }4 o- \
return 0;
2 f4 S) J9 b: @
}
& J5 i8 l" V- w' `1 x
" I8 m2 P* \: x( e2 {; R" |
/ q9 ]0 o7 j3 b# L3 x9 O* G$ L
. H5 Z/ @ b& D0 k
2 z3 m: z" Y$ _8 k0 L
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
$ G$ o3 m+ l" d0 k" \/ a
. F+ Z+ W- y: r4 l4 U# h
, h2 C! k8 E% G
2 u8 R1 B: b/ w/ X0 S- S
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4