嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
0 {% [& K) A/ X5 H* d$ l' @/ ]
核心板2:DDR2 256M Byte NAND FLASH 8G bit
& d+ f1 M2 p6 Q/ q0 h h- v+ y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
5 v: _/ K* s r3 b' w: H
( Q4 n9 P2 k4 P- t! a1 [
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: ?, f8 C7 s2 r# r( a
+ H: H. E) v% ~1 _+ n' a
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 i' t0 P; P8 W4 B5 |2 F
/*
# }8 C$ z% M- D, g* i" \5 t$ ~' a
* Check memory range for valid RAM. A simple memory test determines
6 U1 M9 \0 S7 {/ Y6 g$ H
* the actually available RAM size between addresses `base' and
, ~2 H9 J7 M& y( g/ n
* `base + maxsize'.
" K, l! Y1 z' O3 R
*/
! F- J8 ]' k3 v
long get_ram_size(long *base, long maxsize)
8 G6 [7 [6 V3 H6 a; S9 z
{
6 {' v" g+ T# ?) k* A2 u/ E0 Y4 w
volatile long *addr;
( Q k; H. p$ b. X6 @; \
long save[32];
& n, Z X/ [3 }/ w
long cnt;
, e! D, \7 b% ^1 P, v" ^# @ F4 I& ~
long val;
* o& L/ o+ D9 Q6 v
long size;
3 ?% u6 a0 B) y; ]2 S% F
int i = 0;
( {& Q" }9 m" t- _* p3 y4 d$ ?
$ D( z, @* V8 p/ v
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) r: I8 k$ w% i' W
addr = base + cnt; /* pointer arith! */
* `! {. b. r6 N/ G
sync ();
3 }0 y( O( e+ @
save[i++] = *addr;
" ]6 d" C0 L5 a# U \& P; P4 b- C! s
sync ();
- z! E) d: I, W# J8 W2 X5 d1 P ~
*addr = ~cnt;
% b E3 [3 b8 ~. d
}
& l0 N* y2 t o) n7 M' Z m: r# C
6 e5 G& O% v n& v
addr = base;
) T: J8 _9 J! C$ C2 ^3 f+ Z
sync ();
1 k# J% k( \# b* S# w
save
= *addr;
3 F( Q3 }5 t; g
sync ();
; W& B1 _$ o' g+ w9 n: p: ~
*addr = 0;
+ @* I4 C/ ?0 V0 W2 D
! k0 e5 c. e7 j- m
sync ();
. @. L9 Z- S+ n2 J$ y
if ((val = *addr) != 0) {
# m* p/ ~, r8 D' H( p
/* Restore the original data before leaving the function.
. Q9 W- X+ }; S1 B! d, q( [" \' N
*/
+ ]! N9 w! c; t* O
sync ();
+ C% Y' X: p- p, o3 {
*addr = save
;
" u8 F! Q2 L" j1 p
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 o1 w ?7 a- x& h5 }! [
addr = base + cnt;
0 Z; v4 M% t4 M$ ~
sync ();
( }# k+ i2 |- Y; ?# H
*addr = save[--i];
8 C* r6 E* H! A0 q# u
}
7 ?; c$ @9 L2 _4 O
return (0);
9 t6 J4 ^" P+ c7 E1 l5 V2 r
}
4 o. J/ `0 T- x+ H3 K
. d3 d/ F$ a( w0 v# S% k$ Z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* T& s1 C* R% Z ]& b
addr = base + cnt; /* pointer arith! */
2 p' e+ Y; u+ L" W3 F
val = *addr;
. ^' O$ M! k. |" |- s3 C1 R7 a$ m
*addr = save[--i];
- G- t }0 ~( J8 M. w
if (val != ~cnt) {
% z# n8 u1 v4 q. ]5 J1 v
size = cnt * sizeof (long);
4 P- X" ^' L6 H& o: W8 ?9 c0 E
/* Restore the original data before leaving the function.
! v# e" l: W* A4 n6 s& [3 u
*/
r* ?6 {' H8 T/ B! g, j0 N
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; o# {5 {- n9 r* {
addr = base + cnt;
2 D/ m8 D* M! i% D2 g6 k
*addr = save[--i];
* q8 c% L! V' i/ x# r
}
. [& u7 J9 w1 E
return (size);
# U, o2 p' F I" {
}
0 _: h, b' i! F/ z5 E
}
9 y4 \: k: {" J N1 M# \" _
3 t( ^9 K& \* s8 L
return (maxsize);
5 F: }2 x) {6 w: s$ ]( u
}
& E$ F5 C7 e0 q- o
int dram_init(void)
+ ^% B9 z4 ]. E' i+ q a. y
{
! ~, @. O$ H: i- b5 H( q
/* dram_init must store complete ramsize in gd->ram_size */
% u9 Q* L& W( C
gd->ram_size = get_ram_size(
' H: A" I$ S2 N+ M" s! F
(void *)CONFIG_SYS_SDRAM_BASE,
4 x {" g. p' @' s7 h
CONFIG_MAX_RAM_BANK_SIZE);
' r& v1 c3 m! [
return 0;
5 @/ {# d7 E) } k
}
! ?( B5 P( z7 }7 v& p0 ?- I; i
+ c2 K+ ~, F! [ ~: ?
/ ]8 q3 S8 p6 E! ?
/ [9 h( p& d1 }. y
* L- J3 a3 V( j. j9 n
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
/ ~9 H) m6 @" {# e0 ~$ [9 Z
5 T$ `! Z5 J- e. [0 b
/ A4 c# L: d* v: U
A- c2 l5 ?& T6 C' u) Q5 \( W
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4