嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
" F- \) [7 Q% P9 t* D! S2 N
核心板2:DDR2 256M Byte NAND FLASH 8G bit
, F: x5 J6 T, H
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" o" X8 y, D A
, _/ V8 G% \+ ? P' @& n p$ d" V
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
5 ^5 G/ }8 r6 @% i) w6 Z% z
9 b6 n6 q X, ?9 r% y, V
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, ~ k1 `( `: i, C" @# z- K
/*
* [+ S/ Q9 E' @$ a! {8 f
* Check memory range for valid RAM. A simple memory test determines
9 s2 h! E& n$ X
* the actually available RAM size between addresses `base' and
5 ~8 e1 @& C. J0 o
* `base + maxsize'.
5 f' R1 Q' F a7 C7 }: x$ P
*/
- o# b: Q, e' x' J5 u" |0 b
long get_ram_size(long *base, long maxsize)
$ v0 S% k( Q* I( I
{
# f! m* f( C- b& A4 c" B0 R3 b) e
volatile long *addr;
" S5 S6 A* i7 c3 m9 R: W
long save[32];
8 ]) W3 ]# a; D
long cnt;
& c9 w' q# |+ y' K% `: Q2 y0 ^* D B
long val;
: L( z" j4 `( U, v" o& }# A2 b: ^/ c
long size;
' w' B6 B0 k; K& p. I
int i = 0;
; k! V" v! n% d! B, ~9 I$ Y% F
3 V# h/ Z% b- w Z
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 Y- W8 Z$ u8 B5 H* B& H
addr = base + cnt; /* pointer arith! */
& r1 k' r0 A; J# \$ L
sync ();
' M+ s9 f* B6 V9 ]+ F4 p1 Z
save[i++] = *addr;
3 `+ J j! u' R W6 X' l( `* _9 |9 l
sync ();
5 E. ?5 ]& C( x2 u! N
*addr = ~cnt;
( |% M: d" X: N; J5 a1 B
}
& E, X! b9 i% C3 E- m$ E3 m1 j
8 F& K$ x7 Q# x
addr = base;
0 W& c4 a, H. z+ V
sync ();
+ E2 }1 i7 r* r+ a! J
save
= *addr;
. W; @$ Y6 K7 ]( I/ E1 [
sync ();
" C! G+ `: V, W/ ]6 R
*addr = 0;
2 w H! H* v% H2 E h, C4 @0 [- A
' b, C! O( E r6 E( S1 S/ D7 s
sync ();
0 O0 u4 g9 f$ h9 j0 x
if ((val = *addr) != 0) {
( V* A1 p" ?; z) n, c I$ l
/* Restore the original data before leaving the function.
2 K4 B( ?) Q& N. T p2 W! _- |; B4 Q
*/
; n1 X% n' { L* ]: p. X
sync ();
9 K& S% J; J( H& Q0 }/ H1 w; n
*addr = save
;
|" @8 }4 Z9 F9 d9 p3 Q9 ]
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, ]2 t% ~+ s; b6 A
addr = base + cnt;
& R2 Y( G2 x0 C* _& m
sync ();
+ m3 V7 Q" Z4 [3 w& w( ^& _
*addr = save[--i];
1 v: C1 I8 y# Y r c
}
6 c8 f7 J @) l- ]+ X, C+ ~
return (0);
: `& {, X) b' f5 P
}
& f5 v1 g' s" E1 C$ P# B6 k% l
, }9 Q7 l; _) Y/ k1 N
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
P( i+ M" u5 K2 O& W ^
addr = base + cnt; /* pointer arith! */
; E3 F! c5 y2 k) L9 A& [
val = *addr;
# w' i0 s! p$ b
*addr = save[--i];
* `) T, F1 K5 F% w' s( R
if (val != ~cnt) {
: s6 `( a# ^7 n! k
size = cnt * sizeof (long);
; {( K5 Z8 [" X: i1 v$ X# `
/* Restore the original data before leaving the function.
+ A: E7 S5 L5 x2 w
*/
- q+ Z/ D* i9 L4 p5 c! _
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* s9 E! f4 B% j. W/ [. X+ O
addr = base + cnt;
) A- R. u$ W' o/ K5 R
*addr = save[--i];
( @/ A8 O8 g- i3 x7 ?, b
}
" o; g% m- _% r* j5 N( P! C
return (size);
$ @9 @) V0 R3 r1 {
}
@$ _( x0 X9 _5 V3 ~. @% C( M( F% v
}
, Y. t# `1 V! C7 F: b) @8 R/ {5 ?1 I
$ x) _4 |! E6 C
return (maxsize);
1 x* \+ \; r! G
}
2 y) b1 v1 |- ^- ]& N# |5 D
int dram_init(void)
: V6 ? X( X( a A( ]
{
" t) s* }8 l( j+ q
/* dram_init must store complete ramsize in gd->ram_size */
/ v9 }' A0 f2 A. j# Z- d
gd->ram_size = get_ram_size(
- I6 D- S* L. h
(void *)CONFIG_SYS_SDRAM_BASE,
# I+ _7 M/ L& h0 \$ Z
CONFIG_MAX_RAM_BANK_SIZE);
9 D5 I# x+ ~2 g( x; T r
return 0;
: f- y* N/ \1 @8 O1 s+ U3 H
}
4 w& F/ s/ c8 p- j% O' U" X
! Z F; b7 I2 f+ `2 W7 e- r
; s7 y. P, ]; U7 U4 Z
) x* Q4 e: I! C* R8 y/ d/ R+ h4 @
" W7 W; w9 e8 ] W9 T1 S
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. C5 T/ W1 `: |1 N, Z: b
2 h' J( }6 X9 `, Q
1 F- E# ^1 J; x" I5 T% X: k
7 V l2 S9 d7 t. B6 l9 e8 E- y- {$ e
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4