嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
- K% d$ g& `1 {
核心板2:DDR2 256M Byte NAND FLASH 8G bit
! `' ~1 U! a& H6 F
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 x' q! |5 A& m7 }+ Q
3 h9 y: y" e+ o
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
0 G& P2 y4 x0 Z+ B6 l0 Y5 _7 E
2 N8 F: R& e7 u! p" j/ n @
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! s& y7 f" X, I# F
/*
8 L& i3 G! r& F6 j6 R5 @
* Check memory range for valid RAM. A simple memory test determines
# m' |4 f* F: }$ Y
* the actually available RAM size between addresses `base' and
$ b v2 D* |0 U4 H q. `, i2 t1 O
* `base + maxsize'.
7 s. Z: }! p# m. L |3 I3 ~6 X. q
*/
( a6 n# @* g5 H
long get_ram_size(long *base, long maxsize)
( [( M( A7 \5 C& Y8 J0 W1 q) I. k
{
" S* K9 ^ Y! D" X8 a1 A4 t1 n
volatile long *addr;
: W& l" _7 z' u0 o( f. ^- ~
long save[32];
: c- }0 f5 i: Q+ a" u" Q) X
long cnt;
- T6 V R3 ?5 ^& C; q
long val;
* w0 U- h# x% e" D6 l/ S1 S
long size;
+ }4 k3 B; d% C! x' w
int i = 0;
. ]5 r9 j7 u2 i& _, O
0 }0 T; f0 g) _
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 g" \' F& Y1 X/ ~/ U& p- O
addr = base + cnt; /* pointer arith! */
2 ~/ i s$ H9 h' s0 {
sync ();
4 m5 W( l+ V4 T6 G& y
save[i++] = *addr;
' B5 q5 f1 V0 h; c
sync ();
C# l1 _% F4 e) y6 Y; y
*addr = ~cnt;
5 h4 |9 M& N9 q0 C
}
e5 x- y2 P8 ^. p5 k2 K* P X# N
4 [1 y% l8 |4 G. N# M1 K
addr = base;
) p/ Z2 w: e7 f4 l! w
sync ();
9 q3 S$ d% j1 s) B8 {6 L! E
save
= *addr;
J3 k# i- Q- u/ ?
sync ();
( i' ]3 C: T- j) {' D8 ^
*addr = 0;
* b8 }+ [' L: s H9 p1 b6 f# \. A8 H
' X9 X3 N3 ]. X5 H
sync ();
! m& ?* O* R- J g
if ((val = *addr) != 0) {
1 `& @; I* l6 B6 F: o
/* Restore the original data before leaving the function.
( g4 f9 v; r E$ v
*/
3 r: p) \+ s) o3 ?- ^
sync ();
: L3 l& d! M1 L- A" g& }/ `5 A
*addr = save
;
0 L& u) }. u( `7 b1 f' {9 n
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' U) ]3 L8 I6 Q/ X
addr = base + cnt;
8 ?" P# c+ a3 z% q8 Q. a, X% b7 J! X
sync ();
4 L! ] k; p; u. M( U8 E
*addr = save[--i];
; Y: B8 F* P4 C9 e( R) v* s( y+ I& \
}
" C `. d' I" _$ i1 z
return (0);
# S0 j, ^" Z! d9 G( U$ T
}
- Z0 `7 Q: G5 p( z. d( p% Z
% J3 G+ S* D w a! @
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# X3 |" i# e4 {/ d: I
addr = base + cnt; /* pointer arith! */
' x# |& M. @2 S2 l- }1 ~, T$ O% ^
val = *addr;
2 m9 K! F5 [0 u! W% I5 N
*addr = save[--i];
6 m, C: V1 B2 o1 {" q Y
if (val != ~cnt) {
) ?: s. }& G7 Q2 s; |; t8 G- k
size = cnt * sizeof (long);
0 L! U) @5 E/ q9 E3 ?3 ]# l
/* Restore the original data before leaving the function.
]0 |9 |+ P6 ~, X
*/
& V# z P% u* D" J1 z- v- q9 v
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 e4 ~! h' _9 w( A8 N0 _4 q
addr = base + cnt;
4 J( [% E/ |, q
*addr = save[--i];
2 I: F6 Y3 _. z& b
}
3 k4 M- Z6 u) s a; c3 J
return (size);
! T7 Z2 W X, Q: r- L
}
* G5 T- d- B+ G6 Y( y1 J. g
}
2 p( g+ a8 e& j! j: ~ h% M
, G* B/ M! r0 d2 A
return (maxsize);
& o: Z2 a# W6 @& I0 d, Q
}
5 T* Q0 c$ ?- ]; i! T9 L
int dram_init(void)
' j6 J6 _6 O; p
{
+ f) H% y ^6 b- [' \6 [$ e
/* dram_init must store complete ramsize in gd->ram_size */
, E6 l# r/ G) `
gd->ram_size = get_ram_size(
* c5 {. ]2 u( o
(void *)CONFIG_SYS_SDRAM_BASE,
+ [' G/ I+ ^' v: U P1 z
CONFIG_MAX_RAM_BANK_SIZE);
. M& t t& G0 }+ C- I! Q3 b
return 0;
* j: w) W/ c9 P
}
0 q. n# j# R5 I2 ?' J1 ~
]# M& g e! D: T
; m4 O0 ?6 p. [
z, Y' h4 _) j+ N, c6 v: ?/ t
8 C: D& S" z& o; b0 E
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
$ e4 e- Q! V$ A+ {7 h
: @0 q9 e g. d
& |4 W: ?+ \3 a) R) _- S+ {
/ B+ S! f( J7 O, e
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4