TL138 uboot是怎么区分配置两款核心板的 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit; z) o& Z& i3 I: |& g/ L
核心板2:DDR2 256M Byte   NAND FLASH 8G bit& c8 Y0 w$ Z# C: h
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
$ ?; R* @' c4 Q3 K6 [2 t( _
/ X6 ~7 C6 i! R; j是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
- j( Q  j5 s& Z. V, e  V. z) k7 ^: L: o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:7 o/ R& l  V2 h; X9 d$ }
/*
2 [/ K4 j! l- Q* H0 v0 x* Check memory range for valid RAM. A simple memory test determines; v' P) K4 @# \$ l
* the actually available RAM size between addresses `base' and
/ a$ Z! e4 m/ T. e" v, i( t" y* `base + maxsize'.1 w& t, [! a& _
*/
7 V. n/ U1 m. o- k! Ilong get_ram_size(long *base, long maxsize)' `9 s( M  P  [- v% V+ C, H. w/ P
{
1 L8 i. J8 M1 W, J        volatile long *addr;2 @( D; Z& a. b* o6 s
        long           save[32];$ ]8 R9 e: O0 J0 l" b' F
        long           cnt;7 R; Y% A* l$ |# p2 z7 u
        long           val;
: r- G7 b4 b& q! a4 ~1 G  S        long           size;, s5 [% |1 B% p3 `' i3 @
        int            i = 0;
4 B; j6 R& q1 @7 V9 l6 r; n3 m3 Z  }4 B9 p
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 R, P! R; L% R. L; x' y% N* i                addr = base + cnt;        /* pointer arith! */
3 N8 P/ o6 l' O) a4 z; B* p                sync ();+ W' l8 x$ K( K: S9 d
                save[i++] = *addr;+ `% y% F2 y# W, n$ d# }
                sync ();$ G% L% k4 D+ c) e* d* o: p
                *addr = ~cnt;) z: @& }9 @/ H) T3 p
        }
6 O2 }3 j/ d! {8 g& p  h: M0 i3 d+ R! t, O$ J4 A; `" T/ T% m. j
        addr = base;
- D- J5 ?+ x( G6 Q, R& i8 y        sync ();
2 x$ o# p+ C  }7 P+ {8 q        save = *addr;
- ^5 s  L. I# s+ m3 A        sync ();( ?  R- ?( e8 m
        *addr = 0;% {5 D) j  K- w! E: H
) s/ X, ?* r1 r2 l- {. Y/ M
        sync ();
" t& C2 A! y' k& e' \; Z+ {        if ((val = *addr) != 0) {0 b' z1 ~5 Y" `6 t; Z
                /* Restore the original data before leaving the function.! `! _( {0 u$ g* B
                 */5 g3 {5 T9 o' g& p' W
                sync ();
  x6 ~& N9 c( O- \5 f! X                *addr = save;
! N& l/ @1 W5 C+ [1 P6 l                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {0 @& n& \. w1 V4 A, F6 r
                        addr  = base + cnt;
7 b5 Q$ q$ L7 q- j+ ]. S/ m                        sync ();" w* J, `0 H) ^/ B2 {! ~
                        *addr = save[--i];# h$ J9 W& D9 p6 j6 O4 Z5 w1 C( o) t
                }
9 Z+ o' ]  g2 r+ U1 |1 A/ k                return (0);2 t$ L, D0 w  g
        }
, x2 k5 }0 K% x! l; l. A3 Z
1 N3 T4 x+ @& |/ t8 }1 E5 x$ y+ q        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 Y2 V& v8 u4 Y" @- W
                addr = base + cnt;        /* pointer arith! */
0 m" ^2 P7 t, K# |$ e( m! a                val = *addr;
0 ]/ H4 [' I( Z, F) T# \& Z                *addr = save[--i];
. X9 b! q, G/ j/ b% X0 @; ~$ \9 H" j                if (val != ~cnt) {
: Y: Q; p8 ?1 R                        size = cnt * sizeof (long);
. b+ E+ H) ^  L4 U                        /* Restore the original data before leaving the function.0 y* J) g: p5 k' E
                         *// o5 Z' F$ r/ s1 k
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 \: y" E4 i& d9 t
                                addr  = base + cnt;
( T* w' Q" x7 p! a( \                                *addr = save[--i];& l% G; p( z3 p6 i9 T
                        }# h- G" Z  I) B4 {: _
                        return (size);! j  E* v! r* _( B& ^/ D8 O
                }. A* ~- r: m4 b5 n8 B
        }  @4 r3 k% Z. @5 d
1 S& t+ r) A% `# T
        return (maxsize);
  f( c8 [4 ?' y. S}# C. L' _# P: w# v! ^# l
int dram_init(void)
' Y% ]7 A$ y# a{; m% |5 z! S( `& i" i1 V/ G! m  Y
        /* dram_init must store complete ramsize in gd->ram_size */* n  m+ _& [& i9 r$ ?. S
        gd->ram_size = get_ram_size(
' D' `0 s. O# H7 H* x+ q' P                        (void *)CONFIG_SYS_SDRAM_BASE,/ ?4 Z  ^3 V- B- b% R/ E( E
                        CONFIG_MAX_RAM_BANK_SIZE);
: m& d# w& Y: o. O        return 0;: u# t1 T  I  V2 Q) y5 |9 ]
}. d3 v. \- U9 \# O1 c
, P4 A  u6 |9 O# u% B0 S) _- e

/ B  k* N5 j1 T- m0 `: y" T
1 j4 J: p+ T% R, k- B) E! e  V. c
1 q* n- p' D6 v9 h7 J5 Y% ZFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!) f0 h1 ]2 `: N/ O3 C4 C
. B! p. z- _) R7 `; W" A+ m$ h+ V
$ k4 J& U8 K  o, K% Q

4 U, {2 [' D% J/ c9 ]' ^
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-14 16:02 , Processed in 0.040875 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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