嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
" ~/ K# r6 f8 [0 d" E' Y
核心板2:DDR2 256M Byte NAND FLASH 8G bit
( r$ ~% Y* x8 Z3 w6 D1 G- F
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
! _( i9 N# G; y' f9 [6 b6 i- D
, H0 M* D4 ]5 o) k* V8 N7 |2 Z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
4 t; s+ w4 m$ O6 j! X
5 J# c6 L( I% H! S B f
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ F2 D5 r0 S! C! t, v
/*
$ q+ F- ?( o3 e9 X
* Check memory range for valid RAM. A simple memory test determines
% m! E7 o1 P. j _
* the actually available RAM size between addresses `base' and
& n- N( X) M! m6 N/ }
* `base + maxsize'.
( |: ^3 p/ V$ b& Z9 D
*/
6 H6 q, p; `: Z- ]& X+ |: \( h
long get_ram_size(long *base, long maxsize)
6 k( m" I8 @+ v" W! m
{
) A9 [. B: N4 |; J
volatile long *addr;
5 d9 n) E( ^- x4 W: u Q4 T
long save[32];
3 h; _3 ?4 [" { t$ E
long cnt;
8 x; _7 T# b- G
long val;
: T+ t w; |" N
long size;
) W/ U8 o; e: W' \' B
int i = 0;
4 f' h% s+ J0 {$ G; Z6 \# x
" q8 l N0 a: W2 B
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
9 T' \+ M7 _' v# D/ {1 F, H
addr = base + cnt; /* pointer arith! */
: y) D8 M3 y6 `, i# [$ x! `* ~; z
sync ();
% r1 c; F- C# F. p) c
save[i++] = *addr;
. v) W7 t' x$ S6 ^+ n. s
sync ();
8 E! D/ k2 l- s
*addr = ~cnt;
: H& O; b) S, a A! o
}
7 T P& \. Y6 b+ T1 o* _6 @
v! X7 A, o4 K$ E9 q1 |$ I
addr = base;
7 ?% m4 `' F" `2 U s# C
sync ();
! F" k- g) w S% D: f
save
= *addr;
" i9 q- X1 M7 J$ A
sync ();
* H: i) }0 N0 ~$ f7 G) v1 M$ h
*addr = 0;
" g! k' E6 X% `& E0 u& Z- f! j
5 m. o( ~: `3 J; d( @; D. t
sync ();
# K0 o( ]5 E* I V: }
if ((val = *addr) != 0) {
) ?! @! \. \- v, ~2 q" W! |
/* Restore the original data before leaving the function.
$ [# X" ] a5 _ P' v5 E- T0 c
*/
# i4 T" |* L! D) z8 `
sync ();
! S7 W+ n) v- K) u
*addr = save
;
8 B O- w0 K; E# k7 F
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
" ]; ~. H* |7 {' D7 a
addr = base + cnt;
8 m- N8 [' C& x7 T D
sync ();
0 d* u: C' G( O0 Q- V, a$ B. |
*addr = save[--i];
6 ]% w q& l6 T0 d; j
}
* w y+ f" x# x$ c* b% [9 _
return (0);
( T/ p9 K$ {" h( F2 Q; _% h; u
}
+ _! y) R* `2 @9 H1 D+ \4 c8 q% L
& C9 y( ]* ^: y1 r
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ o4 G9 ?1 F1 Y" ^% [
addr = base + cnt; /* pointer arith! */
3 c( |' Z2 i7 W" R) \' E9 S
val = *addr;
" \* Y @2 a" W, H7 S8 D0 t. z
*addr = save[--i];
3 j, i( v' l }/ K9 d1 d
if (val != ~cnt) {
8 P- W+ U4 |6 Q2 a! X; D8 E/ `* Y' H" A
size = cnt * sizeof (long);
1 l9 s- S! G. t1 d, t* F1 ~
/* Restore the original data before leaving the function.
: T* s$ C$ a% |; y" ^+ ?: L* O0 _
*/
) O7 s$ w! B# O' t6 p! a
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 O* r P: [8 k, `* q
addr = base + cnt;
3 b" @+ L' z; L2 z) I( L1 e9 N# ~& w
*addr = save[--i];
# T" i# {. W. j% K: J3 ~
}
0 n) o- Y0 W9 l# d! E
return (size);
" N, C7 m, c7 N$ m& |- K
}
% g+ a0 n1 F9 c8 j2 T& W* b% l; e* L
}
+ R9 }9 b5 j! O c( Y8 ^9 I
7 o; Q, P! Y, f" c: v6 F. o
return (maxsize);
2 N2 p: b4 k! V; F8 D( I
}
! u4 j8 B3 U$ q
int dram_init(void)
0 \! q( Q- F1 t1 |- q0 H
{
. _5 N$ [) Z' M5 G# H5 E
/* dram_init must store complete ramsize in gd->ram_size */
& `: o% B) B/ m3 u6 n
gd->ram_size = get_ram_size(
4 R& }. [- B8 M( ^
(void *)CONFIG_SYS_SDRAM_BASE,
" F u$ B* h6 A+ k6 x5 U/ u
CONFIG_MAX_RAM_BANK_SIZE);
8 S1 k& J6 u1 p
return 0;
+ \" q$ K+ j2 H E
}
* S. c1 e6 S4 T0 ~$ f& U
. I+ I: s9 \3 q& |+ m! L! h
k/ y, p' Z) N' L' x1 {
3 L; y$ }" n. R$ a: h4 M; ~
/ Q8 u4 M- [3 {
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, h- ?: Z2 D2 f+ f ~3 v: z
5 S, \! x0 [7 }" _! J+ x7 N, M
& A* I5 M$ @' W/ U& b3 k1 C
$ ^4 Z! `% R* c
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4