嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
. l1 q [6 ^/ q; T2 }7 l
核心板2:DDR2 256M Byte NAND FLASH 8G bit
/ U& M- i/ v8 a7 }- y# M) k3 P
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" b. `4 V7 Z1 E! c1 Z& u
0 C. z6 t5 L( A# s9 {
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. J3 K7 n) v' [$ N- P H9 z) V
, p* w( ?! Y3 v* n$ G
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! z$ o3 {- Q0 _5 d" _1 d, C
/*
, Y6 _( ]0 V1 w: Y; W3 ]
* Check memory range for valid RAM. A simple memory test determines
: f3 G' V$ V. J) D" z, b" v3 T
* the actually available RAM size between addresses `base' and
6 w5 G) M9 ~( }" a' m
* `base + maxsize'.
% }$ x# u$ k. C% n4 P4 h
*/
( B V# r4 f+ E9 k$ Q
long get_ram_size(long *base, long maxsize)
) U3 u" }6 s" o& f" x& F
{
8 J; Z1 n5 [4 g2 D; x7 D
volatile long *addr;
; q5 g _) q, l8 T. b& G7 F% I
long save[32];
* V. Z2 Q; k- X
long cnt;
: M/ [# q! P5 r; W9 F; U1 f
long val;
! Q" ~, N8 q0 }; Q7 X
long size;
. d2 b9 O [0 ~2 K' {7 I
int i = 0;
. m+ g: V' D; i* h8 H
" G2 V3 f& z J" Q3 c9 Z
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) O1 n" o+ c% c8 t/ ~
addr = base + cnt; /* pointer arith! */
: i6 T2 z2 d1 W! U1 B# A
sync ();
; X* G! \0 W/ C6 y4 p! n0 X
save[i++] = *addr;
1 E, ^. _: |3 p- L
sync ();
5 s3 a! ]7 [) T2 [3 \ f
*addr = ~cnt;
: |+ X7 L( |& f6 Z
}
% v: |# ^- H$ D# t1 p" }+ n
7 D% X- w' [$ R, L
addr = base;
0 M ~& b b4 {- W
sync ();
; \" I, M, X3 s5 _
save
= *addr;
+ M0 Q! Q j3 M/ v0 X) |* V
sync ();
' z) Z) J6 ?3 i1 C, O% X$ o
*addr = 0;
5 E7 u7 _ Q0 d) L2 H
8 p0 I( b: z$ P
sync ();
; w7 X$ m$ X8 U1 ?
if ((val = *addr) != 0) {
+ Z, u5 T; L" b1 r
/* Restore the original data before leaving the function.
# e! I b1 R8 y3 l4 N7 b
*/
- S; |1 N m% j: }
sync ();
% V. X' Q2 n8 l) ~
*addr = save
;
: q* T" S# }" j1 c
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! s$ U9 e: A% l3 |
addr = base + cnt;
# `0 T8 G" R1 \7 ~3 v6 x- j
sync ();
: @0 G2 @5 b. R9 t4 V1 Y
*addr = save[--i];
) C+ f# W" r9 r) C" N3 ~
}
" t7 x, J7 C- _5 l/ \
return (0);
% o+ [. x: E/ x8 Y9 {+ Q1 ^, ^
}
7 \- @2 L9 Q6 k9 T" L+ r/ [
" ]3 S; w9 f: t+ `2 g
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; W8 R5 ~( D/ b' d
addr = base + cnt; /* pointer arith! */
/ R. I- U+ q- B% g5 \1 V
val = *addr;
; B1 {) n7 d- |# ^8 k
*addr = save[--i];
) Y, S' D( |4 j/ _+ F/ |
if (val != ~cnt) {
9 d0 A8 o) s# m0 _; |, X
size = cnt * sizeof (long);
) w- N8 i' Y9 O, l# Z- O
/* Restore the original data before leaving the function.
1 x4 `7 U) _+ d* O7 J3 ]2 L5 B' D
*/
1 m2 m& M' D! i5 k9 [* Z6 C/ ]
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 f/ d! K: k, F8 {8 H( p/ D: q
addr = base + cnt;
8 P2 G& x y/ C
*addr = save[--i];
2 O/ m' k% W& b1 V' T6 J
}
7 x) T" z* j8 I7 q! p, W
return (size);
$ F: u! i1 ^7 z9 ^6 I; h* O# c
}
6 N) x8 ?: l4 }% c
}
# D9 |$ |* \) m4 V/ J5 N5 J% {
6 y. }; O( _7 p, F) F* r C$ O
return (maxsize);
0 I1 H/ [0 `1 I2 g) @
}
J0 J1 e! i% L0 u9 _3 m/ O
int dram_init(void)
) b( A3 Q; y( R' y, E& I
{
& Y& q8 f, g* z" s1 F$ l
/* dram_init must store complete ramsize in gd->ram_size */
\% p, A" U! O
gd->ram_size = get_ram_size(
# Q4 [" D$ V% t
(void *)CONFIG_SYS_SDRAM_BASE,
1 N3 y+ y, Z+ Z5 a/ ]
CONFIG_MAX_RAM_BANK_SIZE);
8 H1 K9 Z3 p: `6 C
return 0;
% o; p" G) ]. u) T# d) N
}
V0 B! I4 @ T- S3 w4 ]
$ d* e- {1 s4 G2 Q0 u5 B
8 L- o& g7 n; y- Z0 L: M) f9 q
% c1 c; d3 E6 i+ O' r+ a" S) u5 ?6 |; Y
. M8 y- |, g" U7 O/ |. f' Z
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. K) a2 P- \; |9 j+ j& W
/ L8 [) d9 g" O4 a5 z2 }6 s, y
) a1 g+ b/ A' ]& j; h8 o
/ [; `7 e+ w1 e8 p4 s, Z3 s; q
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4