嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
3 j: w$ Y, D' M5 l+ s0 H
核心板2:DDR2 256M Byte NAND FLASH 8G bit
/ n4 T9 y4 g" d e8 x: |
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, Z0 \4 M* N' W/ X# e
, h0 T/ K3 z) m5 O2 P* Y
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; m1 i4 J( ]$ D: o
0 J! A8 h) O5 {/ O$ h0 J
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ I, W- A2 \8 g! E) H- e) R* _
/*
" a8 A$ ^4 M% z& z
* Check memory range for valid RAM. A simple memory test determines
5 ^$ }9 H$ m5 t
* the actually available RAM size between addresses `base' and
- Z5 S5 E6 p5 e
* `base + maxsize'.
5 b, s; {1 }7 |
*/
8 G6 W' X' B7 ?) w3 A" Q$ B2 Y
long get_ram_size(long *base, long maxsize)
1 w9 G$ W+ |+ {6 D/ L% \
{
' B& B) P4 Y$ }) Y4 }
volatile long *addr;
+ c3 s8 H, k( h( [: e
long save[32];
% s, {; p/ p8 L$ X" Z D
long cnt;
- _. ^" K# }4 H
long val;
4 {2 ~# T! {. \. C# M+ p
long size;
5 G4 R& `0 H% N6 @* A v
int i = 0;
) I2 O& y/ ]& ]
1 m& Y/ v0 I& ^6 Y
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 K6 T, v [# j4 ]5 A x$ w4 _
addr = base + cnt; /* pointer arith! */
6 U% K/ Y6 b# T
sync ();
/ z7 W9 C1 p0 i$ r6 ]
save[i++] = *addr;
7 Y$ }$ W: K( n7 ?0 k
sync ();
8 X& j' x1 y/ |& w
*addr = ~cnt;
1 E, q1 d5 E$ R+ X9 s9 Q7 R
}
A+ n2 ?( |) }0 S' E& Q& Y) @
# b4 g8 ~3 ^" G$ o" Y8 {
addr = base;
- V8 \2 X& v% L4 s2 j
sync ();
8 d+ Y, l" C S2 k4 Y3 T
save
= *addr;
5 y) G! z- O/ z2 S# O2 A
sync ();
0 e, d& O# G: _0 z/ E; V5 j
*addr = 0;
" J& \" g P5 F2 T& b8 z1 q3 X
1 S- m& H. g4 [7 d8 x7 C& D/ Z
sync ();
4 U1 Q2 U. S7 w9 u$ f% h4 ~$ |0 H4 X
if ((val = *addr) != 0) {
N, ^1 _, `6 {& [( L1 V! |
/* Restore the original data before leaving the function.
! h% E' X, c/ C/ K& a8 x
*/
0 l) c' d3 \' U3 w9 ?8 o% L
sync ();
. z& z& k) {& e. s& n' B9 p& I
*addr = save
;
+ G( D9 H) `% q8 c, A
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 Y% G! d7 ]9 |1 {! S6 _/ T6 ^
addr = base + cnt;
, T3 B$ a2 T# M5 d
sync ();
% Y" D+ P2 b H4 n
*addr = save[--i];
2 S; L+ \# V2 l1 U: s! X# W
}
# K3 r9 w, Y' M4 \7 X
return (0);
$ s9 t" L" h( U9 T7 N
}
" g8 C5 _* y2 { o; `( T1 Q; |
! j# L5 k: p0 }1 ]& _
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% z+ ^7 C/ v5 f. J! k
addr = base + cnt; /* pointer arith! */
/ G& V: V& c2 `) W! t5 p
val = *addr;
! l0 G/ k8 N$ A/ l+ V- [
*addr = save[--i];
$ w7 z7 C1 r" n
if (val != ~cnt) {
! n/ \/ o: e2 E
size = cnt * sizeof (long);
" f1 j3 X6 i' D8 Z n2 a
/* Restore the original data before leaving the function.
1 P: J' B0 E" p# q# N
*/
& K( l4 E1 ]& L7 g8 x/ d
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( `/ I; z4 U2 a3 g: ^; c
addr = base + cnt;
0 Y$ Q- _8 z( ~8 g8 E7 d
*addr = save[--i];
; _3 N. A" R0 k* u; b! T" A( b1 M
}
$ Q/ p# M5 o0 l6 J
return (size);
8 `) R$ T( N; c1 C3 r/ z4 H( K
}
) x+ ?8 u6 X6 A- M# n
}
, n( k1 J0 u& e) Y4 W
, K$ a6 S: D4 F1 |3 V
return (maxsize);
+ y0 S) C3 x" j1 B) E6 p
}
) F1 J1 K; Y _ U# {
int dram_init(void)
3 \8 R0 z& X z; a% z+ H/ T" W
{
2 U" G. q# M9 N
/* dram_init must store complete ramsize in gd->ram_size */
( G' v# q7 n1 v, e/ Y. K
gd->ram_size = get_ram_size(
3 H9 I6 I9 u* {! p
(void *)CONFIG_SYS_SDRAM_BASE,
3 Z3 J p+ V. Y5 ?( ~
CONFIG_MAX_RAM_BANK_SIZE);
' A2 O/ F$ F$ p( v" _) Q/ w# |
return 0;
' Z7 {5 ^( i' k
}
# `# u# v# e4 Y+ {9 a* b
; q) N$ M" L3 Y! o7 R4 c
# A ?# n3 n& h
0 U* A) m F7 C& U6 }# T3 C
) s- L/ C8 D* x* z0 B0 i; p2 _
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 U$ J+ c @8 U4 A% H) d0 C6 C
2 G0 s2 _% s, U
- {- i1 V4 ~- M9 Y
8 L3 c) R7 x+ \! R4 M( D2 t; @
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4