嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
5 \& `. E2 Q4 {" \& o
核心板2:DDR2 256M Byte NAND FLASH 8G bit
6 w1 \, g, M0 N* o
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, t4 A6 ?/ T* l, c- e2 e: l
5 m; a4 N B4 `
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) V; R0 [2 v; f% O6 f) { a \
3 m, n5 L$ ^3 B, z+ I* z& k Q% n
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
; T5 S( ?2 i4 Z7 T* g9 F6 y
/*
5 P% ]4 N2 ~" A; [# k# q* Q
* Check memory range for valid RAM. A simple memory test determines
2 F5 p& q1 S! I. Z& O
* the actually available RAM size between addresses `base' and
" C- x& T! F* K) N: F
* `base + maxsize'.
: }" p0 E7 Y$ r/ R% X" b; B1 W
*/
! j: R/ l# I6 I A: Y ^2 Q$ `" z
long get_ram_size(long *base, long maxsize)
6 j( q) o2 D6 k7 K8 L
{
. [+ |8 K6 t' @7 [7 ^. c
volatile long *addr;
) {- J2 t, ~2 a2 p" P
long save[32];
9 f9 p' n8 h! t7 m2 V, {
long cnt;
& x7 T& |0 X/ \; a9 v, x4 w
long val;
" k5 N6 t8 X6 A" f3 u: U
long size;
% B/ R% n8 y3 N; ]2 K+ b: J
int i = 0;
% h4 J$ A+ f' z/ {
/ Q9 e) A a: P7 s+ v
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ J c# J6 ~; w
addr = base + cnt; /* pointer arith! */
* a _8 l- U2 |# v
sync ();
/ s. k7 P6 @' c
save[i++] = *addr;
2 H! T- v9 z' R g4 G. P
sync ();
- |( h5 B- t% Z! L1 e c# t' K7 N7 ~
*addr = ~cnt;
% \9 u# Z1 {: W1 f
}
3 o; O5 Z1 D7 D5 q: Y Q
/ o/ o' K9 g( ?; \) X2 O/ g
addr = base;
0 ]- |8 l: T' a" O# x# h* w
sync ();
0 F2 F F& a# X9 G
save
= *addr;
4 R j, q% d5 S9 a: A
sync ();
7 K0 X, o4 \+ E4 a: B
*addr = 0;
9 s+ Y `7 d* P3 M2 M4 I3 j9 O
( s9 K* o. v' [/ p" R; m
sync ();
3 }& ~, W$ L+ V; P5 I6 h
if ((val = *addr) != 0) {
/ o d+ [6 _# B0 ]- E/ J
/* Restore the original data before leaving the function.
]1 H6 G5 y3 ]& a3 l" d
*/
( {- H& Z8 m, X. F: |
sync ();
' q0 r* |4 L' E! X9 j; p
*addr = save
;
4 Y R0 b8 K' C, H8 P% s
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ B. r! R9 u5 J! ]
addr = base + cnt;
. {- a: w: s5 x( j/ f1 N4 L3 n
sync ();
. S3 h3 ~3 ^; U A( O& ~
*addr = save[--i];
* A7 i \ |& C" ~
}
* v, k) j8 P0 [9 d) q- |
return (0);
) {' _% m3 G9 D) ^3 Z" k% K) A7 _% D
}
, z& r1 r3 }6 K A! S' R& W: k( M- N
- Q9 }2 A$ a# g. c& S% {' }
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% a9 _8 p& s2 F6 `" u% L
addr = base + cnt; /* pointer arith! */
X# `, M8 ^ ~5 V$ C+ y2 k7 Y
val = *addr;
8 I) }% E; M% ?' W$ E' W1 W0 C
*addr = save[--i];
2 {; u- [. _: @
if (val != ~cnt) {
0 X: g0 X: f% X* p1 B: H
size = cnt * sizeof (long);
& I8 O/ q* m7 f% c+ x% f7 } a* c
/* Restore the original data before leaving the function.
9 g) U5 ^" j! Q# V: E6 E
*/
p" r+ [& {; t6 J; G# y& V: c, o! j1 q
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' r" v4 K6 @7 m
addr = base + cnt;
* i3 [$ P( g3 g" ^: j6 Q* r
*addr = save[--i];
) Y% g& K5 [# T8 A p+ G
}
: A& r' r }6 M# f8 R: h! D; A
return (size);
( ~ I! E i" z
}
: m+ N& x7 ^; w$ l' q: Q. ^
}
: e, i7 r B8 J. k1 d6 Q' _8 c
, k3 g X7 d/ D! p0 S
return (maxsize);
. n# ~ e' z9 B2 N+ y+ K
}
0 s0 O# X2 S: @$ _4 j; A' T7 |
int dram_init(void)
( K% d3 J9 C2 B; p% d, Z
{
- t/ e8 y: { [* R6 H1 d
/* dram_init must store complete ramsize in gd->ram_size */
6 S% T' \' R8 r2 z* R
gd->ram_size = get_ram_size(
6 h( R) g8 t% z( L+ _5 Q
(void *)CONFIG_SYS_SDRAM_BASE,
2 C" X" ?- M- G8 v7 T; o* Q. d
CONFIG_MAX_RAM_BANK_SIZE);
; V8 E& Y a2 m* N" V- h
return 0;
. J& ^; B* o. r5 u0 E
}
" m( d0 Q3 e. l" V2 H& z
" L" O- U% k$ P$ y$ \: h0 @
! a8 q/ W+ ^ y g. N" c; o6 l
" Y% Z6 T$ l1 {) {: h, J
3 R, N: I: _8 ]5 s
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ j# h: z% P3 T# @& u/ l
2 `0 f1 T% G; H' G# c
" m. f& O. Z( G c
' [0 E5 c5 z2 x# p/ T
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4