嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
% Q/ {: G: l3 H. m% r
核心板2:DDR2 256M Byte NAND FLASH 8G bit
$ l' k- R; K5 ~' |/ v
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& x1 O! U# ~3 Q1 g3 W
" `" d) v+ f3 o2 s! d I
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: i; N2 A+ ^ A) [. B; j
6 W i0 o; n5 w+ ]" r. B/ u/ C
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% N) U2 I0 U$ F, P
/*
( H# @; Y1 c4 t( u0 V) [& ~
* Check memory range for valid RAM. A simple memory test determines
( J+ P/ K" r6 g
* the actually available RAM size between addresses `base' and
/ J5 T+ _# B! s! U! R2 b6 ~
* `base + maxsize'.
. g& u5 I* g' [& M$ t
*/
7 s |- d. |$ i7 ~& U
long get_ram_size(long *base, long maxsize)
1 o3 h2 e p* Z$ O
{
1 ?) U* `9 U8 Q
volatile long *addr;
( P7 [8 Y! p. A' d/ Y4 q3 h
long save[32];
. B( I+ Y9 S2 z6 f
long cnt;
1 _. |- f: ]0 }; c- m9 d5 f
long val;
9 A5 A0 ~: Z- a% V/ d, I) z
long size;
: K, Y1 U( F- Q8 T2 i
int i = 0;
& G, T8 n+ R# q' }( \1 r: Q
1 o* ~2 @; m4 k& J5 a( O* a n
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# H; m, l- Z4 J4 g" P
addr = base + cnt; /* pointer arith! */
. ^8 e- ^ s- a i2 D0 Q. l
sync ();
6 T5 Y& L/ i' {& }( |& J
save[i++] = *addr;
: o& M- f0 q" y! ]) W5 Z
sync ();
! i- H8 H& h7 `. c/ _& z
*addr = ~cnt;
; D4 D- T3 y9 T3 P
}
) H/ P. O' U) F
7 @8 }" {: e: y
addr = base;
6 V% [9 a$ i4 F" k2 \. c( A
sync ();
$ ^0 Q ~. C* ^& E8 h" A3 r
save
= *addr;
) b9 }8 h8 z5 d6 g+ A- B' x8 B4 K4 }
sync ();
% t- B. v3 r# p# p
*addr = 0;
5 F* @! A; i: t4 B4 K
# D# f# I' f; U. ^& w2 r1 y! ?
sync ();
* e* f) v5 S5 x4 z& u
if ((val = *addr) != 0) {
' [. V# L4 g+ d0 h$ L
/* Restore the original data before leaving the function.
4 t- c# e ]! D4 d8 H+ q/ x
*/
. ?. U+ r# U% R: l( V
sync ();
& f$ Z% v6 [. k' d, D1 S5 b; t5 Y: I
*addr = save
;
: E2 o: A8 u0 {
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 i: w) e% S3 |$ ^" c
addr = base + cnt;
. B. @" R4 o% S% b% a# g2 H% r/ {
sync ();
. t6 p5 j& d0 E2 m \& _/ h4 k, k
*addr = save[--i];
5 ~; f0 i0 X9 A* v8 z
}
: l) W2 g X, Y, Y4 ]8 Q9 T
return (0);
/ d; R y" ^* ~. m
}
2 g1 A4 q" j3 f
) X) S8 `" S$ F6 N/ T; {
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 b& H0 ]9 w# g; O8 s& ]0 a
addr = base + cnt; /* pointer arith! */
5 X6 \2 }& `, R6 ~3 Z7 S
val = *addr;
; F) Q7 r9 d; u) K$ y' u, \
*addr = save[--i];
+ [& T* P3 ^9 a# U: y; D+ E
if (val != ~cnt) {
4 Z% p; v G3 n, F: S6 A
size = cnt * sizeof (long);
: B" T3 N; F. ?. i9 r
/* Restore the original data before leaving the function.
7 Z, i" D8 n' U% d% N
*/
5 s0 z8 _/ Z" N& Z% @
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 c+ D3 z% I4 s2 R# W7 F7 w. v
addr = base + cnt;
2 z# a# F) f5 g# P
*addr = save[--i];
/ X3 T% m! C* q9 C3 n
}
( ^# N, J' M( M/ |
return (size);
5 F" H/ t- W0 S( h& f3 r, B- f
}
/ n2 T0 d' x4 F4 v" A8 [
}
3 `7 R+ D6 z$ {- }) {: I/ V
& e$ [; U: v$ f. p( k! X/ W/ G7 `
return (maxsize);
3 L4 z0 r( z* v2 W- R
}
4 ~5 g+ r4 R2 s. m% ]; g
int dram_init(void)
3 }0 a2 ], z( T3 ^
{
& G2 L1 w5 L7 L, R! ?: O9 Q
/* dram_init must store complete ramsize in gd->ram_size */
/ K! k1 J% @! a t8 i2 [) R
gd->ram_size = get_ram_size(
# v/ j: W3 n; w3 y" p& X( W$ s
(void *)CONFIG_SYS_SDRAM_BASE,
# l0 C1 R) v P4 O; h+ h2 N
CONFIG_MAX_RAM_BANK_SIZE);
+ G% n! T) C/ s1 c& h1 T* N. v
return 0;
* @7 j* l! S; K6 E2 W7 v
}
6 g2 \' \) N2 p4 u) y% B- b
1 M9 X: b; A: V, ~" H. S' r" C
7 _ L0 L" i; }2 d( v
/ s6 ^$ X: P! @: v6 U
: j( i5 E: d/ N5 e6 T$ t2 u
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 b" o$ C5 q% Z1 X7 N
: M: I7 |: @; R# f1 G
; p# A! i' j) N- b9 t0 |4 P
8 H6 Q+ d% M6 D- |
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4