嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
1 X3 b/ S$ Q/ M7 y- v
核心板2:DDR2 256M Byte NAND FLASH 8G bit
( c4 U: ~( A; i' Q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
T. K v! e3 y" J
8 N, c' P1 A; ? \
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
0 J% o# b: u/ ?# C
) d+ r9 }; q% r E* ?, I
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" G! B) E, R+ J: Y
/*
: g$ K5 c) R: ?. |; O
* Check memory range for valid RAM. A simple memory test determines
8 l: u& j. o: H' d& M9 U! {; [1 B/ o
* the actually available RAM size between addresses `base' and
) p! p% y5 F* `- N
* `base + maxsize'.
$ b' {1 e% T# L+ t" a5 y' v# S- ^
*/
0 X' U) U$ I. L4 A
long get_ram_size(long *base, long maxsize)
! ?+ h* n/ N1 b; J+ G8 h: B$ U
{
+ P3 n; g/ _* ^8 g
volatile long *addr;
" d8 r# N" v% F4 R
long save[32];
3 O* ]# k- O7 U* D X. ~
long cnt;
7 e% T2 L+ V5 P4 T: P9 W' d
long val;
# w8 [# j5 i7 c& E2 C+ U" Y
long size;
, s# u& g7 \1 e! i4 q
int i = 0;
Z9 b9 R1 s( p' C
2 y% s5 ]3 d1 i7 F
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ a6 p: q! p* R' d1 N# s
addr = base + cnt; /* pointer arith! */
+ M e6 o' }6 |9 h& ]7 Y! N
sync ();
2 c2 S4 y- p, f8 s( ~' N
save[i++] = *addr;
3 E6 I; c) a4 j# h
sync ();
9 L/ M+ c5 ~8 Y) Z
*addr = ~cnt;
! Q0 K% q6 _+ K' R1 F: j M0 u
}
7 R: n7 @; |' W$ E
, I8 ?1 J J& L( t2 X8 d. n2 R
addr = base;
) F1 d; |4 [. {8 d1 T/ _( L
sync ();
0 B5 Z& `: J& L! p0 E
save
= *addr;
. n5 U. i; _ z4 X' f0 E
sync ();
* a. H5 |: Q$ d5 U: C; K: q/ E
*addr = 0;
5 h! y- W0 U% j
' [. N. O Y Z
sync ();
3 I$ I3 U2 m7 {9 j- _9 v8 v7 w- I
if ((val = *addr) != 0) {
9 E! p; P9 k0 H, i& l% l
/* Restore the original data before leaving the function.
- ^8 P/ ]+ u; i8 K
*/
+ L+ c5 J7 W* B
sync ();
( [$ n' \# S6 z& x g$ A8 J
*addr = save
;
% a1 c3 i6 z; j" `4 x# I7 Q
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, R3 f0 ]3 a4 ^
addr = base + cnt;
: X" w. P( Y' m6 G; v, u9 H
sync ();
- p* S, m G& J& z; ^! X, N9 N7 ?
*addr = save[--i];
, S9 D2 I" o+ d. P3 s& N
}
+ B8 z, z; n& `
return (0);
* O6 M1 F/ ]0 q B0 A) o& q
}
) W+ f) Q- y" j
5 m! Y4 \# }$ D& r1 v$ s
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 w3 Z1 p5 v) ~3 `- v0 ]& ^4 |$ r
addr = base + cnt; /* pointer arith! */
9 z* E. ]/ e+ Q- p6 c7 w
val = *addr;
3 T3 ?* S' f5 ~8 _
*addr = save[--i];
% g O. S2 v4 H9 @
if (val != ~cnt) {
0 Q6 U% N- E( p; h9 v! Y2 Y
size = cnt * sizeof (long);
1 F" w+ \* d, I! Z6 ]
/* Restore the original data before leaving the function.
. T( W8 r# [, l
*/
. b! C( J- g/ W* [3 V1 @8 U' S. ]+ J
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. R4 i2 y1 C" J
addr = base + cnt;
+ p6 h0 t W- L: Z
*addr = save[--i];
4 b6 I( O9 L4 A& H L N
}
5 r4 X: j9 S/ L( ?* u
return (size);
. y1 l+ T8 i, A7 D% L _
}
8 z) X7 ~2 s7 a6 b4 C
}
6 O8 p8 s+ i7 s8 |/ I5 S5 ^
- Q. g) G2 M) R: U) T+ K8 P. @! h
return (maxsize);
; c( Q" ~3 D( U- \' p5 [( d7 L
}
5 H) A; Y7 w* S* t0 R# u
int dram_init(void)
2 s/ t* T4 \" Q4 q. u- `0 q2 e
{
8 k8 z$ o; `: j3 X1 ^/ o$ b
/* dram_init must store complete ramsize in gd->ram_size */
: H+ a; Y) x* Q' y- B& t* Q
gd->ram_size = get_ram_size(
' Y4 D2 h* Y8 B9 v* s
(void *)CONFIG_SYS_SDRAM_BASE,
6 m7 d I6 k/ A, N
CONFIG_MAX_RAM_BANK_SIZE);
" Q; q$ }9 j6 |7 ]
return 0;
3 [0 I7 U. Q- Y I- F
}
( M' x* l8 w1 N, l" [8 j( K. ~
5 v3 X6 z8 T$ f
: b' ~1 ~& u, u
( h4 \5 W. S$ l: @9 @. n
7 c6 S* W+ t' j g% I7 x& |" s
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& e9 B& ~) J5 p- O; u
; }$ p" E" h# J! X! M9 @/ G$ \) P
8 [9 f+ K8 f* m. L4 b, `
' Q$ {# h& Z) i) t# s r( X- j
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4