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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
+ x! l" G, \- o8 ?: e/ e! M* Z; f核心板2:DDR2 256M Byte   NAND FLASH 8G bit3 n* n. d# g5 `9 Z2 S
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?" x9 [. s( K) p* N2 {3 U
/ q6 M' T% |, h- R) p2 F7 l; G
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! m3 y/ Y' A+ ]- ^( i
& p! D% r# \/ x: K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( k9 [. m0 J% g" _8 g' A/** q$ e$ n+ R, o* e7 o! U9 G+ H
* Check memory range for valid RAM. A simple memory test determines
- ^' H& ]8 Z9 l* the actually available RAM size between addresses `base' and. n' N& o& {- @5 F
* `base + maxsize'.
- P4 Y8 }- u, B+ T( j3 T*/5 D, C4 i5 X. e( v0 o3 V! [
long get_ram_size(long *base, long maxsize)
. \8 L5 Q- F. c% q; ^. g+ ~; @{6 A" ~7 k5 y$ j; H2 |7 R* e
        volatile long *addr;
, `; y5 ?$ U3 J0 M& o5 K3 }        long           save[32];' y1 z# N, Z% U2 ]1 i3 b
        long           cnt;6 i7 n, p/ x  J& i9 @# G( Q- t1 k
        long           val;* f  H" s! r' r$ [/ L8 i1 p
        long           size;
, g5 R9 F6 ]" y& s5 ^        int            i = 0;
- s; t' k# c5 M9 S9 E  p5 b6 h& g& D6 a3 o- N0 t( b; x; i
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
9 v  f: d( e! P: @                addr = base + cnt;        /* pointer arith! */2 d: Z7 M% s& k) Z: \) i! R
                sync ();
" Q4 g( S4 L. t1 d                save[i++] = *addr;8 s, O: v" m! M
                sync ();
2 h5 {+ A0 Q3 ?$ r) G. F8 m: h                *addr = ~cnt;, g  o" n4 `+ s
        }
( t, F2 \. ^0 A% ~7 l5 D0 n  `5 t, |2 m& H$ X9 N
        addr = base;* T7 y0 c7 W7 W* U; O$ g9 s
        sync ();4 B1 E$ s3 n5 k& C- E
        save = *addr;
8 `7 L/ O7 }* P  U        sync ();# M7 c' S# T/ P7 N* h6 p$ I
        *addr = 0;
1 x: |- J+ ~! a! Y# x% k. l- u; r8 x8 @! b0 Y3 S
        sync ();2 N# W9 V- D3 [. S! J8 E. _- [
        if ((val = *addr) != 0) {3 b# r" l* E, ]/ N9 H
                /* Restore the original data before leaving the function.- h2 n/ f* J1 h1 O! f( j  g+ @
                 */) C9 h) l/ u. P' D. ]
                sync ();5 a0 T1 c2 J) y+ t
                *addr = save;
/ Z7 x' A' _6 }3 [" F9 z4 X                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 h% Y0 Q6 _' ~. J. E% l                        addr  = base + cnt;
0 D% L6 H' n! x& b/ T1 v                        sync ();
4 H0 H) Q: z+ y; n* {$ Z                        *addr = save[--i];
# d6 t# O+ Q' S( D' G                }
6 V8 Z5 j% Z4 Z% k                return (0);
, G8 @4 n7 v0 h$ j0 {; r2 q" s3 }1 M        }
; g# h8 R) m6 M8 E
+ g2 E3 x* w# W) N7 Y( W3 ^        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. B2 V- r+ O' B" o
                addr = base + cnt;        /* pointer arith! */$ w; T% A- H4 N. B2 e# G0 v3 O
                val = *addr;* |: ]8 Y/ w) R* U
                *addr = save[--i];
; I- z! Z! C1 t" g& S                if (val != ~cnt) {
5 e; L  r3 s9 |* S8 l2 \1 y# ?                        size = cnt * sizeof (long);" P4 T; o3 n# n% ]
                        /* Restore the original data before leaving the function.5 D9 \& r/ p% h% Q) r) q
                         */
7 _5 D# H( Y& k/ P                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 Z6 f4 J+ c! w: V0 o( Q/ ?
                                addr  = base + cnt;' }0 H, t1 W1 ~4 ?
                                *addr = save[--i];$ M, x8 p4 \$ m8 o* T- {! O
                        }5 q2 }4 ^, G  S9 q+ [
                        return (size);
* E) w9 C1 t+ O                }1 G2 V2 r$ |6 k; s  A
        }4 Y# L7 u3 b4 h8 T2 p
! w0 A/ C4 {7 c: p$ l0 r
        return (maxsize);
  S0 I& Q' g+ C! K. o}
4 g! S; ~; I, d# j4 rint dram_init(void)' k7 z/ T; C  I& K$ @: B1 @( b; \4 [
{& q4 `, }" ?7 N
        /* dram_init must store complete ramsize in gd->ram_size */, g+ p- x3 M4 j
        gd->ram_size = get_ram_size(7 N' R# R$ V( d: v
                        (void *)CONFIG_SYS_SDRAM_BASE,
1 Q: W+ m! n: d& o8 e. N; F! e+ m# Q                        CONFIG_MAX_RAM_BANK_SIZE);
$ s* t- `" M% Z        return 0;8 i1 I! I2 s8 P
}
* g! R2 X6 S$ ]8 F: \( l) o5 }/ F  E, W" o

% z' u6 M) O; ~" k: T+ g& G$ r7 }0 T& B( f# ~

# N) o4 T; B( {3 f( p1 ~  CFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!( P4 q! ]1 l  v

# M( ?7 v* y6 J, T- b; k
- ^* ^, y/ _! k% G. \
: `; }6 c- H& \0 B. `4 ?1 k
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-16 15:16 , Processed in 0.037485 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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