TL138 uboot是怎么区分配置两款核心板的 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5755|回复: 1
打印 上一主题 下一主题

TL138 uboot是怎么区分配置两款核心板的

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit- E1 J% N/ [7 p% Z. U! ?
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
* u4 V0 G- Q4 x% ?9 z3 x; P这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?  `% k8 D3 g6 M1 O; O0 S
- a$ ~' {, Y& A1 k5 c
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?, ~4 K% ?7 {1 m: D! |$ q8 H& v+ q$ I9 @
% |2 J3 |7 h0 \! {8 D% m8 W; r% W2 j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:* d# |2 l, |. n0 {/ M) @! P( s- ~
/*3 p* i. Q% I6 W( |  ~: D) ^
* Check memory range for valid RAM. A simple memory test determines
9 e4 k; o/ F: U$ X+ x- J! f* the actually available RAM size between addresses `base' and
+ `! D" h& }, S3 k+ I7 G* `base + maxsize'., k" I: D1 f2 Q: K: j) ?
*/
/ r; U7 H. V9 A" {8 }8 }7 E0 a% nlong get_ram_size(long *base, long maxsize)
2 E( V7 W6 s. ^+ C0 B: x+ c1 ~{
% E. Z0 o+ J) U: T* N8 _' _% J        volatile long *addr;; K5 A0 L3 b" C# V8 @# y" i
        long           save[32];
- g  x3 \$ e  ?/ O8 k4 Q1 U        long           cnt;+ }2 a5 c7 z& P1 V" w' Q
        long           val;1 \% u5 j" j; M& D- B- ~+ r
        long           size;
; G0 n. U# ?0 S1 i        int            i = 0;0 A' K/ }. ~( c
- z( t! z: ~7 A: ^: L  b; X& q
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& l  @5 q! q$ G) q( z$ p                addr = base + cnt;        /* pointer arith! */0 b; {9 G! K8 R8 O# L7 g- V
                sync ();
  B3 t8 C. ]2 i; J5 o                save[i++] = *addr;
. Z1 L! ]( t' P3 S  f, Z                sync ();# J  ], b& [% f6 t- D. g1 y
                *addr = ~cnt;  D+ u  x2 ^; [/ H: }, s
        }
* Q- _: P* N2 k. U4 {7 |
3 X- O) U7 i7 g8 N2 W" m        addr = base;
9 x8 p. A* d; w; H! E8 u        sync ();. h" k# q$ u! \4 Z$ k
        save = *addr;: S9 {* z. S7 P( c2 {5 B8 e; }
        sync ();
- Q/ S2 [( a( @% s        *addr = 0;
  g2 I# ^$ ~  E" G. N* N
% G" c& A  g3 e: j- u% F* ]        sync ();+ L2 n! F" U* O& L" p6 A
        if ((val = *addr) != 0) {
& V- J: z$ l. n; [! Z' u% z6 M5 O                /* Restore the original data before leaving the function.8 G5 i6 z0 r6 h/ g. ~0 `
                 */
4 O. ], X! F; ]% I3 x) G1 v6 u                sync ();
. [9 n' I: K8 U0 k- T' ]                *addr = save;
( ~* f3 q. q" g2 D$ B9 ^' r- [. W2 y, g                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 E, g- L9 n# B; i& Q9 R                        addr  = base + cnt;& ^; Z4 L6 ~2 O$ u
                        sync ();0 a. S' m9 ^; }0 r# c* w
                        *addr = save[--i];& i' }$ [" F* I- ?, V
                }
/ w' g/ i# z) @5 k9 @                return (0);
! [4 [6 b1 x$ \+ z9 w3 d' s        }1 _; f' c6 E0 \& }/ ]- }, I7 i; f
7 z$ g- A2 Y2 j) G  w; B# w
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 u' r9 Y! L/ y$ t# J9 v8 M
                addr = base + cnt;        /* pointer arith! */$ s7 u& ~$ D5 \& R' H, s5 f, A
                val = *addr;  `4 w! `3 y& a9 j' R5 w5 A
                *addr = save[--i];
3 \, S$ T/ t( f6 R- _4 L                if (val != ~cnt) {
, e8 p" u% S) \7 P, k                        size = cnt * sizeof (long);. q/ ~) U/ I" C) n
                        /* Restore the original data before leaving the function.* S, z$ ]/ R0 |
                         */- w# e$ I6 J6 y2 J2 }2 F
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- B' w6 c- J7 M/ q! N* j                                addr  = base + cnt;) f3 N1 E* D1 I) M1 h3 ^
                                *addr = save[--i];% P. h6 q# Z# J0 ?3 D7 r$ k* ?
                        }' d: m5 {* `8 h. A4 |
                        return (size);0 f# G8 {( y# Z& Y
                }
, _& K! d( f8 h% A  X" W        }
: n/ x- z; M4 n/ h
5 B0 j5 t) P! ]* I$ j        return (maxsize);
( J( w3 v, g1 |! [}- r4 H4 f' k) F, A2 w$ ?
int dram_init(void)
* ]- ~' Y% r% K* c1 t+ k{2 s3 z) |. y( s8 h: {( W* g4 r8 q3 q
        /* dram_init must store complete ramsize in gd->ram_size */0 _, a5 r$ o2 W. p' \6 ]3 b7 D
        gd->ram_size = get_ram_size(5 Q! ^4 U) [9 |% y' t; e
                        (void *)CONFIG_SYS_SDRAM_BASE,
* H# {% E3 ?1 n) r8 z, z                        CONFIG_MAX_RAM_BANK_SIZE);
" A! Q) k' ^8 S& D2 k, y9 g+ c        return 0;+ c! C# Y1 x7 B$ c4 b- E# q
}
1 G+ D1 a6 ?4 X4 L( t) I; b
+ f  K. c: w# G1 q, F, v8 |8 e! I* Q8 ^
+ H$ p% M: T1 ], I
; _; ]* q) `2 t$ W" o0 O- ^
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!' l9 |$ z- z) H! T; T
1 w+ s  Q9 `# t- ^6 x9 s

1 I7 x; Q* y! C% Z

5 Z* ~4 Y; C9 ?& Y* K3 R
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-4-6 20:18 , Processed in 0.060083 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表