嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
. z+ J# z, v7 G: R9 {
核心板2:DDR2 256M Byte NAND FLASH 8G bit
( c, D* Q( k9 b
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
_" }; v# M( P# N h
/ t% s+ |% e6 A! @6 c9 [( k& }
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( j3 A) \0 _7 f+ P3 ^
0 s, j, e/ \5 y. w
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
# s+ p4 ~5 Y2 E- D* [
/*
# h- U& ?# c. e. ~0 T- P
* Check memory range for valid RAM. A simple memory test determines
3 m) @! x5 }9 y5 O
* the actually available RAM size between addresses `base' and
- q7 K4 J. v6 \9 a' [. I& ~
* `base + maxsize'.
. J/ ^+ ?4 A6 D- L s9 w0 \
*/
; t# m% @6 Z+ @! _9 }
long get_ram_size(long *base, long maxsize)
r/ A! Z. T: Y" Z7 i; j
{
% ?: d5 p! k( n S& a2 ^
volatile long *addr;
6 N5 N; o! S% f* l+ X1 B
long save[32];
, w7 W" Y! A' X1 E' F. W
long cnt;
G9 g9 I0 b, |* F- l8 W
long val;
6 Q$ x6 o+ f n9 h3 y9 @$ i2 d, |
long size;
8 \9 Z# e$ M) y) ?
int i = 0;
/ C6 Y# W. z( _. M# C6 v, ?6 P* T) o
, {0 l3 ^ p3 O, V4 @" c
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 C% B( c# }- p
addr = base + cnt; /* pointer arith! */
9 z5 V* A5 g# b% H. [
sync ();
1 A9 J% [3 R: Z. ]
save[i++] = *addr;
8 t+ J. t) \6 ^* H/ v6 u% s1 p3 y
sync ();
+ R4 l( C0 @' F
*addr = ~cnt;
9 S# x2 U" h8 W( H
}
& `2 w9 g6 }4 _+ f8 L: m
% q2 {/ Y' C7 C5 q1 t$ F' F3 _, w
addr = base;
1 k, C5 s% G- {7 m0 j
sync ();
8 r% t$ C6 N' p1 x( [* ?# p$ C) w% i
save
= *addr;
$ p* X! O0 F9 b+ w
sync ();
7 {$ M {2 n' M: T7 B% U* v
*addr = 0;
) [- A0 I+ T: e" w1 o8 ~
( y. Y+ w1 T$ b
sync ();
0 T" E& ?: {( F; L) d
if ((val = *addr) != 0) {
' n5 n% _; G; u7 l( J3 H
/* Restore the original data before leaving the function.
# w7 h) \7 X1 k) K' I/ Z
*/
- p; t* w5 Q- E6 C, s1 U( \
sync ();
0 ?7 ]9 y2 T/ N* g2 S& n% ~) C
*addr = save
;
3 {- V1 \ N* o2 ]1 D5 k
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
8 `0 s0 Z; H6 f% @2 g: t6 v
addr = base + cnt;
( U: D8 K; w- A( z Q
sync ();
9 _# u$ d- y# _: }
*addr = save[--i];
8 V, t. _. |- X! k% _
}
+ | D, S0 |8 [6 h) B# C) {
return (0);
4 k+ P) X5 }" n! Q6 h" ]
}
) m9 A* M6 V% v& N
: I) X( s: Z9 I. }0 `
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, j& \* u7 f2 E6 ^
addr = base + cnt; /* pointer arith! */
+ |. b) j R; m) V* q0 y2 `* V; g
val = *addr;
1 {& `4 j7 @4 f8 ~
*addr = save[--i];
2 e; {( y) f$ C" D' I# i
if (val != ~cnt) {
s7 N. v6 p# q8 R
size = cnt * sizeof (long);
. a* f" p9 r: y7 N2 {: v" N9 @: S
/* Restore the original data before leaving the function.
* S$ O$ u, n4 V1 q( e$ S6 M2 B$ a# A& u& r
*/
) O1 W0 \5 E* { F! o
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 G) x! D! w$ i
addr = base + cnt;
* i! [( l" O0 E* @
*addr = save[--i];
+ s( q; h! @( z& ~+ C+ D7 Y* ~
}
2 B% |1 Y4 a9 ~* O5 h6 E
return (size);
, V# `4 Z2 W" W5 C% R4 ^7 }5 D/ m
}
5 U# P3 w+ n* n* \& B8 m3 Q
}
0 o# Q6 A* Q$ y
. q) d# S5 i- R8 E/ }$ S; P
return (maxsize);
' O6 c" F7 v- {* l8 z: R
}
9 O, `, Y+ O' ~; g# ^5 {
int dram_init(void)
1 }6 F: o6 D+ }$ Z
{
9 h) _3 f' B3 s4 p$ [
/* dram_init must store complete ramsize in gd->ram_size */
; q3 S, G' A. Y2 H( r
gd->ram_size = get_ram_size(
, D0 h, J# y: a1 p
(void *)CONFIG_SYS_SDRAM_BASE,
9 v, x2 a* _, p# F9 S# @
CONFIG_MAX_RAM_BANK_SIZE);
8 v7 x2 ~% s9 G, L
return 0;
1 N; ^7 k3 s) e8 i
}
. z+ E$ ~6 k# j- ]# B* l! g
+ p# q) a3 X( D' X1 f S
0 h1 ~; Y5 M" w5 k: k: ]
0 Y5 ^: @# R* c0 J
+ R) E$ _# N1 y' C N/ k
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
! ?# X6 }$ Q) d( s, Y: o7 g2 r' u5 j
$ Z/ U2 d6 h2 ^- p
. o: T5 l: l8 ~
5 h7 [" E* x) {3 {8 F- ?; ]
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4