嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
" f) `3 R& \, X
核心板2:DDR2 256M Byte NAND FLASH 8G bit
$ u$ |3 i& Q$ G5 o
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
9 `7 P$ a8 F& H5 s# y+ @
: o8 Z1 e/ Z+ z) F4 `
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 X% a6 x0 P& w/ v- y9 H
3 i- B* Q+ V" B& D: R' |+ K3 H
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 g* W+ f5 g1 y( F% n; ]( U
/*
: m) m" _! s. a
* Check memory range for valid RAM. A simple memory test determines
9 ?1 z6 U5 p, A) B5 x' a, M7 U4 u
* the actually available RAM size between addresses `base' and
. d; F% ^& V3 K- w
* `base + maxsize'.
9 m% L4 v! ~: s, M2 j
*/
S8 o6 `. A- e- J, x" K# [
long get_ram_size(long *base, long maxsize)
# r- n+ R3 k4 H
{
4 u1 u! Q2 m, l
volatile long *addr;
! m5 v- q" }0 H4 q% h3 [
long save[32];
5 R7 K) ]! E( E2 c4 M4 e t; U
long cnt;
; P" }7 V' U6 T6 x, |( G
long val;
/ T i% e" J4 S f' ]. m9 Q( a
long size;
* P* {) c+ B+ s9 d# c' {3 S2 P( `
int i = 0;
7 |$ @- ~& ]$ Q$ Q
* n6 G/ Y8 A5 p# z( ?. U
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" {' } V/ H1 n, u8 ]
addr = base + cnt; /* pointer arith! */
% w1 x x% C7 F: l
sync ();
8 ~, S0 F A7 i$ Y# [9 |+ ~0 _
save[i++] = *addr;
) K% h2 `( Y( W" n+ ^
sync ();
2 w, f/ O2 j4 Q" _+ U; o# g
*addr = ~cnt;
' J! j: T- @ V! @7 ]4 K4 e
}
& w6 z) t4 ]% j1 L9 l5 i) |% g/ V
) ^$ R, v* i7 J
addr = base;
! H) A1 i$ r9 u! E; n
sync ();
2 l6 `9 y0 K, D& [; \8 g N
save
= *addr;
; A- Z! N# g* E- D7 g- Q7 u
sync ();
* {2 Z" O3 |8 x4 O2 k# _; D3 F
*addr = 0;
8 F+ h/ J- W5 I- m
' @5 S- S5 i! H* E0 t1 R
sync ();
# K: W4 P* \4 J* Y0 P
if ((val = *addr) != 0) {
2 m. |/ x: ~1 j4 ~3 a
/* Restore the original data before leaving the function.
/ G' S8 x6 c2 Y1 n$ C/ o- i
*/
/ `' i$ _9 S* m0 X2 z' @- b; |
sync ();
$ |% Z( V& E. Q* N: i" Z. Y/ N
*addr = save
;
% @8 u' F3 ]* t2 X" |5 u* h
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 O0 V$ F7 F: |5 F; C
addr = base + cnt;
6 t9 n2 X$ `, j( a! o6 l4 l& G
sync ();
" ~& a f' V* t9 f6 O/ P6 A# h; `
*addr = save[--i];
; S$ g% ]! c, j0 ^- M3 |" w
}
! n3 e7 U- m* c2 a( o$ {
return (0);
: n. C4 c" P7 X3 S& }
}
* W# ~- @# p# P2 C4 p- Z; |
! Z/ ?3 N2 a' f; M2 f. Y
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* g [7 l3 `* \" x! X
addr = base + cnt; /* pointer arith! */
8 ]: I4 E0 l8 ]; Z5 C# I0 L
val = *addr;
c$ q5 b* K; e8 y% ]5 k
*addr = save[--i];
2 {1 k3 |& ?/ U" N' I
if (val != ~cnt) {
W: K2 g( V8 |4 k/ v$ ]2 j9 ^
size = cnt * sizeof (long);
! H# B, Q* T. G) y
/* Restore the original data before leaving the function.
5 Z! \ C/ L/ M
*/
, E' M } P) _* z5 G# e" _: W
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, \- g; `9 {: g+ y/ I" X# i- ]. |
addr = base + cnt;
: v; U* y; @3 z5 s" a: o2 K4 W
*addr = save[--i];
$ J$ r; U4 n% K0 u0 L0 |6 S+ ~
}
+ \0 N2 C3 _$ L9 ?5 o, f+ {
return (size);
7 H0 D& ^' U) w4 u% j9 z
}
6 V' w7 R- `- x: [% L, C9 a
}
% b2 m0 k, P6 \* i% O' Z4 D
, ]9 H! J ~' u8 i8 ^8 N
return (maxsize);
. M5 J/ R/ c# q3 O
}
& P! r: ?) C4 @. {% {. x% H
int dram_init(void)
0 U& F% T& a) q( L, m# ]
{
8 X9 s7 m6 e' O0 D$ D9 f" z* Z
/* dram_init must store complete ramsize in gd->ram_size */
- v S4 i _ B: A y0 v- Z
gd->ram_size = get_ram_size(
?/ t1 e4 }8 T7 A8 j
(void *)CONFIG_SYS_SDRAM_BASE,
3 h; C: i) K8 V$ y' W9 Z
CONFIG_MAX_RAM_BANK_SIZE);
7 m* u# ?3 C# h% ^
return 0;
; a$ q4 `. i6 ~/ N% w7 Q7 ?# l* R
}
5 `' B# D+ h2 Z( {1 Z! y: T4 P
, _6 v! m* i1 B
4 v8 _1 Q2 r( X8 S! A5 s8 e
7 G `* i! z5 |1 w
# v% ~/ j7 A/ U) u1 [5 u* a
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# t, X8 D& ?: x* v
2 g) J" j2 a! l# a
2 k) r0 o U: T# h
4 P7 {* N$ V- O' w4 ~
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4