嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 }* `2 Y( h4 E7 A
核心板2:DDR2 256M Byte NAND FLASH 8G bit
5 U) K. c9 |% B* O. x! ?: _$ [
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. [7 o$ N" j' W) F. t: W/ f
. a. }6 ?) L5 _ t
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( N2 R7 K' R# o6 p! J/ s
" q. G l( l# O @1 u
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ a" }8 Y- r$ @3 P
/*
. J: s$ ]+ B1 s0 r9 k
* Check memory range for valid RAM. A simple memory test determines
4 X) o* U' z7 b6 O
* the actually available RAM size between addresses `base' and
; \! Q* H. {5 ]: q% `
* `base + maxsize'.
t0 h! M1 l* Y; y" v- Q) l
*/
6 x) j( O9 l6 v( I
long get_ram_size(long *base, long maxsize)
/ S3 Y; i5 d. e! f2 B& ^
{
- X8 a0 Z$ Q; p5 ` u9 W* G* h+ f
volatile long *addr;
8 j& b; w& d2 x6 v4 Q) t
long save[32];
, D/ l( E' V; v T
long cnt;
6 U& x( }! n) f/ ^+ V
long val;
/ Y& E9 j: p, j3 P8 Q5 Q1 ~
long size;
/ f# F/ f- Z$ ?5 k4 w: D+ _6 K
int i = 0;
& }" m: _" x7 j2 N5 P# X
. Q) T: \" I$ r9 c' y6 L. I
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 N# q# W) H5 Y6 Z9 v( |$ U3 _
addr = base + cnt; /* pointer arith! */
o `. J2 n" C2 I# l% N( R: A, P
sync ();
* w- [* C/ k5 l4 O& ?) x
save[i++] = *addr;
- X0 v5 q. Z" X* U3 m5 Q- L
sync ();
8 ^3 f% X8 c% `
*addr = ~cnt;
5 L. S: h G) y6 X1 y3 p
}
+ p8 I$ j: U8 L3 b5 f- x3 B* O
5 X$ d8 q3 Q7 T( p
addr = base;
2 L+ J$ e$ ?1 E, a7 |
sync ();
" D8 C& q S# t" h3 P
save
= *addr;
8 i9 V5 D. z. h& j
sync ();
m7 s7 f- ^7 b- x) @7 n
*addr = 0;
8 }; P5 Y4 Q$ n A) n; D. z1 D
2 M7 |- Z6 n) d2 _) {7 {4 D) W0 g
sync ();
* n# @4 c: i( Y4 J' N. E' J
if ((val = *addr) != 0) {
7 B- h$ m& `, ?( }4 o4 l% W9 H5 I
/* Restore the original data before leaving the function.
# a+ E2 i( Q# u
*/
* b$ j- D- U, V+ `/ @& p4 s
sync ();
/ v. \* y1 `& r; G" ^- e
*addr = save
;
* S% P$ U2 ~6 ?; X3 g
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 c3 r# u: h) I- V, q: d+ p5 _
addr = base + cnt;
; a" K h3 i3 s$ h% Z( \) X' S
sync ();
2 M S1 o8 ]% [, u
*addr = save[--i];
9 m% e1 C2 x; H1 y" q
}
" U: Q' T8 @, }2 c. \* Z) }- U
return (0);
! s& `, ~. b; i* O) \
}
( Q( Y% Q% A) I: Q7 {6 A
8 \( S7 n/ E$ k: z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& Y+ s4 V) J. e
addr = base + cnt; /* pointer arith! */
6 D! F+ {8 h G3 F
val = *addr;
0 Z3 Q$ k5 \8 T5 p: o4 e
*addr = save[--i];
3 J) Y- a5 ~: X0 p$ f; A
if (val != ~cnt) {
1 p/ s9 ?0 L; p
size = cnt * sizeof (long);
" F' e; Y7 j0 i1 ^4 v# m# J
/* Restore the original data before leaving the function.
( f& Z e( S% R" a# V8 r
*/
6 W; i5 x3 u9 ]
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! { F3 O/ M& H8 T. n# [# C# V: J
addr = base + cnt;
% ?. K% {1 d! w8 m# M
*addr = save[--i];
2 {% F+ N* B' V* g7 y
}
# @9 D! h6 L9 ~4 l: z- S
return (size);
4 r, \; c1 D0 b* r; |- g' I; g" z
}
{8 \% A2 y2 K' ^0 J( R) {
}
" \; S8 ]+ y& q2 u `5 _
_3 P- a" J1 a/ s: W4 s) b
return (maxsize);
- ?* J8 o5 u7 ]; m: v
}
# o- ?$ }1 G8 [ A* k) L
int dram_init(void)
% g0 @! ]8 b9 m" G
{
* y# b5 X- i: A
/* dram_init must store complete ramsize in gd->ram_size */
3 K A4 I) c* `1 F0 |" ], ?+ q
gd->ram_size = get_ram_size(
8 ?' G7 ]0 W/ F6 C+ u6 w9 V" H
(void *)CONFIG_SYS_SDRAM_BASE,
; o( M8 r4 }: q x
CONFIG_MAX_RAM_BANK_SIZE);
$ b* U. i$ ]. I. F3 t. Y0 u
return 0;
: d& _+ h& F0 X0 c E# d
}
3 f$ A* F3 i/ [* f& b4 A+ |
: I3 J+ t$ O* a
8 d7 N$ ^4 @+ S3 a) n
; s* U; h1 j4 t% F; u
. N* u+ J5 ?) I; n% V
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 ?/ ~, U9 ?8 Q2 e* `: y" l
t0 `8 G/ k9 ?. {9 G
5 T; H# y: V( ^+ W ]
+ ~, ]5 S& Z' O/ U
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4