嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
# x- J& `0 G( i, U/ C% t3 d; G
核心板2:DDR2 256M Byte NAND FLASH 8G bit
3 C3 [/ t, w# r% u) h
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 X" G( ^! g' c! H f3 H
" u1 g; P! d; L$ C
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 M' D5 a* I8 P' l- h6 `
/ Z0 I( F/ N6 g* M$ [$ \; T
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
; X! u/ k; B8 H1 d* Z' t
/*
1 A5 X. _* a4 Q9 u) j6 L. w: W/ G3 m
* Check memory range for valid RAM. A simple memory test determines
# B3 \+ V' Z: l1 Y
* the actually available RAM size between addresses `base' and
, E" ]: Q' T+ a0 j: [" l
* `base + maxsize'.
3 e( z- x! T5 q* K/ m+ D1 w: u6 m
*/
$ D- m3 x$ C) t$ O! |$ N
long get_ram_size(long *base, long maxsize)
. E0 m6 d. O! X8 M: ?% |
{
! g+ g: z# d5 e! m7 W8 f
volatile long *addr;
( Z0 [% z [. N% c' J ?
long save[32];
! p( e& ?( H* y$ n3 M
long cnt;
# b) {+ a6 _6 Y' v% j# ] j) c
long val;
- o8 \) m4 O7 W
long size;
+ u/ a6 y! a7 J' t
int i = 0;
# t$ B& H( B+ ]" [$ u% H
" P3 m' [9 y+ O1 @: \# ^
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
9 n3 a, F E5 a) }- p: ^- A6 a9 c
addr = base + cnt; /* pointer arith! */
3 X& C: O# W: O+ \6 Q: Q- I' s8 W
sync ();
% ]2 s* v2 k0 J+ W8 ]5 `
save[i++] = *addr;
" N/ J B" C) T ~; G1 B
sync ();
+ K4 {9 f) R+ u- T4 ^8 @, f: K
*addr = ~cnt;
* V0 R9 s' F$ u5 T$ }" p
}
]+ t' I, D9 N. }+ X3 @
; m3 p/ O" G1 J) U
addr = base;
# C( d, D) K) j0 G
sync ();
; P9 A2 J) x# _. j* }, r
save
= *addr;
% @) Q) }: d6 W' r5 C. l- a; O6 r1 {
sync ();
! d& S6 W4 ]3 C9 q# w) F7 t
*addr = 0;
7 k) a' ~7 q. U* O8 X
3 q# K0 q4 S5 [% v3 f0 x8 F
sync ();
* y/ E; @& y+ @4 S3 @ u5 `. }
if ((val = *addr) != 0) {
4 s; N+ |) c) B! B: R$ }
/* Restore the original data before leaving the function.
8 C8 s( W: b8 J! T6 i) H
*/
& q+ x# J1 m+ b' K Y5 I
sync ();
+ M/ _; l8 l) s" A
*addr = save
;
2 o+ v1 g6 a" n, d; p: }
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, o5 M' W' k3 d: N) @0 J! L
addr = base + cnt;
, Q" C9 i& i7 V% _4 q7 [: B7 |' T
sync ();
( X: T) d7 I1 N: }
*addr = save[--i];
5 g1 }& f. m* h- J, x
}
j2 m0 \6 ~: ~" d" x, B3 _' B3 j8 y# c
return (0);
: g, ]1 e( f0 C) N/ r0 f
}
& |7 e* \) `; J* I
0 Z% F" B! d3 N
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 c- `7 U9 f2 o# z6 _
addr = base + cnt; /* pointer arith! */
1 _8 x1 w* v. h
val = *addr;
1 J* W' y: A$ x. W$ X$ c0 [
*addr = save[--i];
8 H% y) [; Z: A( B- g: \
if (val != ~cnt) {
# C* k6 X% x7 p% c; k" P1 m- H
size = cnt * sizeof (long);
( `" ?+ Z) q. t- T1 e) a. k. o. y
/* Restore the original data before leaving the function.
4 S& C, A: I& w6 O* t7 M
*/
7 R( ]$ m: b+ y" E3 ^ w
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 w4 R# g# Q* D1 S, q/ Q
addr = base + cnt;
( f- U) W, l5 k% l
*addr = save[--i];
0 o E1 S8 V' b2 F" ?
}
s; R: Z; X0 w
return (size);
$ ?# r& [1 z$ l. T E0 G( ]1 H
}
; g6 F& T5 |' `$ S" `
}
+ m4 G/ T5 F( a M" M) e2 H
3 b# W3 R% B: H5 B" X, |; c! n
return (maxsize);
6 U" `; A$ D/ E0 v
}
! L/ r. j6 S2 N
int dram_init(void)
$ A7 i A0 V8 y! ~* e
{
5 c9 D: e# `8 K* @# ~7 Q
/* dram_init must store complete ramsize in gd->ram_size */
* Y( I! f. D& v/ H3 ~9 V
gd->ram_size = get_ram_size(
2 t0 k8 b- a. Q8 Y0 l, ?0 @# H% `
(void *)CONFIG_SYS_SDRAM_BASE,
2 _8 a. k3 {; [ P0 K/ j3 L
CONFIG_MAX_RAM_BANK_SIZE);
5 E& ~, C7 K6 m6 }
return 0;
0 S7 W X# f, `
}
. P8 }' R! k7 ^. i$ {
) M" F+ P5 e# [' B
) g7 B8 w# u1 B+ }* q
. A' e( N% O l4 M, X7 f( }
9 p8 |; |3 z2 |) O7 r r
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* a: p( [3 A* K9 T
6 u7 w' ~5 H, F
0 `( }4 \7 h, }$ i7 }0 ~
+ [9 n2 s: F" C! C( h, `$ T
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4