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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
3 A, _$ f: F* C* S1 [2 h  |核心板2:DDR2 256M Byte   NAND FLASH 8G bit
( O) ^7 w: M% C9 r这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?* Y7 C( z7 ?2 h

; @2 x. a; k' e: ~; d! ~6 K是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?  Z0 q5 S5 i! k+ @( d# @

! w0 \3 `4 J# n$ a2 v
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 b& t: X% i9 z$ x# o/*9 S% ]" l6 W. Y8 a5 d. ^3 D( C
* Check memory range for valid RAM. A simple memory test determines5 o) N% l5 E' S* X- p' c3 L/ d  Q
* the actually available RAM size between addresses `base' and
- Y* q4 Y* C: W0 D3 ]2 F+ R* `base + maxsize'.
1 U$ r5 n% w7 Q* W% |*/" W$ Q! ]9 Z' @8 h8 f( S4 J
long get_ram_size(long *base, long maxsize)
, n  v9 H. g4 H" L7 x  @" |& Q{4 S/ l( F# p+ K, o6 b
        volatile long *addr;
) Q: @+ }! k; B- v: t5 R2 v5 L        long           save[32];
5 g% g" H( }; L7 s7 i- y        long           cnt;
$ f) }% _/ {6 B: A; b0 W& o        long           val;. E! z/ i. @7 a( ^1 ~6 Q
        long           size;
1 `5 }/ O9 q* j% v        int            i = 0;) P6 m9 V9 U3 x5 j6 }. L* Q
  y2 |- r+ _# E# R# B- q
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {' a8 a$ u- O4 ~4 I
                addr = base + cnt;        /* pointer arith! */' P$ h7 D$ r/ ]
                sync ();$ H& O! r3 X8 j1 k* d1 ^
                save[i++] = *addr;6 W3 h/ X2 S1 D
                sync ();
6 N$ x: t$ D% @                *addr = ~cnt;6 v1 ]' B' r2 P- l9 v  [# t& p# H
        }  ~$ G" Q/ Q$ |+ [) P( U. E$ p

( w1 S3 _" S$ v  `        addr = base;
  a- k$ ^: M: b; |        sync ();
" H! u; I( \. ~% P! s        save = *addr;0 h: T1 C- b2 |9 ]3 u
        sync ();
' q7 w8 Q" x  D5 L+ ~& X. s/ r        *addr = 0;) }: `+ v' L3 P5 N

7 u" |- H+ l% q0 X! C  m        sync ();
0 w( K/ N& H/ _1 J; M# Q( x8 o        if ((val = *addr) != 0) {: Y: c+ o9 R! _. g
                /* Restore the original data before leaving the function.
+ [$ u8 @( j7 M. X- A                 */  q2 o) Y3 {1 P6 m+ [7 W/ d
                sync ();
2 [' r5 c7 i% o                *addr = save;# ?8 Q, k+ r0 S/ @
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 j: K6 e5 V8 G" n+ q) E& D                        addr  = base + cnt;
+ G$ G: C* D& C2 ?                        sync ();+ ]: i- p3 R$ E% d
                        *addr = save[--i];
$ T2 ^9 X2 s1 {. l0 A* s6 C                }. t9 J; z5 M8 h1 e# w
                return (0);/ x# |% D5 `! I$ |  P
        }. e; W0 A. |" n5 c2 {- I

, ^3 r' U6 N* t/ q' ~        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 d% R: H; o2 ^& ~! @4 A                addr = base + cnt;        /* pointer arith! */
) o8 Y& R  h$ t# ~; o                val = *addr;
5 @9 r5 [* A' `  u                *addr = save[--i];# E  C& ]: H( |5 _2 F$ U
                if (val != ~cnt) {
* j! F2 M, A4 |, D; m7 g( m                        size = cnt * sizeof (long);
! c: o1 Y# L3 C( ?" _& G0 L0 O! r                        /* Restore the original data before leaving the function.# J6 r  _4 \$ Y* \
                         */
3 v4 s$ j8 T! `                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 l2 x" n+ O- U9 v3 T' d# I5 T                                addr  = base + cnt;- Y$ j" ]/ Y/ A$ T8 H  o
                                *addr = save[--i];& B8 r5 h6 m+ W, _2 k8 b3 F
                        }( I* f+ v, E! d6 T- p/ D; b
                        return (size);
$ c0 q1 L7 m$ w% V+ G9 H                }& z9 v0 B. D$ O" N, V' G9 R6 r3 S
        }+ c/ I: M! v  x9 a
/ `. }& G$ l7 H9 W) u
        return (maxsize);, w, B, X+ D8 u( J% D
}
& Y, L" O4 ~% Q7 t9 O, n3 B' c& Pint dram_init(void)
7 U- H+ w$ S" Q9 m" |  `2 e{
; x7 Q  c7 \) A7 _/ s1 n        /* dram_init must store complete ramsize in gd->ram_size */; W" g9 `, N) y
        gd->ram_size = get_ram_size(5 p" U- j( ]2 P3 f9 @8 ?
                        (void *)CONFIG_SYS_SDRAM_BASE,
8 {; w. @( \0 w  M9 F                        CONFIG_MAX_RAM_BANK_SIZE);
8 D0 K; N9 q  o) |( k; p# ~/ [        return 0;2 m4 L; c+ ~2 n) m  I% @
}% X# K) ^5 N8 A1 \; w7 i
8 Z  X3 \5 P# S* R; J! S

  p8 W, G0 Q6 P3 Z/ J8 m, t! P. a6 R  _. w7 G

3 G+ g) K! |* K: ?FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!2 ~: h, h1 l9 W3 [. t

4 P( j$ R) ~0 W) T8 L$ S- `6 P9 w3 o( L' ]. n

3 Q5 K5 P6 f. p" u3 ^; r
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-8 16:55 , Processed in 0.040111 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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