嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
" O2 y t. T7 l9 Z
核心板2:DDR2 256M Byte NAND FLASH 8G bit
4 K: r* d& q6 U; Y; H( X; Z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 Z$ I8 _& ]* f; T3 q, W
9 U/ K! s; d; s8 R6 E* _1 @
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* |1 f' j- x! \9 F
2 j! H0 g& S2 ^% E4 p) q
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 C6 d1 U# M* [5 t- r3 v9 h
/*
3 `1 L) i2 C9 p' v7 r# T" e# ? s7 `/ `
* Check memory range for valid RAM. A simple memory test determines
3 X2 g( Q5 F. u6 l3 I. d: N
* the actually available RAM size between addresses `base' and
; a3 }. |, s1 u6 Q$ W
* `base + maxsize'.
# j9 l1 u1 z. E2 `$ [
*/
4 T2 h1 P- z: P' S* C" Q( b g! z
long get_ram_size(long *base, long maxsize)
0 s) W' s+ `# v+ O4 M$ d. O
{
1 _1 a# |5 o9 |) Q! s
volatile long *addr;
) Q. P! e6 B- J% g
long save[32];
$ e/ c+ x0 T/ T, X$ s2 G4 q( A
long cnt;
9 L% J5 P) ?" C1 U- J- Y' Y* ~) ~
long val;
! o% e q6 \ M) t( |/ m7 v, P
long size;
9 H% ?! T' N9 b E
int i = 0;
$ ^! z2 r0 ]6 L1 y& u
7 d- y$ T6 j+ N% H) @. ]2 d) M' Q
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, y, Z' S( i r/ m# v1 n) S
addr = base + cnt; /* pointer arith! */
/ @( D2 I0 D; u) ]
sync ();
! p: H' I% f5 |) P, c8 c
save[i++] = *addr;
1 m; d; K4 T$ D' i' @; u) ^) G, C
sync ();
7 S- g/ J5 v) f% s5 \2 F4 G
*addr = ~cnt;
" Q5 y3 u0 w0 r& E( ^5 |3 L
}
- L u$ Q5 B$ \% H$ ~1 Y
1 {9 ]% b$ c) C8 i1 E, z
addr = base;
+ P5 g4 W3 |( D8 W, P8 q% h5 e
sync ();
0 x) k; B6 o) L0 U1 U4 k1 [
save
= *addr;
/ f5 z# u' d5 p0 ~
sync ();
+ u+ O8 F/ }0 L+ _' b5 f& u5 @
*addr = 0;
0 V4 l) w3 d) o0 H
1 ~% z t) ]& `% q# X
sync ();
" p+ M; g5 A, `) |" @" O, y) j
if ((val = *addr) != 0) {
# C0 T: H: B/ X! ?# h1 u
/* Restore the original data before leaving the function.
8 {4 Z' k' N/ h* @* D. |- v, T7 q
*/
" Q1 ]4 f. t! g/ B/ {
sync ();
$ ^* O: a6 r) _5 h" `) U
*addr = save
;
# p% r+ P. R) k% o8 I( o5 |! F; [
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 y0 T) V$ u8 E
addr = base + cnt;
* A1 T: X, \/ U6 Z! T
sync ();
$ m' ?% i& R: f2 f4 X7 G
*addr = save[--i];
; ^; \3 y/ a( m5 Y6 w. b# p$ L
}
- x) k: p: s& V
return (0);
# @6 s) q5 ?) k
}
+ J% Y. G# J/ j, ^
7 i- ~! p# ]7 X+ z6 Z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: j z! s+ ]! X; o* _
addr = base + cnt; /* pointer arith! */
# v$ }0 @8 T$ D
val = *addr;
. ]8 l' T( a1 o' \/ i
*addr = save[--i];
' C! b' Q# G+ {' x. y% J; f* b
if (val != ~cnt) {
4 v" I" x3 a X* z `
size = cnt * sizeof (long);
. P8 t/ K( V# d9 j
/* Restore the original data before leaving the function.
2 }+ p6 w1 G! m E; O2 h; s, l" e
*/
" Z" s- F8 u% J' x4 O
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ U( @1 |! n8 X" E
addr = base + cnt;
" U$ C9 M$ A: W8 p0 }
*addr = save[--i];
5 F$ N: g3 k. D
}
" k' l4 }8 Z. t. q5 Z8 T, e! k
return (size);
# P [6 p- d3 [
}
9 ]; I- K7 Q( Z% z
}
/ b: S( `+ G4 O
$ c7 |1 p7 A! l P" ?& ?7 K# K# I& u9 D
return (maxsize);
K2 x& I$ D. Z9 U3 r
}
5 G/ a4 V2 O7 |8 j: X4 E
int dram_init(void)
- G; z! c9 L( P1 k+ B! F
{
e) j% B, Q& `
/* dram_init must store complete ramsize in gd->ram_size */
+ ] y, M* i# p6 G( H3 m
gd->ram_size = get_ram_size(
3 Z& s4 r. K! c( }
(void *)CONFIG_SYS_SDRAM_BASE,
; U. L3 m* t8 Y7 O' ^5 a
CONFIG_MAX_RAM_BANK_SIZE);
6 f1 _( ] ~! y: ^( D# I- n
return 0;
) ~! s* l8 {. \% |3 `; e/ W& j
}
) h& p; B" S# E( j2 ~1 k2 p
( ?1 S- B& p9 x6 E% T. J& e
- m& ^ E! N8 H0 {5 ?8 }! D
* H. v1 f# m3 M( l0 h, p
3 V5 u% d5 [8 g- J- v2 s! \, i
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 T2 D* {( U7 P( |
$ [/ s! A. S+ s0 q5 Z1 V
A5 Q- z, j5 D
7 T( ]+ _4 ?/ i
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4