嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
$ A" W+ A- X' o
核心板2:DDR2 256M Byte NAND FLASH 8G bit
v& s; f5 @& w: n
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& U8 K0 [+ b0 k3 r) ?
: }& \ T! [* z* f
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# ]1 y; s2 n) |, |4 O) c
# y P9 B3 h* r
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) F7 n ?$ c3 V* m* @& E8 z
/*
# ?' q ], ^0 k
* Check memory range for valid RAM. A simple memory test determines
7 G1 D! h+ [- y$ h* t) |" v, \
* the actually available RAM size between addresses `base' and
8 l; e* s7 s' [" C) K0 T
* `base + maxsize'.
S) ]- R- q5 x9 M: e0 _4 v
*/
# m/ w7 c( K, a% @" b$ u4 i
long get_ram_size(long *base, long maxsize)
5 v( O P3 K7 S1 V
{
~/ [% \. X8 U+ g$ A/ E5 T2 \
volatile long *addr;
' t3 a5 S) z1 @! [
long save[32];
3 ~7 C/ |& u* m5 c
long cnt;
: j& D( Q* d9 ^ u# t# H5 Q
long val;
9 s& k# g9 F7 N4 q9 q
long size;
- y( m% h/ X6 ^( R- b( G
int i = 0;
2 G; [- j: H) Z3 [
0 k! O3 N! i" ^/ u
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
1 m. p( V1 @0 P" Y- `3 G; |0 Z2 G$ O
addr = base + cnt; /* pointer arith! */
" g. Y" s8 g" K& A3 J) @0 [3 E
sync ();
. D) }1 @8 R0 N, K- r" @
save[i++] = *addr;
( P0 l5 ]7 x5 A8 J9 F
sync ();
( @- }# `: S8 ^ H
*addr = ~cnt;
* x# s; d) m# N5 E: u
}
- s; @9 g5 i7 W5 m* |9 z
+ f' \: @9 f! n( Q; a7 y4 g# t
addr = base;
$ M' J/ c. }% U6 N
sync ();
( `3 P- r/ x+ \5 l' b# Z
save
= *addr;
6 \. ?+ C) a. i. C
sync ();
R. l/ I+ g @
*addr = 0;
# \3 r3 b, ?' u3 z8 [. X$ |4 H
+ o" y: c3 Q0 d6 S4 a; z
sync ();
' z) y' N' d% U0 A) C. c
if ((val = *addr) != 0) {
9 }- I; g+ r* {( i7 V+ N; g" u3 N
/* Restore the original data before leaving the function.
& I: R; k6 M. l5 d2 W8 q8 ]
*/
2 |; P4 ^% c) T
sync ();
# R$ L" j' a2 }4 \
*addr = save
;
. t; E5 N# _3 A
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! u3 d' z( J7 I F& |! l/ a7 a
addr = base + cnt;
* v) r6 P8 G7 m; U
sync ();
7 A8 `% ^; j% B6 _$ p
*addr = save[--i];
" h+ m6 |7 Q$ c& l6 D' r+ |9 }
}
& ~: |' ?: w( c) z
return (0);
+ m w \# N3 \' b9 }6 J
}
4 {4 P$ f3 j0 q( P+ d' ]6 Q
+ e. ~/ u; M: x; J7 ]' ~
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ A2 ^; L7 ] z* R# G$ Z3 U
addr = base + cnt; /* pointer arith! */
0 F4 z) [/ ]! u: A; f
val = *addr;
! o0 \$ J# r* @0 x6 |, h; R4 g
*addr = save[--i];
. f, [) ?* I' g: H) X
if (val != ~cnt) {
# O+ s+ v/ ~9 a- X
size = cnt * sizeof (long);
0 j. B+ ]* @7 W0 ^
/* Restore the original data before leaving the function.
1 T# h0 u& V$ u0 Q9 \# ]
*/
4 S1 n: X' j0 m+ S6 d4 P
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( ~3 W4 p8 ]. D" ?
addr = base + cnt;
1 r( n: C% D9 F+ |$ }' }
*addr = save[--i];
! v& J. a3 ?6 H- D: `* y5 ^ J
}
6 S2 J% e) J) m! p
return (size);
r( [9 W3 q8 E5 Q, q" u
}
0 k+ P( g+ ^( [# c% k5 C7 B7 M
}
- D$ k7 [4 {7 T) B( M, C1 D P
+ U4 E5 }* \, y5 d' k$ L4 w
return (maxsize);
8 h5 P1 h0 Q6 E
}
" d- s7 `9 p; |8 e6 U
int dram_init(void)
W- B) i" J7 u* U- s, T5 t
{
' U& Z+ [6 n$ Q4 G0 u
/* dram_init must store complete ramsize in gd->ram_size */
8 G5 y# O/ y% H# K& Q' M# @! s
gd->ram_size = get_ram_size(
: @5 |, O( S7 c1 l+ H
(void *)CONFIG_SYS_SDRAM_BASE,
2 K- H. G! |/ I! R3 I
CONFIG_MAX_RAM_BANK_SIZE);
1 I- } g, C5 a. k) M x3 e
return 0;
7 I2 g* S. j3 m! _0 _" L
}
; u8 u" L7 V! D0 X' n' x5 f5 k
% W; X/ n: G+ @* O+ o4 d1 _8 h# w' K
' q8 v/ V# k0 R1 B3 l' L# |/ P
& z4 i! i& Y5 f; s" {, Y
' r2 K! n+ Y& f/ \
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
: @' m7 \/ j6 p& i( e5 F8 H
I8 \' Z& B# n h# a( @7 ^
. t8 {$ C& t: q+ A1 y9 v
7 R, y/ r8 H5 a: J; H- W
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4