嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 g9 E. i5 Z+ o+ c
核心板2:DDR2 256M Byte NAND FLASH 8G bit
$ p Z6 T) o) V7 O
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; a' I; q. w% o8 b
* \- n: G V7 n8 P* ?3 n
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" ` \3 Q0 |) Y6 p+ K, A
) D1 O9 p' s1 H8 R7 \: }
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ T! g$ l; C3 Y: [; u8 F
/*
! z, C- }% I# ^7 e
* Check memory range for valid RAM. A simple memory test determines
- {/ l2 |! D. N& D
* the actually available RAM size between addresses `base' and
' Y) z! n% s/ E) _) I
* `base + maxsize'.
1 E7 s- v; b* Q9 K# f) p _
*/
6 ~! f k+ l* Z4 o& |3 l0 E- H
long get_ram_size(long *base, long maxsize)
1 n9 F7 m' H) h3 R# m7 N, x
{
( }2 R- ~. }. x; n. g
volatile long *addr;
2 C9 y7 u ?( t
long save[32];
, O# j5 O3 l% ^* o' Y. C7 E. R
long cnt;
( p$ X0 Z" v) [6 k
long val;
5 x5 Z! c! j4 l# ~, x7 [$ V
long size;
* z' k& r! L# [
int i = 0;
0 G; W1 A: m' a% P: d' ]" o
- _ r6 K6 R% ~ X, [( z6 j7 X8 w
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
9 ?8 L% h( z5 y- {$ |7 M
addr = base + cnt; /* pointer arith! */
& y4 b1 H7 f8 u% r+ o+ b& f- [" U
sync ();
* T5 T, a& [2 T
save[i++] = *addr;
2 G6 |9 z( O+ t. U
sync ();
6 X( @/ M: B9 ^+ e
*addr = ~cnt;
" C! P) ]* d5 f# P) M& H
}
1 f1 I% B! m% ?$ g2 Y- ~
$ i1 i1 s/ |$ I: F9 d
addr = base;
2 d- I" @) J9 R6 z
sync ();
% C) d5 d3 n" r2 p7 S) ?2 C& a
save
= *addr;
5 ?5 | u5 @4 b& u: ^5 g% B6 {
sync ();
8 ]2 r+ Z) T: e
*addr = 0;
. P# U! q. i4 F2 k H+ i
0 G& w8 Z9 G2 Y" Y4 W; f" M
sync ();
* S1 @% A1 O( ]; I: e' y" P# @$ q
if ((val = *addr) != 0) {
+ V! d0 U; a0 K3 ]* m
/* Restore the original data before leaving the function.
8 h9 [2 _) b/ v# z! {( H, b/ D" L
*/
4 Q3 U5 y _8 J1 s! J. K* S
sync ();
' a$ Y* o) b; J- V
*addr = save
;
) H* P: Y2 Y( l1 i
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( V1 U& u- u4 A; Y
addr = base + cnt;
H) G0 [& u5 B5 j# k2 a! z
sync ();
& ?1 k, j! R, p2 [
*addr = save[--i];
- o# _2 d" I4 R1 |- {, ^
}
6 x9 _+ @4 a& Y# c
return (0);
1 U/ Q3 Z: {$ g( m8 ^ L9 o k5 } u
}
, Y) T' K- u3 G3 X
8 ^6 D9 |( U1 c# Y: \0 [ ]. I4 z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 @, a0 {3 @3 M& V! K
addr = base + cnt; /* pointer arith! */
9 k$ p. v# {2 Q. H7 F6 Q- Y
val = *addr;
) H3 P$ X! a \
*addr = save[--i];
( ?9 a' V( q8 e$ Z
if (val != ~cnt) {
/ W9 G+ B% X g$ v5 V, ^
size = cnt * sizeof (long);
/ k2 V* r) |, W) R& l
/* Restore the original data before leaving the function.
7 [$ G& n# Q% n2 w: h# J O
*/
8 H) F) f7 ~ X4 j! l
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 e* P5 i! V. R% l( w) R
addr = base + cnt;
8 V+ r1 J2 U9 N2 M
*addr = save[--i];
d+ K* `, s8 f# ?9 }3 t" I; y
}
& G$ y$ s R6 m9 O: V- R% w
return (size);
, S" D2 a2 q. B* K [6 x: X G0 m
}
0 m2 U- H, C0 z9 Z5 I& u: ]" z
}
: F. y) w6 \" K: Q+ K
3 V; h% }' |8 h! v% [; h
return (maxsize);
! H3 a+ O [; c
}
, E4 B9 V- F: Y( s1 l
int dram_init(void)
) `/ y- e$ \5 |1 O9 N- D2 U" v
{
1 ^' l2 ?! x7 ]6 g% C
/* dram_init must store complete ramsize in gd->ram_size */
7 T2 M8 v9 n4 H' N- m0 S2 n2 W
gd->ram_size = get_ram_size(
5 D1 y( G5 s. W* \$ ^- W7 m
(void *)CONFIG_SYS_SDRAM_BASE,
2 o0 i7 ]- B+ a% s4 H
CONFIG_MAX_RAM_BANK_SIZE);
, B, P$ [3 p- w4 h
return 0;
0 r; H7 X, ^' d# y. P% j
}
& e3 o7 u6 r" W/ |
9 o+ m% j1 U7 @ n
: s" W1 P# u" S* e( b3 Q
8 B# w* z3 ~7 b1 r. O0 D
- o) L: S+ v' Q$ P4 ]: V8 ^
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
! o* K0 p/ m* Z- i
) v0 M$ }) t! ?' u
/ v- I( ]8 v9 k2 R
2 h$ p* H8 T# E/ [
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4