嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
8 g1 b% ^" R! ~6 h) \; M( M
核心板2:DDR2 256M Byte NAND FLASH 8G bit
7 C8 l- y% z, G l2 J W/ `
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* x3 H, a8 I7 R; C% n) Z5 w5 _
: G( h- d: K; y; ~6 U/ }
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
0 B, F# I2 A+ }
; A# I3 @, o2 k% ]
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. S- B& ?) n5 w& Y; [
/*
+ ?& B- e6 ?3 M! d. R
* Check memory range for valid RAM. A simple memory test determines
0 i1 F4 B$ E' k3 y* r# W
* the actually available RAM size between addresses `base' and
& a" l8 L( s5 }9 C
* `base + maxsize'.
% m! m$ V- R# K' ~0 b) |* V4 x
*/
9 E- ~3 n( E% y% v9 q* X) J
long get_ram_size(long *base, long maxsize)
, z0 x d9 j6 w$ j' N5 J& G/ U" ^
{
8 b: X& }4 @5 g) I4 r" ]
volatile long *addr;
! F. l u4 F3 q' Z3 x
long save[32];
) A7 L0 T' q1 w% L" C0 |6 k
long cnt;
1 u& i2 m9 ~1 a: ^' E$ ^
long val;
! [9 T' U! [+ i) }
long size;
, z& N: |/ ^2 ~
int i = 0;
& m6 G- H" M; F4 a6 u; w
8 z2 H0 q6 c! }2 m
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
w4 B: x7 F( B' g
addr = base + cnt; /* pointer arith! */
6 b# f: q7 G5 @" |
sync ();
; Y5 ?! p6 J) o4 y, d3 _$ P
save[i++] = *addr;
' O6 d$ y! Q! k2 ?1 k* h
sync ();
$ ?5 O3 A$ C' c. u+ i# {
*addr = ~cnt;
- e' X! p+ l, u- J' i4 c
}
: k$ C/ [. ]8 [5 ]8 H$ T
7 R$ a0 b5 f( Z- f, \. @
addr = base;
3 Q/ W$ m! ]6 \5 g/ {0 k
sync ();
! C9 B* @' E {" t
save
= *addr;
a9 {1 ?. B m+ `6 R2 L! `7 k
sync ();
k7 B" ^1 }4 N, k% d9 K5 E
*addr = 0;
( |1 e* u/ L, t& Y5 M7 k# g9 S
5 Y e3 E2 U# D6 _1 D; } C: W! m
sync ();
2 h% s' ]0 M4 m& V' d# [: f
if ((val = *addr) != 0) {
, k4 N F5 W6 S6 @; H4 I
/* Restore the original data before leaving the function.
4 S/ L: r; k" t/ l0 f! r
*/
; O3 ` A1 n9 u; C* g5 _7 E
sync ();
4 V3 K' S2 j5 a+ k- v% I
*addr = save
;
3 p/ v7 @5 `' Y7 n, @0 V& l
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ u: Y! [+ \- m! [
addr = base + cnt;
' o% ~) I/ Z. x3 R B: o* \- F: M6 B
sync ();
% f' l! G8 F( b0 o* o% z, e
*addr = save[--i];
' s( `0 A$ q8 v3 z/ Q! A2 a
}
. r7 V! O. ~: s( J F/ B
return (0);
9 T8 ~% r, n& u+ E9 n5 j( U8 |
}
% k' O6 x3 [% R0 R/ M
3 D+ a( R# c0 J4 x" A7 o
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 W, ]( l( w: \1 d/ N) J- w
addr = base + cnt; /* pointer arith! */
0 R. D4 n+ I$ O7 M. |7 c
val = *addr;
5 I9 t& |" E- _2 c
*addr = save[--i];
# H8 a& T3 t, W3 H) T* r2 ?0 _
if (val != ~cnt) {
3 j/ i! f4 l/ W6 w9 p
size = cnt * sizeof (long);
: k( X% O2 U3 I- o/ R
/* Restore the original data before leaving the function.
7 x- L0 E! z$ n9 J* @
*/
4 @7 C) c9 V# w' R
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. Y; I( U# N/ c7 i8 R
addr = base + cnt;
- ?; _( f, K. H! _" R5 X
*addr = save[--i];
6 v/ D/ P& T8 M
}
5 r4 [; l0 u) J
return (size);
3 P/ G& {: i' s+ ^( |
}
5 h9 M' {$ P f7 L/ l4 A: Z; m
}
# P! e5 k" S7 d, f
" f0 R* p R* t+ K
return (maxsize);
' S( c8 ^9 Z$ `* O" a) q4 r, ~$ O
}
3 U" h0 ]& ?" d# s* G$ z
int dram_init(void)
2 P6 k/ k) J" q+ [: O# M# d
{
+ O$ n7 N9 l! b4 z" k
/* dram_init must store complete ramsize in gd->ram_size */
6 o8 ~! C7 w* I" r0 l- s: G3 ^3 w* U9 O
gd->ram_size = get_ram_size(
3 ~: {& h3 m" O
(void *)CONFIG_SYS_SDRAM_BASE,
7 M: a5 F" f7 `: d: {( ?4 E9 `
CONFIG_MAX_RAM_BANK_SIZE);
+ k3 P& \0 j$ j8 v& A
return 0;
) h2 V4 I. f+ @4 j
}
" S' i2 q0 o4 R
! ~) E9 G2 G8 `% m f* _
# @+ ?& O1 y( w' }
6 T, T& ]5 q( w1 n3 f1 u
$ u( R+ h- M/ M. N
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" l( ~/ p% b I- {
+ u0 l- F& N. W8 g+ i# y+ f
! ?( m9 c. B# r
9 }# ?$ Z' u' X* I
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4