嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
" x3 q3 X) H0 r( ^2 U$ V" r
核心板2:DDR2 256M Byte NAND FLASH 8G bit
- {1 d; `: `1 Z7 ^
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% K. c4 D* f: F
; j. l7 O! |% L$ s+ ?6 W5 r
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
4 v, B' B. D3 e- X+ M# [
0 d+ s. o0 L$ B- \0 Y/ i w$ E
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
5 V k6 b+ X' @8 H; x) w
/*
4 D) ?$ S9 L. I) y
* Check memory range for valid RAM. A simple memory test determines
* C' @1 a+ D0 X0 R
* the actually available RAM size between addresses `base' and
0 k9 m' u+ U/ m6 d+ Q. ]/ N/ W. w
* `base + maxsize'.
4 d" U2 l' ]$ h$ D. B
*/
) k: m' L0 b; c" C: \ o
long get_ram_size(long *base, long maxsize)
, C: c, o4 h7 t+ }& o! T% L
{
' W9 s n) \! e7 j
volatile long *addr;
9 J8 i4 r; K0 |7 x
long save[32];
1 [5 s: D; V; F/ `2 J, Y" M
long cnt;
# J+ {) H& O: g
long val;
1 j. w0 h' A* z2 X; I! m# w! E
long size;
# k4 g9 f6 {5 @# x( g
int i = 0;
+ U n7 @- ~- q4 k+ N
/ V" S4 f4 I' V4 u3 J/ ~2 V
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' C- v3 M/ n- s* V$ Q3 N
addr = base + cnt; /* pointer arith! */
/ H& m$ }- ^0 p; n
sync ();
! \1 \) K% [+ I
save[i++] = *addr;
# i5 @0 e) c0 J, s* i9 i
sync ();
' P" A( D* G5 K/ T5 a
*addr = ~cnt;
" C% \* ~* J# C: {" M/ R0 d# f
}
1 B1 z% W5 l b0 ~8 X% M4 F" m1 S
; N( ?8 o4 @& T( [- k
addr = base;
6 g( T' ~: b# r$ ]: }; L
sync ();
' B$ J1 n% O1 _
save
= *addr;
3 a( p$ z3 a) N: F
sync ();
# F8 F. K6 I+ B3 y6 Z/ E
*addr = 0;
5 f. k3 w* }0 p' a* P f) s5 K
5 \; E% n8 K1 F' s7 c$ }% f2 D
sync ();
! e& S1 h+ b6 E0 |7 K7 b" O8 q0 s9 }
if ((val = *addr) != 0) {
/ C o7 M& y, k+ S5 w) p" i$ ?; q
/* Restore the original data before leaving the function.
2 ?# D) ?) A4 q+ X
*/
+ s+ e" q7 O+ l0 ?- E
sync ();
6 T% v, v" g: L2 B
*addr = save
;
/ Q: K" U, D, ]& Q# N9 W
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( l( H% ~* F R4 |6 \1 ~7 c; X5 I
addr = base + cnt;
8 [4 u( U. S9 o A; }; l
sync ();
$ ~, W+ H" a7 j& i6 t8 C% o5 x
*addr = save[--i];
" I# u- c- k0 a, O2 T' [0 s; }
}
) E. c. U/ Q0 K' v0 n
return (0);
/ o" X8 H1 A" k) I8 r b/ B
}
& B6 F8 t& d9 i3 Y+ W( l
" ?, R( I; y; r0 p) ^
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" d* F4 @+ O; T, {4 A( A {% _! Q
addr = base + cnt; /* pointer arith! */
9 Z. n2 ?, Z% q. n' {6 }
val = *addr;
' G8 {/ f3 b: ~3 z: s* d% s2 G' ?: S& D
*addr = save[--i];
, A" j/ j o: C7 B6 u6 y3 @
if (val != ~cnt) {
0 _' P& r) }. P) Q+ {! {
size = cnt * sizeof (long);
/ Q! R; B2 p4 K: h
/* Restore the original data before leaving the function.
0 M, w' j- O% H6 s! q( F
*/
x% B( e2 g6 }! P, U
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, N# D) [' p R! X7 W( K
addr = base + cnt;
$ O& r! Z" @' ]4 |; K
*addr = save[--i];
6 ]' v1 \# a7 ^+ T% x0 U6 }4 c
}
) U, i0 l! J9 N" W2 c4 a! \) b
return (size);
! I# X) C% @, _7 G+ u7 n% i
}
. B. y) \7 K& O |3 S! e9 c
}
! k7 m3 G& q8 ], y6 m
( q1 t4 D0 f% ^- ]7 [
return (maxsize);
+ I- {( ]. R9 b
}
& [ B; X1 N0 _; l
int dram_init(void)
) F9 G' h" M8 {3 E
{
& Q/ y* a* [8 s/ o9 ]4 K& A
/* dram_init must store complete ramsize in gd->ram_size */
9 ]2 W" @* \2 `9 M
gd->ram_size = get_ram_size(
+ `% [. \) h* g+ h$ c
(void *)CONFIG_SYS_SDRAM_BASE,
3 L, @& `, l! `+ V, l7 _
CONFIG_MAX_RAM_BANK_SIZE);
* N p: K0 y9 b! p
return 0;
8 ^. e9 ~, b O7 k4 y- U
}
" x4 P3 F% q& U2 S# H
) |- z/ g7 l8 l5 Q' @
2 B% D8 h8 N7 {8 I/ {- d7 |; |
1 R+ H% R, F! G# A4 w1 Y
0 p- ?4 A/ \; }2 m% N
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 F, f$ m" h' a! _, @1 q
( r0 | B/ f+ a- q" g* u+ s8 P
7 R! U% @( {2 ?: E( ]0 B3 O. w; U
2 E* A- u$ ?; G, v
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4