嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
* k* D) R- m7 g
核心板2:DDR2 256M Byte NAND FLASH 8G bit
. m" |% @$ N5 X1 g- T! r
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
g0 [9 I: A: F1 O5 p
/ r- p! Q6 N* y8 I% D
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# p' H; ~0 f! O: k5 n
/ ]( w$ v7 ~& Y+ L& u# l
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 b7 e& h* N" u- g
/*
$ p, ^& a# }6 Z* u8 P- y5 O% I- t
* Check memory range for valid RAM. A simple memory test determines
1 G- W$ r9 s; n! M2 X) Y
* the actually available RAM size between addresses `base' and
# v) W4 G6 Z2 p* q7 E4 s+ B2 W$ n: E5 @
* `base + maxsize'.
, Y; T9 A" ~! P3 H6 ~9 g% x
*/
- V% |' c/ V2 m, ~
long get_ram_size(long *base, long maxsize)
# ?) ~9 g2 C, E, q7 M5 f
{
- ]+ _7 S' n" c3 v1 J
volatile long *addr;
8 m3 E7 M# |- u+ }7 U2 M5 M
long save[32];
" |, a/ k' a- A8 m- C b
long cnt;
/ k) W- b" P5 P/ I. n
long val;
* F% u M& d' C5 E' [
long size;
' q7 R) }4 o9 e, i! E( r
int i = 0;
! {; J. n2 y9 }" e
! n' f8 J/ c& Q& @
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* E) W( l' R: A& V) P* N# y5 w
addr = base + cnt; /* pointer arith! */
7 U% x* {3 `3 r8 p: o0 p; n L" ~
sync ();
! Y2 f- q" V8 |( S: f* t
save[i++] = *addr;
3 c+ |1 N$ } b
sync ();
3 Z$ X2 l4 l, F w- J* V1 }
*addr = ~cnt;
3 @, |' S# W+ N; f' g
}
6 Z; A, s8 ?, y2 I; Y
1 ^' M* ` y0 j/ e
addr = base;
- r/ d( B, ^/ T0 ?/ ]+ t
sync ();
5 Z& X- Y& r: ~3 I7 C, B
save
= *addr;
! Q9 w: H. h b5 N" e
sync ();
2 x/ M/ } Z9 o( g' ~
*addr = 0;
9 H0 t! ]# `. E/ b0 X {1 {
+ _; R0 e( X1 W% C% T; ^0 n' z
sync ();
0 }3 {+ o) G- f: H. i6 V, d1 @
if ((val = *addr) != 0) {
8 Z( s; J% Y/ H8 ~
/* Restore the original data before leaving the function.
( [0 w( l4 x/ B9 R
*/
" Z5 d; H8 t0 H7 J0 L. c
sync ();
& C4 t7 m! C" z% a0 a, l, T
*addr = save
;
, @5 f/ `( ^5 e# H, ?7 x) s, N
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( W4 o4 F4 B0 K
addr = base + cnt;
8 H. ~4 S9 g2 |+ z! n
sync ();
# S5 T! F! r5 s% S! y2 a6 t
*addr = save[--i];
; u) c4 u! W; }' N
}
9 r( h$ Q2 W& Z1 v
return (0);
& M( G2 n0 _( M+ M" V! }
}
, X% K, F: \5 m8 j) v, W
9 u8 v$ b/ c( X M0 k/ F* }
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 \7 E0 L+ n+ s# x
addr = base + cnt; /* pointer arith! */
5 x8 c" @# Y$ ?
val = *addr;
" U6 U$ t3 B \" n$ R# m j
*addr = save[--i];
7 B/ R/ K( G% B( a
if (val != ~cnt) {
! L0 X/ a; W+ }
size = cnt * sizeof (long);
, w: _/ U+ m% A7 S
/* Restore the original data before leaving the function.
5 v/ C5 |, K2 ?! K% N4 @* y9 [
*/
2 g+ V- w- ?" M; q3 ^
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, D3 s, A* s! @) m8 ]$ q# N. a8 T
addr = base + cnt;
# V: h% f8 t% i$ G O: O* e" b) a
*addr = save[--i];
0 h: E* R9 I0 N: y2 s6 J. p: Z' D
}
: |9 ^$ p3 z: N
return (size);
2 q) i: @) z) Q4 U' f
}
+ a) O; a7 z6 ?1 n9 V8 k( S: T) v
}
3 O6 J' a6 y+ D& _$ _( T) z h
9 S( B, W9 ?1 l0 A0 e) P
return (maxsize);
( L8 F$ X- b8 g% A& ]" d6 `: C
}
" K1 v7 x0 _$ V1 a u8 H
int dram_init(void)
# y/ H) T/ n' W _+ _7 C, L2 K
{
7 |( e- Z& O6 r4 I! ?
/* dram_init must store complete ramsize in gd->ram_size */
8 v; K4 \. M# b! U6 T2 u
gd->ram_size = get_ram_size(
3 E7 y6 Z) x1 f
(void *)CONFIG_SYS_SDRAM_BASE,
8 T9 W0 c( ^3 E# T" w0 [! l
CONFIG_MAX_RAM_BANK_SIZE);
: q# D; g( A: j. n: ?, S: [$ |
return 0;
& u- ]5 U/ W1 m
}
- z2 n8 l8 M$ Z9 r/ Q1 s% h( S( O* G
# l' E) w" K1 K9 h
9 V2 i# j. ~! D7 W0 j- |
* L ] Q d2 l- `1 i/ A
# d# z* p- A! H2 t! H) v; l7 I
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 V) e- V2 D1 T
7 T5 X+ |3 p+ w* M
- v# e4 y L. z% b6 M7 r8 a
$ p U# _, i( }: h" w
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4