嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
0 g6 J3 C. G/ U W+ ^5 \9 ?5 p6 |0 k. ?
核心板2:DDR2 256M Byte NAND FLASH 8G bit
( w9 Z. g0 I) E, ^
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* \/ X( G! \9 q1 ?8 X. b6 P
) S3 ~4 ~. l. J
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% C7 l" F3 w& G2 i* _ v: K
; m! M3 Q0 d2 ^6 N: k" i: D, x
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- ?1 m9 M9 Z% U
/*
* q5 |: T$ w8 x* g' t
* Check memory range for valid RAM. A simple memory test determines
- `$ t" M+ g, @9 `
* the actually available RAM size between addresses `base' and
7 u. W' M' `7 p% B, Y
* `base + maxsize'.
& R* q' o2 y2 {3 g( J: I
*/
! }* L# g* I2 O( Q; D
long get_ram_size(long *base, long maxsize)
B" `9 w9 a( S1 h$ `3 ~! L
{
# ]9 ^' _- l/ i+ W/ a
volatile long *addr;
! J; B. z# d1 r* t R$ z# Y& P7 t' s" [
long save[32];
, \. d, {7 p" c" D
long cnt;
( d1 v. [) t- K; K
long val;
* `( `1 G2 S9 H, L) o" |7 J
long size;
7 i# N6 X* |' o7 m6 f
int i = 0;
9 }! ?/ d& U9 K( p
; W. g2 K8 S, s, p) u
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: f& P0 K! R$ H E! O
addr = base + cnt; /* pointer arith! */
2 B6 Z/ p0 y! g! m- {8 w2 x; R
sync ();
; l+ R0 J6 l% e* T' u
save[i++] = *addr;
b1 s: J" j Z$ c* M* [/ r9 F
sync ();
o! H) _% Q; q3 |& E% r
*addr = ~cnt;
* ^3 R; B( T7 `. w
}
6 p! y2 q9 J! ?- R
9 n$ E/ u* w8 ^: c
addr = base;
6 }+ ?1 n% B6 T& {) e& h3 P
sync ();
. K& F7 J& W" n5 N
save
= *addr;
- }' {0 G; _; _) L
sync ();
0 r+ D& d% J$ x G* |) ]: A
*addr = 0;
7 T! E1 H' A" m; f- Y/ E5 U, }* G' ^
( ?( X& [: J; o) k
sync ();
5 S. A" X. F2 t! H, y
if ((val = *addr) != 0) {
1 g: E+ K% K! v& p) S% h; \" J* q
/* Restore the original data before leaving the function.
. N: P, V) b$ v! b, Z- [
*/
! o% O4 n4 F( }7 }' s. N4 a
sync ();
% _) c+ u- U; Z" R+ L( L4 v
*addr = save
;
8 `/ t% I% t, A& U; A2 M- O
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: b2 }1 \# `6 E% A/ C7 a/ }, t* o
addr = base + cnt;
0 ^% Y9 q* S3 L# K* |1 G+ O
sync ();
9 C w2 ?6 B2 F. a) _) i; K* f( n8 d6 g# z
*addr = save[--i];
\, S9 K( B, P* q% f- @
}
' M9 r$ p# g7 a2 e8 W
return (0);
) }$ T% S; O( B$ y. l2 e
}
( }0 Q+ q0 ]: m5 }) F
# ~9 O, p! E# f% A3 s
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. t- H& X8 `+ `* [* _
addr = base + cnt; /* pointer arith! */
$ ~3 P4 a1 b R% b4 i( n% b
val = *addr;
$ e( P! N6 _+ d& A* D9 K: R
*addr = save[--i];
$ t. x/ G$ q# u) ?( D9 E8 k" F
if (val != ~cnt) {
, A- Q( e: x9 Q5 m
size = cnt * sizeof (long);
' e% p0 K( {0 u( S. G7 {7 [
/* Restore the original data before leaving the function.
" N; f; I' h6 I2 E+ ^0 Q
*/
" l/ E9 |% {2 g) U% c
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 H2 o5 @; p! v, ]# [$ [& h
addr = base + cnt;
6 {* c2 f3 S3 {4 a1 W' [
*addr = save[--i];
" |: d" n9 L% `2 _
}
7 y! e' \; l# K$ M
return (size);
% o6 {9 V% A# Q3 H
}
' V) h/ [/ F+ E& { Y8 D
}
- f' b" w; z' ?# \" ]) Y9 }# ~$ j
i- `0 @' _8 w% n
return (maxsize);
& _) u2 x" J" K
}
+ J' }" I& D2 U# _* f. J- T
int dram_init(void)
9 E1 V4 n+ l# r4 Q$ W$ N" @
{
4 G/ z. i) l1 Z( W, x
/* dram_init must store complete ramsize in gd->ram_size */
! J9 S1 \- ^2 Y5 H) }, Y* b
gd->ram_size = get_ram_size(
6 A$ h) v4 F. W% |
(void *)CONFIG_SYS_SDRAM_BASE,
( p+ b( [/ T' c: s7 J$ r$ @
CONFIG_MAX_RAM_BANK_SIZE);
$ J' y' V; D+ f+ x8 P
return 0;
6 R6 U9 k$ w7 G4 k
}
; n' ]9 K& K' X- i( }( V- m, m
/ j8 U/ h" I8 ^' r4 B
8 y$ L7 z: O6 N! P b
/ h2 M! B( R2 Q/ T6 T4 q7 t6 E2 Q
' Y g7 \7 Y7 \- s! e
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 _8 F9 x: ~* g4 d: }/ s
% m+ P7 Q2 T& D3 _" E
# b! g( p+ D- [+ s+ {
9 W# R7 X+ T5 q
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4