嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
: j1 m# _! w8 m$ G# W
核心板2:DDR2 256M Byte NAND FLASH 8G bit
6 r+ l: h+ H! d! j, B# L2 F: k: P H# }
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 l9 E9 ~8 O) S# u- F7 p! X: @
+ `" V% I, v5 M: S/ P9 Z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. {* T% I+ ^2 [ {+ H% K( k; j/ Y+ L
4 m" }0 V* Z7 {+ [ }* c
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 a2 F' L/ s$ c+ X$ P* a
/*
8 |$ m" x# t$ b1 b9 t8 [& V
* Check memory range for valid RAM. A simple memory test determines
, V- s2 y# W- g
* the actually available RAM size between addresses `base' and
# I8 s+ d- u/ w0 S) _
* `base + maxsize'.
& C( t. N( U8 d7 {. `% [7 F
*/
3 J$ z* O" M- u9 w* O* B; [
long get_ram_size(long *base, long maxsize)
$ J1 \9 G! c- |1 |$ Y6 V3 Z
{
) q2 C* x4 z! y5 U
volatile long *addr;
3 Z4 }7 E5 \5 f1 H9 n* J
long save[32];
`) _9 s+ a8 l1 @0 [2 ~" Q
long cnt;
9 j) `" W% i3 k' ?9 B% S ]6 f
long val;
% ~" o4 o# Q$ E7 W" u
long size;
% }- N# G" F# I3 O9 y
int i = 0;
+ ]1 q0 U. p* d: D" M
, p2 s" T: `0 I
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" A9 u+ T7 N7 T' r0 ]
addr = base + cnt; /* pointer arith! */
6 i: W0 V" A$ J6 q- k6 F: q
sync ();
2 A9 ~- m8 c: h6 C8 t8 p+ }
save[i++] = *addr;
% m3 k8 }4 s" K. E
sync ();
6 C! w: b- F/ C: X; d2 j2 [
*addr = ~cnt;
, }* ] M0 m! Q' [& K
}
- l; X, ~ m9 U$ O2 b% j
- r# n2 U' A s* ]# M
addr = base;
. u0 q+ y$ ^! [5 Y: P- C
sync ();
4 Z# [' E& c. O8 G9 ?
save
= *addr;
$ d; E+ C& v; M& f
sync ();
0 W% w4 {0 U5 }4 F" H4 _
*addr = 0;
3 N1 R: q1 X. y' ^/ v1 h- \
, X% @7 z' Y5 k# T! A2 _
sync ();
5 m/ }* j% d0 L G6 ]2 G
if ((val = *addr) != 0) {
5 t) `/ J' i" F# d3 N" e5 @+ t. M& O- p
/* Restore the original data before leaving the function.
) Z- @& G3 y& Z; T. R/ ^ K" o$ }
*/
. W- |0 N& Z5 L# ?4 n
sync ();
3 V( D9 E+ y" c: H7 E, E8 |" ^+ Q
*addr = save
;
; e c5 [7 W8 g( p3 j2 @1 \
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, U" y) {# j: y7 D7 z1 m& E
addr = base + cnt;
( _+ h9 Z* K$ n4 Z8 N
sync ();
0 E) a5 V# i; N$ T" Q$ o+ w5 _
*addr = save[--i];
2 E* g [. }) S( A8 W/ m X( v
}
$ F) \' h- q0 n5 L
return (0);
6 C& i1 A: @% V( ~3 w+ L
}
4 i. l( Z1 C% ~( q
' x9 d, B7 l1 ~# t
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 V* ]# @0 e( {9 O
addr = base + cnt; /* pointer arith! */
. f2 G/ q1 Q2 i* J% P! F
val = *addr;
# g8 ~: f$ j6 V8 m; u g \
*addr = save[--i];
- E) J; u' h5 ~/ A) H
if (val != ~cnt) {
S1 R$ z, F3 t* t% ]( {
size = cnt * sizeof (long);
% T# U7 V/ J/ [- s
/* Restore the original data before leaving the function.
# ?+ ]: X: k0 M9 s7 c: k N$ S
*/
- u; S# ^+ O3 J
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( L ]3 F& k8 k5 Y6 ]
addr = base + cnt;
\# U, l {9 k& |
*addr = save[--i];
- H- c: K! g' W" Z( j: A2 P! s
}
$ D1 P/ `$ b# U3 g) u+ b; g
return (size);
8 J. a) g ?- O& |
}
7 f- a' ]. N+ s
}
; _; w9 L7 d: g" O
; J8 M6 x) j* Z" D! @
return (maxsize);
/ S- u& R" F: w2 l) S& c& L+ e
}
q( ?! b$ Q3 y; l6 d8 F g
int dram_init(void)
+ _9 P' i! t% i# I" F. F* e" \+ m
{
r ~, F; {, p/ M
/* dram_init must store complete ramsize in gd->ram_size */
! s# r4 W7 M- q; D
gd->ram_size = get_ram_size(
+ h) |( i: w/ X" [
(void *)CONFIG_SYS_SDRAM_BASE,
0 a8 K U- r3 }# ?0 _# p8 _
CONFIG_MAX_RAM_BANK_SIZE);
( ?8 j# ]/ e8 O: f R
return 0;
! c) P- h) { f% `9 }1 ^7 p8 C
}
# h! u+ v7 U" C. o: R8 H+ `
& I: R: g, N% n' n, d9 a2 S
0 x9 o' J C% p; r0 Y2 Y7 m, g
/ I& N/ K$ b/ N2 Q: h) s
8 C7 l+ Y: {9 U; \, L2 ]
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* M6 l+ \% Z1 K [2 m8 N+ T
" o0 h0 R3 B/ {& ?# C( g- R1 Z
% a8 x) J# p$ ]* H5 \/ d! S( |
6 |2 n- V m" h* ^/ X" [1 W2 h
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4