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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
$ _" t- R. g: _; S核心板2:DDR2 256M Byte   NAND FLASH 8G bit
3 m, d* I* i$ \9 l& z1 M0 h这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?: K+ M: l- R. d/ Y1 H7 z

* N6 _; y2 a+ g: U9 l是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?, ?9 @1 T4 Y9 P2 H8 S. f
1 X2 l  D5 b# r, Q5 s
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:+ Z3 b" c( e2 n
/*! z2 y' P* }  \9 I5 f& Y! N
* Check memory range for valid RAM. A simple memory test determines0 A! O& L5 s) D+ r- p( a
* the actually available RAM size between addresses `base' and
1 M6 c" m4 |8 I1 L* `base + maxsize'.
! v  j# r# r) Y3 ^; f: X*/) |  a$ t0 u8 G$ r% d2 l
long get_ram_size(long *base, long maxsize)
) y* }, B0 P7 I2 ?{
$ U% ~0 ]' I0 w. B) K! a        volatile long *addr;
: d9 j7 W4 _, V3 s* w; R        long           save[32];
& s: v9 E7 a$ S4 s        long           cnt;$ o4 Q2 m3 C- V
        long           val;. E6 R* P+ _1 r
        long           size;( N, I6 W6 u9 P1 y
        int            i = 0;
, }8 Z2 N7 d) l6 q
4 o0 M: P. b% V- ]! e        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {$ O+ B3 u9 x0 [$ t: t
                addr = base + cnt;        /* pointer arith! */- G* S# H$ P: q4 I( o" {
                sync ();
5 ]4 X2 {: t. R6 e                save[i++] = *addr;5 \8 ?8 L2 n% T$ x9 {7 a
                sync ();
  m3 R3 \& N1 ^9 u" \8 K" O                *addr = ~cnt;
: W+ l1 m/ h, p, C2 P/ q        }. ?4 I# S5 Y4 T& s/ s9 {  }8 r$ \
( N; ~9 s3 }- T; \8 |9 b
        addr = base;0 i& |$ h  y/ w- o# C" c8 h. P
        sync ();8 ^; M) F- ~+ M0 U9 t0 n
        save = *addr;
3 X+ [/ O# k1 V3 s        sync ();" f0 `3 p& O  |) c! }
        *addr = 0;* o3 E0 n( q, w  X. j+ _

6 z+ s" [7 K5 f) v/ R        sync ();
* P/ Y) k0 B% B/ q        if ((val = *addr) != 0) {6 I+ F" ~# m" T# @+ x
                /* Restore the original data before leaving the function.
( M' B% I, L+ U+ M' Z" B- b. @- L                 */
. `) C# Y5 @/ s2 b, o% }* e                sync ();! G) {' l  q4 h* d) \, ?, `
                *addr = save;
4 Y/ s  F7 O. _9 w8 E5 N# k! \0 f( u                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {; Z, v- F. \( u4 z( L+ |) e) A
                        addr  = base + cnt;) u3 F* R4 m/ z5 {' t
                        sync ();
; h; |+ i- V# b3 F% f& }                        *addr = save[--i];
4 ]  b( |/ m: ~( S  {: [* G                }+ `2 N* k/ P* Q7 V
                return (0);  B4 C3 p+ D- j- z0 ]# _
        }5 v0 r* k* P8 A, j% s+ L, R0 G
) k1 `+ ^' W! ~- B
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, I8 S2 @5 A" ^- b/ ?                addr = base + cnt;        /* pointer arith! *// f1 M5 L& ~; k3 `# S( c% W/ D2 M
                val = *addr;8 g* e0 `8 p. c: Q
                *addr = save[--i];
4 Y# e. a, c6 d. _+ E. z# v4 m" n                if (val != ~cnt) {
9 |' |6 A  a/ ]; B$ u                        size = cnt * sizeof (long);
/ z% O) w2 u! Z. `                        /* Restore the original data before leaving the function.+ {" q3 ]4 H* v
                         */
# n1 x2 j# `0 W' M6 h                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 y$ n( Q1 G' |' @, \( h* V( |                                addr  = base + cnt;' F9 n3 Q9 c" q5 |* b  ^4 E. m+ r
                                *addr = save[--i];0 V' B, q4 x. M' ]! h9 H, E
                        }
+ b. j+ _' y! T! J! l                        return (size);; l: E* O/ I- P) r9 |# w
                }3 n5 L# r  S8 B0 L* y3 z
        }
9 O1 ~7 F2 Y- K# r# m4 S% e. X4 E; h7 r3 N6 K
        return (maxsize);
& M/ o6 w* _- U" n}
& o9 U6 m7 W" t. G" I% vint dram_init(void)
9 E, k/ }+ k6 V{
; P; l" ~  P+ ]& N9 k6 j8 w, U( f        /* dram_init must store complete ramsize in gd->ram_size */3 ?- }9 x. q; Z7 s1 g) ^' m# o% \% d
        gd->ram_size = get_ram_size(
2 n5 z9 c& U$ z" }% |                        (void *)CONFIG_SYS_SDRAM_BASE,
" V# d" ]( W  w1 h. o                        CONFIG_MAX_RAM_BANK_SIZE);! }: x) }7 u* L8 ]5 `
        return 0;: @; U7 B* Y* \: B# {  U
}
# i# L0 ^7 `6 f- z. C& F- V- \: Z) H. S

8 }. k) J: \3 J; q
0 J6 G: w) f6 X- X6 L. y" Z
( ~5 k" ^8 y# A: l0 F9 I$ j+ qFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!, N- g& N# Z! \- t( J( c: F4 r

/ G1 i7 Q( q% B5 _1 g2 Y* J' {% U1 i) y; y% f' k/ y( A

0 C5 U: A3 d( m2 v5 m1 y$ x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-22 00:01 , Processed in 0.038981 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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