嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
( O+ b7 K r% \& k l
核心板2:DDR2 256M Byte NAND FLASH 8G bit
2 l, }1 Y1 W- F: ]! `3 B- y2 i
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 {/ a- e1 ~8 Y( b
% G/ _; z$ |/ g, b$ S' H
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* m+ k' @: t- r
) d6 H) _+ b5 S! g6 R: I
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* @" x7 @+ b# }9 l
/*
7 j; G; ^$ H# n8 ]7 J: O* W
* Check memory range for valid RAM. A simple memory test determines
2 Q2 Z9 G* S2 f C( H" D+ i* }2 E8 l4 `
* the actually available RAM size between addresses `base' and
: |; V2 t: \8 V% T. n7 P
* `base + maxsize'.
. m9 k. M7 F2 I$ E
*/
7 K; n c7 L+ h3 [' b* S0 O9 D
long get_ram_size(long *base, long maxsize)
' u" |% q( a$ Z$ B7 J
{
0 O: u( v& B( @* N
volatile long *addr;
2 u: `8 ~- K1 o: x$ q2 F, m
long save[32];
% o- o3 [ _* Y1 g: e
long cnt;
3 p r% R* n; | `; r! U P/ K
long val;
4 N0 H0 H: b( L" ]( u
long size;
! i, s. D- _1 u N
int i = 0;
2 |* y+ `; E: h4 b5 B
% F7 }; G4 e- h
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
. Q( K% S2 U0 p( K, F" T5 a* E# {
addr = base + cnt; /* pointer arith! */
1 N4 o9 |8 p1 D' Q2 E
sync ();
! o9 h3 {% k; {/ u& }0 Y6 M4 I4 h
save[i++] = *addr;
& r$ y6 s! @ U* z+ } J
sync ();
- W/ l. t7 z8 ^% s- f0 i, D V
*addr = ~cnt;
+ h" H q7 `6 {2 d* S- `
}
" j# U7 {( H ]2 _/ b$ c. \. G
4 Q+ R; D+ @/ @6 X0 A
addr = base;
* j( c: S, e) r' ?9 Q- W a; H
sync ();
7 o: T6 t4 r; P9 E! I
save
= *addr;
9 C- L, [% n; f8 G
sync ();
- D. l+ k* k ^% c' E
*addr = 0;
1 u( P; [9 n- G8 v% e) r! D
; K4 b! c4 ^6 {
sync ();
! Z# H1 q+ `$ \) h
if ((val = *addr) != 0) {
/ j+ x# y; I) o( i5 p; i @
/* Restore the original data before leaving the function.
* l8 e2 A' M9 l2 q" z0 E T
*/
, ^% H; B: }6 K" o1 `! U0 S+ D' G: V1 ^
sync ();
6 Q4 H4 _' [* t
*addr = save
;
% B! O( z- m) @& x. G
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 t; G P2 d" w1 Q- c
addr = base + cnt;
N& X1 b: c* T9 U0 s. L9 v
sync ();
- v0 ?7 Z4 M1 g' _) r2 l- Z
*addr = save[--i];
- U4 V% v3 ?( ^( O' [% l: ~0 ]
}
1 m1 ^) ]: H8 H
return (0);
/ k6 J% d' s$ e2 O
}
' t# _6 e3 t$ N ]5 h C
9 I% ?2 [* U5 k
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' W& y; d8 T5 o; X
addr = base + cnt; /* pointer arith! */
- i2 M2 E) H+ x! v& k: w, v3 ^; R! K
val = *addr;
8 Q8 G7 }' P. q6 {
*addr = save[--i];
: l8 M6 q5 D# B# L0 j: m6 l
if (val != ~cnt) {
% v4 D9 n6 I8 c
size = cnt * sizeof (long);
0 y( A# \3 N3 k$ ^
/* Restore the original data before leaving the function.
: W# R/ {$ S# G' D0 y
*/
/ s/ M! T8 k) O$ R- a6 O
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: Q4 F) E2 b! @# {
addr = base + cnt;
4 H) `" U, C+ s. G7 O% e
*addr = save[--i];
# @4 A x. Y- Z9 v N1 _
}
, D; z! L( o& B( I2 j6 G# g
return (size);
# J$ b* L) ?3 e( ^# x! Q) F0 o
}
6 v" {4 r9 X& t2 c- |8 g
}
" A" V7 {9 X" h' ~
1 a$ K/ p+ P: d" [' x8 p- o: F+ j
return (maxsize);
/ h" ?; ~0 Y3 `3 J' @3 [9 Z6 F. r
}
8 }9 n$ V! w# l" @( C8 O$ o
int dram_init(void)
+ @ _/ E$ S- l; w
{
# I# L" O5 ^! `/ k6 z
/* dram_init must store complete ramsize in gd->ram_size */
' ]9 E* W3 k/ l. g; A* h
gd->ram_size = get_ram_size(
- j7 a) r, O! z+ D9 S/ K
(void *)CONFIG_SYS_SDRAM_BASE,
9 D" J; d A' m. t- Z- Y2 E8 |. ^
CONFIG_MAX_RAM_BANK_SIZE);
4 V0 e9 d& S% t9 u
return 0;
; p, w, r' S: w
}
- V9 Z) l( Y6 d; s9 v
6 J$ C: t1 k7 P2 o8 R- h
3 B, S5 Q, w1 G3 d3 Z) D
( @/ X+ x' B5 n9 `; @. c
; W8 U9 o6 a( C3 H
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 i. N6 G+ {- q! F
% Q3 o) h7 E) @$ C3 g
: i/ G. C( a- [9 e' q
& `% N! V% c1 c
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4