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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit) q: _$ T! x: t  I7 y
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
2 Y  A8 ]; z. k9 C' Q这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
# M8 z# C7 d. M, _! @) z+ N2 I  q
, r9 N/ Q, n% d  H' X& ?7 n+ x是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
5 v) \- F" u& w& d# Y3 L
( j) i5 E- W* F9 j6 n" ?. S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:1 \0 b; n) i1 ^- y. D; y
/*
6 g0 |5 H! _0 K7 C* Check memory range for valid RAM. A simple memory test determines# \% \) S; o, h
* the actually available RAM size between addresses `base' and
4 N- m8 [1 |2 F' `, u* `base + maxsize'.
* K7 f8 b, V7 Z# w& E*/
& k7 G$ L2 M1 x# v4 j7 U# hlong get_ram_size(long *base, long maxsize)" h1 Y; s, Z1 ~7 k
{
5 i. K0 `3 _- n; d& U3 J        volatile long *addr;7 O" k8 I7 w0 }4 ?: d. T( i) Z6 v
        long           save[32];
3 ]" V7 ]7 W0 s" h' _2 V( t3 C        long           cnt;! t  L! t% ~% ^$ `
        long           val;' L4 _7 `$ b& L( d$ A% H
        long           size;
: H5 S! |! f4 A) w0 ?, U1 a        int            i = 0;
3 `( X; T1 g3 Q" e; p  u' C+ F9 Q
- |1 N$ f/ r/ x5 Z. ]        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" ?. l) z5 f" {  C                addr = base + cnt;        /* pointer arith! */3 M0 U' j4 E$ ?) x8 s+ b+ r
                sync ();$ V$ Z5 k" l2 Z6 m' r( k2 G- l
                save[i++] = *addr;0 k8 A" h& ]9 ^+ S/ h1 n
                sync ();  U  A$ N+ d7 h) ?0 R6 k% V6 v
                *addr = ~cnt;- x% Z4 S3 {1 P2 G( n5 p
        }0 K) O, o% E: d! ]: k8 C+ A

) I( b* V, F' |  U+ y4 A5 n4 l        addr = base;
7 o% ~4 l* ^* e: _8 w: P        sync ();9 p. H, F7 d' u
        save = *addr;  ^. _, i' V4 v* z# _/ }: g7 V
        sync ();
9 F) M6 `+ z) X5 ]- o/ F8 ^        *addr = 0;
) I3 h+ E" ?6 y
$ T1 _( e) G  ?        sync ();% c8 N: Z) S. _$ s1 R% @
        if ((val = *addr) != 0) {" H& \" F5 C& p' J5 W9 Q
                /* Restore the original data before leaving the function.! @/ w: J% d; x/ L! E/ |4 R
                 */) e1 h/ \: G) e5 b9 C
                sync ();
. |7 g! l2 {/ s% l* ]8 E+ Y                *addr = save;* B4 n# |4 X+ j8 D. _
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
9 Q0 N& a* S+ T' `  c& r! g& a                        addr  = base + cnt;, l; i9 d3 V- Q; Q0 Z, J1 u
                        sync ();7 S) x' ^! M( F2 _. m- u5 v( D+ ?* @) t
                        *addr = save[--i];
+ K/ ^. x" o8 `- }. ~- S6 o                }
/ j+ [8 a' r* M  E) v2 p6 W( d                return (0);' l$ m. f( C: |* o! n# a
        }
4 ~% R1 B" u6 F% e3 z6 R8 k6 P3 w$ X* }2 ~- {
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 v. V' G  e5 G( D; H' v
                addr = base + cnt;        /* pointer arith! */3 T1 V2 g, g7 ^5 {
                val = *addr;
5 q) n3 j5 i6 o7 t3 Y8 E% Q                *addr = save[--i];0 p, {  N/ @( l: ^
                if (val != ~cnt) {
8 \6 q/ D% ~# }+ X' p% R# w  c1 B                        size = cnt * sizeof (long);
  d. i2 |' O4 x- z8 F$ e                        /* Restore the original data before leaving the function.
% K/ T1 }# k0 ]- j7 ?8 j% K6 S                         */- K/ J1 |6 J% Z6 K0 F. N
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ @- q/ K8 r8 {
                                addr  = base + cnt;
: N; w) K, C& M1 r; l6 g                                *addr = save[--i];
) K0 b, E" \7 A( z8 i* [& {                        }. ^- d6 b. `! H; _
                        return (size);
3 Z$ {7 n" J; l6 U                }
! f3 c# y, j* t( f: M        }
* T+ o$ P- [* i9 G$ o4 ?. X: A/ {% X2 |! }- p3 d% s* \3 G
        return (maxsize);
* E8 E/ S7 V0 D}
. v5 O' r7 V5 q: }4 Iint dram_init(void)
) Q. C2 o6 L3 p. L" |  p; c{
9 q; T; a; N% ]        /* dram_init must store complete ramsize in gd->ram_size */) Q& m2 k+ g1 n- x- P9 B" ]
        gd->ram_size = get_ram_size(2 r! q. P! F0 s
                        (void *)CONFIG_SYS_SDRAM_BASE,
! v& t* z- x( ^( B                        CONFIG_MAX_RAM_BANK_SIZE);* j+ @; c& n& O/ \
        return 0;+ b6 Z* c7 x& M2 G
}
& l" i$ I8 T! z7 a+ Y* T3 O6 |) u; _8 z) j

) u* \' f1 u* O9 n% ~0 L9 g! c$ i! c& g& ]2 x# }7 o

$ T" e. y5 a" D& n$ w" dFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' J. g: l* m4 y; [
9 [( g1 J4 p+ h6 r! y  O$ g, f/ ]4 _, p. ^4 D3 I

+ Q8 L/ E" T* Y1 j$ G$ G3 L1 W" J
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-13 21:59 , Processed in 0.047290 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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