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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit) K5 m2 w' r& N' G7 d4 Q
核心板2:DDR2 256M Byte   NAND FLASH 8G bit  {+ c7 L# s2 |$ R
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ Z" b  I- h' Q6 D0 k
  r( E5 J( ~/ @是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
5 s, y0 X1 o- @" u% j% h+ M7 n, B  K3 M+ Z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% S, m# W. ]% z' @0 }/*, C9 W6 X$ [/ T' q8 m$ i! }+ _/ z
* Check memory range for valid RAM. A simple memory test determines1 L/ u0 p0 @0 A; V
* the actually available RAM size between addresses `base' and
: Y" \- @) H( c* c, T) d+ a* `base + maxsize'.
# K) i7 e: d8 c& J*/
- b2 n& c8 O: z9 D. E" C% y: Ilong get_ram_size(long *base, long maxsize)
5 ?$ q: `1 N! K0 A' ^7 M{
  c, {; K0 e. m, w+ K. }7 k        volatile long *addr;0 E/ B; B" k% Y' o3 H
        long           save[32];! t8 E" h' R4 @& u
        long           cnt;
4 l/ R% |: X  }' M. g* w1 X        long           val;* J: |- B9 Z1 z. |7 ~
        long           size;
( @* J5 O( Y/ }3 H1 n' }        int            i = 0;7 e- Q( r' ^" S/ F* z' S& e2 [

3 D3 t0 ^. O8 P; ]! Z        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {# Z! w3 F. B) i) r
                addr = base + cnt;        /* pointer arith! */
2 O( P0 C+ r* ?                sync ();
: o/ z, I' ^' _( Z, r                save[i++] = *addr;; [* K1 R4 B0 k4 H0 u
                sync ();
3 l  U. ]8 J8 W5 z& [% `5 S                *addr = ~cnt;
1 ~7 j8 U4 e! E+ k& J, V" M        }' o2 W- b+ A' [, b* B* Q
- R$ x' K, P2 C4 l* ]( j8 R
        addr = base;# j# ^) b' Z( T
        sync ();
' ]% Y/ \! c( [9 \        save = *addr;/ q) B  ~  R. V- |( {* z( G- y0 t+ Y
        sync ();- H  h0 H! Z5 n6 w5 B4 [: t* N8 ]
        *addr = 0;
0 _; \0 R: n2 ?0 {" F8 D8 |' H( k, E8 s/ d+ ~/ C- V
        sync ();
0 c% k2 @& L) I( G: t) F) C+ ]; f        if ((val = *addr) != 0) {
+ ^1 D* n% l6 K" m6 c% l- U                /* Restore the original data before leaving the function.; P$ x% O: |7 S0 [1 o1 h4 v+ Z
                 */. i1 ]2 q$ D% q
                sync ();6 S% }+ m" x, _" ?) V# |4 T
                *addr = save;
6 b- e! J& m) U& @) y( g                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ d; O- Z3 g# O9 ^9 i                        addr  = base + cnt;
5 ?+ d& T8 |5 H7 f% s                        sync ();' v4 V$ C5 }  o# G9 H4 X4 _- b
                        *addr = save[--i];% P, g9 n+ e! F. r; h: i
                }; o& y4 a  v" g  P' s
                return (0);
& o- L& p: R$ N# X        }" s, Q( U7 l2 b7 G- e3 D' Y' A9 J
5 ^* j. F- Y0 K7 u4 l- o2 U
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  Z* P/ k! d0 t) i
                addr = base + cnt;        /* pointer arith! */
' B. R- c$ K$ h. @. l6 J                val = *addr;
( v# W5 p* D3 q4 l  d                *addr = save[--i];# X' ^+ s1 E7 j3 u) [4 i
                if (val != ~cnt) {  G( ]7 I: s  [" r& Z9 @
                        size = cnt * sizeof (long);
2 _# r" I1 j- r3 \3 _                        /* Restore the original data before leaving the function.% h( ]/ X; ]7 m+ [
                         */- }  j$ a4 {( @1 `$ K9 Y: I) j
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ f. P0 c6 b; v' n4 R
                                addr  = base + cnt;1 b8 m# ~/ u& V6 L9 p- j8 K
                                *addr = save[--i];
0 b- l0 |7 i. s" e                        }' ~4 C/ u( C, o5 p3 D- d
                        return (size);
6 o8 s8 b. K1 i8 S+ }, T; l                }
; l+ M( r9 d& C: u9 @( ~- b        }7 _4 q: C7 l# T

( ?: r& D# V- N4 n        return (maxsize);( ~! V, b( Q* ~8 Z: C
}
! i; ]5 X) F" H& zint dram_init(void)
: {2 m. n- A' R9 l{* |  @+ `- \% f
        /* dram_init must store complete ramsize in gd->ram_size */
: C# T8 b& l. {# w$ C2 C        gd->ram_size = get_ram_size(8 z' H: M0 R0 M  [5 C
                        (void *)CONFIG_SYS_SDRAM_BASE,9 f, m8 t, q7 O( |$ X* A/ B1 h
                        CONFIG_MAX_RAM_BANK_SIZE);$ x2 k5 l. q) k: n' v
        return 0;
& O9 M. F$ I. T% B3 {# l% N* o2 k}
- o6 a- U: f8 G) B
/ g; h5 h% Z+ ?5 `% B9 o
  J# O1 w: M" z, a; Z6 s1 k8 g% P7 j- O4 K+ k$ a# e
' [- c! p5 C/ A9 R0 l* }" |* Q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!7 ~; o; `$ s' b0 Q

" P% L* F* V* J; l; R8 W: X# Q7 y' D8 X% r

; g$ B$ c- S: @2 {4 `
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-24 19:57 , Processed in 0.039085 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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