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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
5 ^6 @+ E: j: R& Y' O& h+ X/ b核心板2:DDR2 256M Byte   NAND FLASH 8G bit: N7 f( f! c6 }& u( O9 I2 E
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?$ W  ], I/ n) s0 Z7 {
1 n: m" y0 ?0 q( v
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?4 @8 ?0 j: x8 C8 \) G% ?

4 \# E% |- {! L7 n, M
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:) t1 G2 z. t0 L- {% k0 f' B  d
/*
$ \1 Q% {1 U5 Y2 b; r/ I* Check memory range for valid RAM. A simple memory test determines4 U+ v9 g/ }+ S9 |9 N6 {* b
* the actually available RAM size between addresses `base' and
" G1 Z( J: d! j/ d6 f: V* `base + maxsize'.3 H! ]/ w* ], n, L# {: V
*/) L5 F1 p) u% u0 p: p& }4 a
long get_ram_size(long *base, long maxsize)
6 B. a# f0 C" e: v{
# ]+ _  Z. g# z- R: w        volatile long *addr;( b: r, h/ y( x: T6 W. p6 Y" ]
        long           save[32];
; h+ e) ^$ j' o  Z; h# N8 r        long           cnt;
* H" j" X- X8 E0 B* D2 f, E% V        long           val;$ v, V8 H2 u/ S
        long           size;6 f! x6 S% b: k1 x2 b5 r2 _
        int            i = 0;
* K7 O/ P4 k! x( H  h  v5 s+ p. e3 m0 K0 @6 i
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {" K9 f1 V' j, n% L/ W5 `1 L
                addr = base + cnt;        /* pointer arith! */" ^% X4 z1 ]' S8 I5 z4 z
                sync ();
9 C% ^# j9 Q0 L" v4 t6 l                save[i++] = *addr;7 I+ @# Q$ _( W- P' {
                sync ();4 z/ w, l9 F* J. d7 g' ?
                *addr = ~cnt;2 b/ {) R$ b4 E) Z/ K1 Y$ D1 U
        }1 j4 m' M1 U0 v9 ?

$ }3 L' b& O6 e! l  W# x        addr = base;
, {1 l$ \! m7 p. _, U        sync ();
! s( g$ K4 t7 i' }1 {  Q$ c8 y        save = *addr;
" C' ?9 ~6 o3 Z/ E        sync ();
  y' l9 J4 H5 s% I9 n9 P4 B4 A) e        *addr = 0;7 f2 c+ y% M& Q5 G) O2 k7 m$ H

7 ]- \) T+ D* a& ^9 d5 u/ d# y        sync ();, V( Q- ?3 }( a. t
        if ((val = *addr) != 0) {' _8 g8 s6 V- w3 Y7 j- m
                /* Restore the original data before leaving the function.
' F: o) C5 l9 X9 S) M                 */
/ B" ~7 Y- N% v, W                sync ();* G! D. F  T- a* a0 Z( F
                *addr = save;+ N4 D( j# H% K  t! u$ c! O/ \5 B6 D5 L
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 m$ G5 l/ |/ d4 ?                        addr  = base + cnt;
) [$ X" K. J* u4 g" _, M6 D( R; [                        sync ();
3 t# p6 m- j# g$ k% R                        *addr = save[--i];  ?5 d6 x  W. J  C9 `" d3 T7 H  ]
                }+ b: q8 }9 r  J' K6 C8 w$ U
                return (0);
- V! `9 y9 Y% j- S8 n0 J        }
# F4 o3 E& Y. b1 W% P" {
4 r- X' z( B, c# A        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  ~2 f/ G% k* z" T% N. y
                addr = base + cnt;        /* pointer arith! */
; O2 }# x+ E7 s" B7 M0 h! ~                val = *addr;
. ~% O( y& W# Q* v                *addr = save[--i];
- C6 _& y5 y7 e                if (val != ~cnt) {; J, z+ K4 s8 O! a" R9 I" ?
                        size = cnt * sizeof (long);" V, ^' {! m. c. a
                        /* Restore the original data before leaving the function.+ y1 p) d- `- v- K' ^- o
                         */+ p1 @9 v2 J- F3 T( ~
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ j, K9 N, Y+ j8 k( G3 u: W( d
                                addr  = base + cnt;! W' I4 g# C& x& }9 f
                                *addr = save[--i];
: x5 |0 H+ r5 F- J6 a$ |# Z/ [1 ]/ B+ r                        }  X& A" r8 Y+ S9 @* Z# g& }
                        return (size);
1 q3 W" I7 D5 m* C" K7 ^7 H( h& [                }; ]- h  v2 v8 m/ X
        }8 {' y, K4 P. `" l* n4 B
: C% r' ~8 w, M5 J
        return (maxsize);' Z% |7 X, l; W+ y) R9 S6 ]# l
}
* C7 G" p3 {$ Q' R: I9 Uint dram_init(void)
& D% |: ~+ p( x5 e8 _* r" @{5 k7 ~- }7 Z# f
        /* dram_init must store complete ramsize in gd->ram_size */
3 ~: \0 W+ ]% S3 p        gd->ram_size = get_ram_size(" i* i! Y- E$ h5 f
                        (void *)CONFIG_SYS_SDRAM_BASE,
+ }9 p$ a  d5 L* ]  H( r                        CONFIG_MAX_RAM_BANK_SIZE);4 V/ L  z* F& K; J' p( s
        return 0;$ D% D, U& E7 `* C
}
0 W6 T2 z; k3 J
: W/ x  U1 x  d: O8 ]
  O# C# F! p6 }3 I7 O- F# N# a4 r! [" S# l+ A' Y
6 {1 i4 X- h& c* c& H
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; e5 N7 E7 o( z( l' P0 i: ~$ _
( ^9 [+ d; A! K2 N! B/ s8 z* W8 O: ?

$ ]5 Y5 m7 m5 d$ k+ H6 b  H
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-3 15:54 , Processed in 0.038330 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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