嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
, k$ D+ { _5 x+ y) c
核心板2:DDR2 256M Byte NAND FLASH 8G bit
( d. s3 r9 e& o
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* N: L8 w. R/ o: m
# S- N" D; S2 `* d/ W, ?
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; F' q( p- d6 R5 Q+ p% v% h
1 D) d0 y! w/ Z1 V( g O
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) R! G; `, F3 {' X( M
/*
' p' Q/ W2 X& T
* Check memory range for valid RAM. A simple memory test determines
# G' Y ]( B7 T% K) d
* the actually available RAM size between addresses `base' and
4 S, G& a, E. R$ Y) [) C( ^
* `base + maxsize'.
3 p' |3 B4 o# Y% b! {! R3 D
*/
: x% Y( ~6 R4 S% A* [, k5 ^0 P' X
long get_ram_size(long *base, long maxsize)
1 s0 ]- l3 u" Z
{
K; a# ]5 i5 \" h
volatile long *addr;
4 t0 G" m0 Q4 A$ `
long save[32];
/ g' j ^8 q0 a+ \/ A" }6 O8 b7 h
long cnt;
+ p9 o! S- I. H9 x9 n+ o
long val;
- ]/ @ e/ w, [* ]
long size;
6 w, n5 j* P# n4 C
int i = 0;
8 x& M1 ~$ Y" _% Y P# `
8 E, m5 M) l5 h, V
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 i; z7 U; r: R1 ], P
addr = base + cnt; /* pointer arith! */
/ J/ P; e! z# W+ q) |, a
sync ();
! ]$ ^) {. `# P' }0 e2 M# X! o" n
save[i++] = *addr;
0 q' B! f n; ~2 J% J
sync ();
/ o0 I0 q7 a% A3 s
*addr = ~cnt;
" \" F7 i' `9 ~4 l1 Z9 T
}
' E8 y) d9 @) {. _6 T" G' R8 D; x
3 A) l: \/ G, v" ?" P
addr = base;
5 C5 G d- h/ X9 {( m- G7 C0 t" ~
sync ();
( d. m; h) |: j3 f5 e0 C% A
save
= *addr;
, ]5 r. y5 a8 y/ D! t9 M
sync ();
$ T. i% O: o7 y0 L# l. j
*addr = 0;
; a! l# ^! t3 X4 F
4 p: W( m9 T0 Y) H6 A! `" [! [
sync ();
7 w' I6 H; d$ T. h7 O4 ]
if ((val = *addr) != 0) {
! f$ z4 V6 h% n# y: w$ `( }$ Y
/* Restore the original data before leaving the function.
2 X3 Y; Q5 R, h
*/
2 o. |5 {# [& w6 P( @0 Q
sync ();
/ v! |/ H" y1 |* O' m/ [ ~# D, `6 L
*addr = save
;
( e' D) r! O. Z+ H
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ m1 L0 L" X8 f9 u' N. t1 f
addr = base + cnt;
0 n2 C- ^% t( w8 i2 g
sync ();
/ Y" P4 h1 e$ {% v
*addr = save[--i];
) _$ Z' r# Y( u8 T
}
: D3 [+ g$ @* g; W9 }
return (0);
" q+ c) s' n( t9 _9 o% k3 u/ e7 r
}
7 r s3 c4 M& z; ?
- w9 _0 O+ ]% f2 R5 p' V0 j7 Q
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 I# Z7 ^5 k" ^; j+ R- u
addr = base + cnt; /* pointer arith! */
7 ~5 I7 K$ P& t9 {3 k$ }% ?; P
val = *addr;
/ K+ j+ g: z# O T4 d, v: o5 _
*addr = save[--i];
' i h" q4 A6 q
if (val != ~cnt) {
( |# F* u4 e! Y9 K3 k8 o4 b& z
size = cnt * sizeof (long);
3 i* [2 f7 {; L. H& L& V! q, F) ~
/* Restore the original data before leaving the function.
' [9 t3 l8 S2 S1 m" E( ^
*/
; W( J3 R# R4 M/ o; I
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 k* t* t! Z( X* S1 b3 k0 o8 ?
addr = base + cnt;
3 x; B$ f1 U4 }$ R4 K9 M5 q2 Z
*addr = save[--i];
& q! I* L- i7 F
}
8 _4 _3 R, R, v) E/ Y2 a: W7 x- N
return (size);
" d$ O( W! g6 @. D" q- k9 `
}
4 g! K% j0 `( J/ |( T+ C0 p
}
; C5 b- h$ I5 K3 c0 g' F3 I. h
n& A# f" a! h; a2 O' \4 y v+ F! m
return (maxsize);
3 |5 u: Q3 I( \4 g: w- C4 D
}
$ x& k3 {) o( x
int dram_init(void)
1 ]. p+ }2 S( {; p! j
{
3 s% e+ H: T2 g% Z+ ~
/* dram_init must store complete ramsize in gd->ram_size */
( J0 T0 P) ]$ {) s
gd->ram_size = get_ram_size(
( X7 ]* \$ \8 v. {5 W
(void *)CONFIG_SYS_SDRAM_BASE,
# `# o! N: Z+ T, F( e0 W
CONFIG_MAX_RAM_BANK_SIZE);
% U! J. U* j) x; r. F
return 0;
5 R# i' u \0 E/ O* I
}
1 J/ ^/ j2 t. ]: p3 H& w0 R/ ^
' ^( ]+ \" Z2 k* E1 I: [/ i2 ?
/ B1 T5 ^! b% ?/ s; d* R
7 o: i$ p% N( g7 h
2 U7 Z* p: t+ D% P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- j$ w9 b: z ~1 O7 }) c6 l
# r4 N, C( f1 m5 G4 @
- ^) W4 V. d) E
0 M- z* ]' t( A* U
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4