嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
0 B- A# O' F0 t3 j) ?; s( W
核心板2:DDR2 256M Byte NAND FLASH 8G bit
$ p# R! H9 e" C% j( x& r! V; v
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% A0 N+ m2 G" W; l4 `
$ i" g2 F( c. S3 E
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ Q% r) j1 P% b8 Z- h
' D! N/ I7 x* O; i6 M f
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
# n! O+ o& i: e+ S2 p9 J
/*
) ?, T, |1 s1 u. X
* Check memory range for valid RAM. A simple memory test determines
& M! m+ X2 e. X/ `* m( _7 r; T z
* the actually available RAM size between addresses `base' and
$ t9 p, F% X8 r
* `base + maxsize'.
, o( ~- G ?# x& r
*/
- U S" Y& N; r* Q1 J
long get_ram_size(long *base, long maxsize)
) h7 J$ n3 ?, H& q
{
& A6 u$ K: Q! J
volatile long *addr;
8 O0 S1 w7 x8 f1 N3 N' j- p- z
long save[32];
% a5 Y$ h: Y+ z$ E- J7 o
long cnt;
8 b- U4 b1 P& U8 S6 K- N- V4 O
long val;
7 z9 A+ D& |+ I; J5 l
long size;
; Y5 I1 J( ], i% t6 l0 h
int i = 0;
) k# r" H7 C4 B8 K3 [
2 ?2 n4 u5 \5 j8 C7 T) ^6 y, X: E
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 E: b9 f4 E0 N% M
addr = base + cnt; /* pointer arith! */
: Y. e+ \+ M' \/ [
sync ();
, [' _5 u0 V. \! b& E
save[i++] = *addr;
1 R: I0 m; W4 S6 l9 I3 X3 D
sync ();
8 x3 h) c- u: S) u$ x
*addr = ~cnt;
) M% W0 m/ c! H* n; Y
}
1 b6 e% r8 M7 |* s. ~/ H
0 v8 Y9 c+ ^$ {* t7 V+ Q: [
addr = base;
3 y+ D' i$ x- Y9 b: i8 I1 b1 g
sync ();
& W( m& y- E: e( f* D. r
save
= *addr;
0 v* C: d1 Q% y2 _: M2 c
sync ();
: h$ u" P# F1 s1 O0 u( m7 x
*addr = 0;
2 \" R; V A0 |1 |0 W
" c: s0 X- S4 I- V
sync ();
& H F4 k/ T; i1 @; f
if ((val = *addr) != 0) {
' h2 g2 `- |1 v+ L
/* Restore the original data before leaving the function.
4 o! I2 L4 S$ R0 X# A# X: f$ ]
*/
& I% V9 z: f4 c; t% S
sync ();
/ r) n. a6 H2 A4 S( `. ]
*addr = save
;
; d& j# v! `9 U# e* g( C
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% S. n3 L) O. _6 H: Z# c& U
addr = base + cnt;
; {! Z( J! f5 N: B+ W
sync ();
/ `* l0 f$ ]! W+ u. u7 E8 ]
*addr = save[--i];
6 C( v e' m5 q# O- y
}
7 ?! D* V: V" s
return (0);
' Q v8 l% G4 y# G, V) M4 N. v
}
. _3 i4 C5 I5 W4 n& M
% s. E1 c% T0 \
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ r" E( V8 ]. f. h5 I% _; x1 @
addr = base + cnt; /* pointer arith! */
# E' v2 W. ]/ U, e% v0 ?8 o
val = *addr;
9 i" a7 i3 K4 C2 B9 X N, ~& ^; g
*addr = save[--i];
( n B0 R1 u4 t' }
if (val != ~cnt) {
; ]1 F) @8 K3 J4 {4 D
size = cnt * sizeof (long);
; Y$ @; W2 U) r* X7 H
/* Restore the original data before leaving the function.
0 l% C8 z& j9 A: R
*/
~, Q# @3 _4 g
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
E7 ^: z+ f) H& h* Y# z
addr = base + cnt;
; O! [: F8 N8 O- @, U1 ]
*addr = save[--i];
$ e2 ~- r% L% m* \+ B
}
+ _1 p3 L- O( a& n k+ n! [' @
return (size);
6 [- {2 i) I0 E/ [' O
}
* I2 r5 F$ e3 l& n
}
/ u7 }; \- _! |) X) f! i& N5 }
3 e4 B. N/ H% e
return (maxsize);
" W" o A; }; M# n% q' L7 H
}
7 }/ }6 W2 b- x: y# ]8 [4 J
int dram_init(void)
, z( |0 P+ d. E1 ~9 y6 s! T! X" L
{
' o/ f, i( F- R2 B- c5 u, s8 n( Q
/* dram_init must store complete ramsize in gd->ram_size */
/ u5 [: S- J) s% b8 t& H' d c
gd->ram_size = get_ram_size(
/ n% P U: K6 y
(void *)CONFIG_SYS_SDRAM_BASE,
# p1 W' M) [3 K- u- S
CONFIG_MAX_RAM_BANK_SIZE);
& k* e: y5 n. K' z B; \4 r- W. H
return 0;
5 i- J+ \/ m. a/ x- {
}
: V1 n; g3 ^$ W) Z; z
7 o! ]! e" J9 z) M$ y
+ v' h" x' h8 N
1 p J. }" z0 `) L3 Q& h9 H
& [' `, ]3 g# B
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& E" `5 @6 t6 j9 c9 W, [; l
# [+ J& l( D$ s3 X7 b
4 y( k+ ?$ B5 j: ~. g
. b4 S* ^, ~9 p. o4 E3 F# R
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4