嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
- e, [" i- e8 I7 @
核心板2:DDR2 256M Byte NAND FLASH 8G bit
0 q. o& i0 M L9 T5 N+ c% y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) m2 l) k. _$ E0 u% [, j, n8 K
^, d. @% Q! }( P/ G
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; p% C9 y" v; Y, g
) p! @- l8 y& i, Y/ t# L7 q
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! h/ L' J3 L$ l; m/ ^* |
/*
! q1 i, y3 o% [9 w/ a( v2 C, h
* Check memory range for valid RAM. A simple memory test determines
. x. G) k' o2 \3 Z$ }3 P( {! c
* the actually available RAM size between addresses `base' and
, S# G" ?' G+ A; N: @; f: r
* `base + maxsize'.
( H: L) r+ F" ^- a
*/
0 c" V2 [. K# F6 h7 V1 u
long get_ram_size(long *base, long maxsize)
4 W3 H7 c5 I& ?+ j1 V
{
5 o3 p6 |# C, K* s8 ^
volatile long *addr;
9 C2 i$ M, R0 z% t6 W8 f) g
long save[32];
( }$ G9 S- `8 a1 g, t0 n
long cnt;
/ H' i$ ^; E7 [" ~. Y
long val;
: [$ l" o* ?: T
long size;
/ m+ `+ r% j8 |' Z
int i = 0;
- E9 R2 h/ j1 S1 }
( s8 [+ `* A3 a# e+ ]
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- i2 S7 \) n( |$ y+ v
addr = base + cnt; /* pointer arith! */
4 h6 K6 E, I9 H
sync ();
5 K# {# r# |; a% ]
save[i++] = *addr;
) i$ r9 h/ |8 }! k7 I: K
sync ();
& _& w0 j+ e9 |* ~% P% @4 n- u
*addr = ~cnt;
, D: c: `1 x4 `6 X3 B2 ]3 U" o
}
. P2 z: `& A- u2 j) ?, e
2 B- Y+ k2 P+ w5 F+ b7 z
addr = base;
+ N, H' E( i) |) `. a" W
sync ();
6 c' I( m! ^' m3 u
save
= *addr;
; q H2 n) z; F
sync ();
) q1 o1 F. @+ o5 a& p
*addr = 0;
# v9 q. q3 p& o' _
3 Z/ }2 X+ Z1 B, _
sync ();
5 L) ]$ E% H% Q
if ((val = *addr) != 0) {
3 a3 t, i$ m. [
/* Restore the original data before leaving the function.
! L2 {$ Q R/ g$ U7 C% w/ Y a& |! j0 W9 a
*/
; l: Q6 p; T. a/ P
sync ();
8 u. P% k+ U+ d& V; _ J5 I9 D, L; x
*addr = save
;
2 D% x; T9 a7 u- T
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 a r! i6 l! R4 e" ^2 h; B
addr = base + cnt;
5 e+ [" ~' n0 n P0 O5 n
sync ();
9 {: z' Q4 ]; Q' }
*addr = save[--i];
" o1 }8 z: t2 o: H& }% p
}
9 P* g1 S" ?( V8 e9 H' y
return (0);
; C5 |, Y5 z- @9 r# Q$ w
}
* m/ G) m$ F& q4 F- [3 n& C
- ^0 ^, l1 k0 r" [+ J3 S) Q( H
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' |; }. f% Z; \
addr = base + cnt; /* pointer arith! */
1 P2 m% g. [' _2 |
val = *addr;
2 T. E4 P0 e0 J: j$ e
*addr = save[--i];
- t; z* N/ [8 z8 d
if (val != ~cnt) {
. {4 `! C% K: K
size = cnt * sizeof (long);
: w, Y/ n& \+ |5 k6 x
/* Restore the original data before leaving the function.
1 l, S& A4 I2 G( c" n. R1 ?
*/
& t4 a! W; ^5 i3 W9 o1 ~
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 _" t; g) P$ F- \$ w# R
addr = base + cnt;
5 y5 P+ n3 x5 O
*addr = save[--i];
* H! ]7 c( @/ H/ A a% P
}
( S, g. T; | h T# e4 P- W) c
return (size);
1 [# N( [2 F3 m" O4 N
}
+ p; K( F% F3 ?
}
2 _8 C4 k) E; h p5 I% ^/ _# ]
+ l& l I5 ^; E, K9 X0 m* w
return (maxsize);
' |2 Z8 j% I$ ^
}
) }8 Q9 S! `) ~, {1 \/ m
int dram_init(void)
6 B2 E/ y. Y" A% v
{
) L& @7 K5 d* K6 i" ^ A/ X
/* dram_init must store complete ramsize in gd->ram_size */
1 X; m" x! B0 `- q" m5 h) C% F
gd->ram_size = get_ram_size(
, `9 K# e7 P& \( _
(void *)CONFIG_SYS_SDRAM_BASE,
0 @' K0 ^6 H5 X: L5 c* N5 `
CONFIG_MAX_RAM_BANK_SIZE);
, S, E! X- q1 T' c; P. ]$ s1 x5 S
return 0;
# ~/ }* n/ Q) M8 B* H$ _! ~1 n
}
2 f b" ^1 i' g, |1 E( D9 e% D4 k# X
7 X9 L; x' o, E3 l3 w% M
2 l' e8 D, @5 n6 n. u8 p+ g; [
' _, D% x' `# d
5 r2 g& Z. |% D. g" G- {0 Q h
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" E, H6 n1 G L8 p, r6 {$ S3 X
( [! a- E: p; e# H( v# ^6 Z# Q
1 H G) _/ t9 a6 F8 A
7 l% v% l3 a- d7 }
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4