嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
( W! p& H _% g1 Z+ F; J, h
核心板2:DDR2 256M Byte NAND FLASH 8G bit
, O6 y" P9 m1 o8 h% B& P
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- ~/ {" y8 B* |# z- |8 {1 ?# n" V
. c J8 w( i8 H- P: {% b
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ K8 @; S$ `6 b6 W3 N$ b4 W
; z1 k& O- t3 Z8 X+ a" o
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( p% t+ [$ f& b: {$ P' \
/*
1 O/ b M( q* V; A1 ]2 `4 J
* Check memory range for valid RAM. A simple memory test determines
6 x o) m' A$ `" a
* the actually available RAM size between addresses `base' and
$ F2 c& N( j5 M% m+ R ]2 _
* `base + maxsize'.
$ j! F1 L* a* `) a' w) U3 k" J
*/
% l7 V; E% S( Y/ z! \4 V
long get_ram_size(long *base, long maxsize)
& v8 ?& ^7 z+ u
{
% Z' Q6 P7 G ^% L6 @2 ]
volatile long *addr;
' L" x, }9 d* c+ j! Y4 n3 c' ?9 q" {
long save[32];
! x; v% T. d$ h: \& O& r
long cnt;
) a( e8 y& h! `5 ~
long val;
9 h5 r N" m; D* u5 W9 N
long size;
% D! p x$ N* b/ I( R
int i = 0;
0 I9 ]; Q& }; p- f- P
5 h8 y: h# ?6 C- Y8 _6 s! d8 Y
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
. z! `4 `2 \4 D4 ~
addr = base + cnt; /* pointer arith! */
[% N& w) i& d% F) F
sync ();
+ r; e0 a# L" J7 r
save[i++] = *addr;
% q3 `- L$ `& I2 n. e
sync ();
5 O/ |" q8 G! b
*addr = ~cnt;
. O: k; W, g) a" |* `- ^# ~
}
8 y' ~/ X6 F1 T, G' `, J: f
# n( ~3 g6 }. x5 c* q% U7 k/ ^
addr = base;
{0 X" S% P! F: S# h
sync ();
# Q* W" F z) g% r# `- ~0 N! ?
save
= *addr;
* q4 ]+ u5 O4 e0 _9 d
sync ();
% m" Y5 U$ K9 P; d* d5 Q9 h' q& Z. h
*addr = 0;
5 P! H6 ^. O% {( V' P7 O
+ I: `: t7 `9 w, A9 J7 A
sync ();
9 R+ Y9 R0 X, v5 Z' U: p* ]
if ((val = *addr) != 0) {
7 e1 k& X J3 ?; o% ]! ]
/* Restore the original data before leaving the function.
* S4 w7 |8 u/ J) U. e- Q' v" D
*/
! I' r* u. t$ o; d) N* N6 T( ?8 }
sync ();
- \" A0 F% |. W- m, R
*addr = save
;
* E3 b k4 Z* Q K/ I
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) f9 W/ D1 z! {7 z4 W' }& g
addr = base + cnt;
" t6 W; @6 e" Q0 v4 {; P
sync ();
5 G, L9 F b, P7 K/ w2 g7 [
*addr = save[--i];
; b" N! G3 W8 _* s0 [) v
}
) c) |$ B' ^! l$ E( b! Z. L1 l
return (0);
0 A4 W+ ~, J8 V: f
}
5 H0 C5 a3 D1 m3 n4 J9 q' Z
& ]$ P2 n: @2 {- T3 a/ Z, k% k5 L9 Z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% P; r0 |0 h% u5 v8 C
addr = base + cnt; /* pointer arith! */
" Q! @6 ^- C% d4 g
val = *addr;
: q0 {1 U' F3 A/ \3 e, u
*addr = save[--i];
1 a1 R5 g' F; E2 }$ K, f6 A! o
if (val != ~cnt) {
' [( h6 C% J0 U" D, p
size = cnt * sizeof (long);
& w, m: L% ?' |: e0 _6 }
/* Restore the original data before leaving the function.
# H8 s/ U, r/ A2 [2 J* H" q
*/
3 O. r1 x+ Y: v# G
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- A M" @- P8 y5 O
addr = base + cnt;
" @( H3 q, i& T9 h h8 H8 A
*addr = save[--i];
& p% C( N5 m* [0 o$ ?
}
7 X3 s& z9 U! X/ e! O3 h
return (size);
5 c L0 a7 [- F9 ^6 I* T
}
3 n/ v+ k2 U$ K( m! u! Z( A! i
}
9 w* Z" _" d3 d R
! x- E: f: T* d/ H
return (maxsize);
+ P) B& b' n @9 G# M
}
5 D% Q$ R* E9 U) p& P! B
int dram_init(void)
" F' b3 A+ _# y8 n/ J! P/ [ A' o
{
0 g# C5 ?* V2 ~$ E7 D+ t
/* dram_init must store complete ramsize in gd->ram_size */
W, K F) U8 Q Y& u' G
gd->ram_size = get_ram_size(
( Q1 U( e! U9 B: Y9 H r7 f L: ~2 x
(void *)CONFIG_SYS_SDRAM_BASE,
1 T4 m$ x% A. L7 H/ [: W6 i
CONFIG_MAX_RAM_BANK_SIZE);
, e# A$ p% L% a
return 0;
7 l9 N. p( Y/ c$ T$ D0 Y
}
4 F' ~1 N) P; @. a& B! V2 F
; F- y5 D3 p0 g1 s! n
h0 x; p! c; _! I' j
- p( v" @0 C$ `1 N, S0 v% f
! u4 ^# C$ |; T8 B7 w& b" a
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 S, a1 ^+ v. a. Y2 c
5 F8 B, Q! \1 p4 c0 c/ t
( z+ G6 Z' K: d, o4 [6 w D
/ \7 J3 K- f' e3 R" G4 c( y
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4