嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
& A& C+ |7 Q& z+ Z
核心板2:DDR2 256M Byte NAND FLASH 8G bit
9 ^6 D( p0 h- x* v* V
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
9 d) t. I4 ]/ O: t
& g; c+ T0 ]% Q0 m( v7 K# g4 x
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* n9 P t4 L4 s+ C8 V! a! K- e" ^
; |. {% S" U3 m
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 q1 d d2 }3 P8 @! s* N8 Q, V
/*
/ O" Q( E" a6 `$ A
* Check memory range for valid RAM. A simple memory test determines
% {& Z; O1 m R& C! j+ E8 ^0 G
* the actually available RAM size between addresses `base' and
9 R$ U6 j; I* L$ G A
* `base + maxsize'.
3 Z* ?9 M" q k2 p
*/
( L) g3 w, S1 c; {& R' X
long get_ram_size(long *base, long maxsize)
- L6 S( ^/ R) v+ S2 z) f3 u; b9 q6 [& X
{
- t$ ~( D0 i z" Q1 ^
volatile long *addr;
; N: n& T/ i" [2 F
long save[32];
: @0 r+ |0 x1 H" j) n+ k& e. B
long cnt;
9 c" I$ D( [" s9 ]: ^1 |
long val;
' }; H: r* n5 g: h
long size;
( A. @* e% w; c! p
int i = 0;
7 M0 j! H2 w: H1 b$ U
7 N( t" k; g# E2 z' ?8 ~
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! Y; g; G# G4 c& q% Y, b
addr = base + cnt; /* pointer arith! */
I3 P$ c% K7 |& @- T
sync ();
% q) z- z' I O6 j3 p
save[i++] = *addr;
$ m, U7 p6 }" u: V; A
sync ();
6 L* x' t& X: ~1 E
*addr = ~cnt;
* Z6 {4 o/ P, g3 P$ v' X
}
$ e' r+ D1 o# y8 |/ U
: Q- e% b: v: F y+ Q; C7 l
addr = base;
; F* o7 D4 `: ]8 g
sync ();
* E+ _- k8 B+ g+ R) x$ n. D
save
= *addr;
- [! R7 ~9 G' z0 N7 a( m
sync ();
# B2 \% k6 x, G3 B+ M: @
*addr = 0;
& P9 @2 ^1 O; d6 Z
; I5 ^# b% `9 Q
sync ();
# @" ` o) D! s& u$ i L
if ((val = *addr) != 0) {
1 f: D. H( A* G; L
/* Restore the original data before leaving the function.
- o" y! Z1 ~8 I; A0 d6 c) L2 q
*/
- A: |- q+ z' I2 y! ^# _
sync ();
X) D* s. k* n% s- o$ a
*addr = save
;
) o6 ?3 _8 b0 b
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
" b- q7 T$ s4 u7 R6 u! \2 s
addr = base + cnt;
; y- w, _5 o6 D, [
sync ();
% [/ }. _- z% `2 m; i- }# V
*addr = save[--i];
4 H! l& B" B- B
}
2 s- i% C# m3 A$ M# @, k7 I2 S9 t2 |
return (0);
; q2 \0 y( L8 I
}
6 L! ]2 w7 @% f. ^, ~, [" m
! P! t& ?7 O4 Y5 k' s4 l; D, }+ [
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 @ d8 d. n0 @( O4 }( `* u
addr = base + cnt; /* pointer arith! */
: S& v: k* Y4 q
val = *addr;
2 T, N6 q$ P# n$ w
*addr = save[--i];
/ Q, d2 _7 n( \9 t) G
if (val != ~cnt) {
4 r3 G5 ~0 u2 M8 \3 a$ p% E
size = cnt * sizeof (long);
6 R. R8 g% {7 l7 g" A8 J4 B
/* Restore the original data before leaving the function.
8 P& P; J0 f- R! |
*/
1 W$ b# V0 _3 w
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 i. A6 ]$ ^$ `9 e/ l
addr = base + cnt;
! z$ v- R2 H% M* k! p
*addr = save[--i];
! J, Q, m: ~, J- I! X8 j* Q6 U
}
! O5 n: V$ l" {5 n- T5 D6 v
return (size);
7 l9 u- B4 ?) R1 t0 \
}
( D M& W% R3 F. @+ Q
}
1 Q5 b4 ~7 V6 o/ |2 Q% B$ g
4 w8 e- U! A& W0 M$ A- p" V
return (maxsize);
$ ]/ W7 k: x! N& s9 G% s
}
; H$ j7 R9 _0 s) \
int dram_init(void)
+ F. c& r1 s# U- {: i
{
/ r/ A* r4 h) r5 ^9 g& V, k
/* dram_init must store complete ramsize in gd->ram_size */
j* U; |8 X" i% n- D
gd->ram_size = get_ram_size(
) B4 l1 f: R8 c8 \" t, m3 a+ y# i1 Z V
(void *)CONFIG_SYS_SDRAM_BASE,
7 ^. H- A6 ~' B) ]
CONFIG_MAX_RAM_BANK_SIZE);
; l) u) c2 I1 X/ ~, d
return 0;
1 W: d+ x$ R# A7 n4 m6 i* d
}
- s: H) |! P8 L& X( |" f( [
6 R; o% G9 Q( J# t7 K
+ i3 P% D+ ^! L& v& Y* k
J4 Z; V; @) W0 j
: R) l5 u4 S9 m% T/ j, X% A
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
! m" d' O* s' R$ s
3 B6 p5 H3 I7 A p1 G( Y
4 w" o9 R3 A9 h; |8 M
% ?- j7 `8 `0 N6 z4 I8 w
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4