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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
8 G3 X2 Y% _# ]. }  Z3 x( B/ w+ _核心板2:DDR2 256M Byte   NAND FLASH 8G bit
/ i$ V" y/ M. Q: J5 E这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
  Z8 I9 H3 V8 n7 O2 s: n+ N# _% Z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
- W; Y+ d% h' y# ?# m) J
# ^) Z  h- i: J8 m/ N. N" j6 z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& L2 \2 a' v1 Q0 s; W' H. P+ L1 G: |/*! k; N9 w, O9 w
* Check memory range for valid RAM. A simple memory test determines1 R/ p0 s0 ^) @6 U) J
* the actually available RAM size between addresses `base' and
2 R: i, P/ c& m! d* `base + maxsize'.8 O1 U" X" G3 z- J6 v
*/' {* b' C. i5 J
long get_ram_size(long *base, long maxsize)
( g! T+ O- K# e- L% N) g# v{
; j2 g# \8 T4 G  w$ W        volatile long *addr;' X- c- U; \+ }
        long           save[32];8 a; K6 c/ L& j$ h+ ]( a
        long           cnt;* J  C4 q, }, o/ u, H( `
        long           val;5 L- f1 c5 q4 }; a
        long           size;
4 I% \7 W0 v; d) |. M+ \& J1 @7 S        int            i = 0;
2 g! n/ d: J9 M# ^
( O$ \: b, o9 L6 ?" h1 A5 M        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
  G0 q0 K$ y. F1 U                addr = base + cnt;        /* pointer arith! */
7 {0 G1 b& C& _( |, M                sync ();
2 A% C% U4 H- a0 ]# l8 f  b# M, F# j                save[i++] = *addr;
) ~1 }- o; y8 b% x                sync ();
( b; p6 h  D" m; s* c/ M                *addr = ~cnt;
/ w- b0 _. w7 i$ D8 h% V        }* n; v  l* m1 q7 C. R: ^5 F

  o6 e9 g9 c2 ~% g, R        addr = base;, t7 u' N, _' [5 s# i4 B7 r
        sync ();3 E8 Y# F* v4 O
        save = *addr;1 a1 m5 u3 q7 s4 a) c4 g
        sync ();6 ~& I$ t" X* F7 O/ u8 _! P
        *addr = 0;3 I0 W) Z$ W& f9 |8 h& m9 {

7 |; `9 ^" X* U7 e        sync ();( F2 r4 g; t% b( l+ {, J
        if ((val = *addr) != 0) {
! t: N6 [  ^, C                /* Restore the original data before leaving the function.2 z7 @) {8 w1 _/ k
                 */+ R6 [" Y8 K# e+ G4 P5 T
                sync ();& U' N2 M! N1 @- r5 _
                *addr = save;: Y/ R# E1 i" v# {- s2 A
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {2 j! q2 S: P4 [/ `8 d% k
                        addr  = base + cnt;7 c+ \: }0 |6 s8 ?8 O* y: u
                        sync ();( l3 A8 p- i$ k
                        *addr = save[--i];6 z4 R- r9 \4 @( {6 F4 a* h
                }1 A* q9 g) F$ K! P
                return (0);
; Q+ ~9 E( U+ F8 q& o% T* T2 y        }& L4 m; i( m  m$ K; P+ M

! ]8 d# q. X+ q! a: N8 C& w- G        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  C3 P; N+ }  N- i6 p6 ~6 U
                addr = base + cnt;        /* pointer arith! */4 F7 S. |! [4 p  C
                val = *addr;1 I2 H1 y( c% q2 R
                *addr = save[--i];2 R: k2 q6 t2 C  y
                if (val != ~cnt) {
* n7 m3 l: Z. c9 y; s, ~& j                        size = cnt * sizeof (long);& J1 N, P6 Q# f
                        /* Restore the original data before leaving the function.0 f% V6 c8 ]7 @9 N
                         */
5 g- `$ b+ {; F& q6 r: m                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ c3 T8 m( A" q. b: a                                addr  = base + cnt;
$ _! F% g! R8 s+ w                                *addr = save[--i];) P7 H+ f, a* h( D3 J
                        }
) Z8 h7 v4 A+ ~+ c. M8 ~                        return (size);
; Z. P7 P  w5 p( w. e" D; R                }
4 v% q0 l  x: s* a7 F  U& `        }
5 n2 K5 G* n) q6 a0 D& x/ O, I
6 d: ~2 B8 j0 A# e0 U* }        return (maxsize);
+ ~8 x: e6 c" H7 n6 v}
  v- O4 ~, N6 pint dram_init(void)
  w1 X7 }9 O/ C, d' k{  y! y. J0 N" v6 s
        /* dram_init must store complete ramsize in gd->ram_size */! Z( A* o/ t: D4 p
        gd->ram_size = get_ram_size(" _6 v" X# P! {' b+ l
                        (void *)CONFIG_SYS_SDRAM_BASE,$ j5 j) z& M( x) @+ d
                        CONFIG_MAX_RAM_BANK_SIZE);
* V) U6 I8 E9 D        return 0;9 W$ v0 ^% @) D* i
}
! \' p  h0 k  Z5 t9 {& o: p! x6 p4 X6 C7 @  q* d
  A6 f' ]5 m. s: m9 W/ t
, u9 F( s* k8 J' F

. P" o7 T, B5 U7 l# sFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!8 G+ K+ L8 `5 r' h9 d

+ q) c8 w3 {3 ~& N3 R3 c' c8 \
. l3 n9 o9 i: c& _, C3 G
4 x9 @' |! O* `& M0 n. ^
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-3 10:01 , Processed in 0.041808 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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