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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
- [+ g1 K: b5 H( F$ [6 k, g; M核心板2:DDR2 256M Byte   NAND FLASH 8G bit1 }, y2 u+ M, u  E: Y- K
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?3 [( w9 y. f  J( c- [9 [1 k# |
% a6 k' D( d8 n% q8 H' Z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?8 Q& C% f! l' \. T/ h

5 f: v, Z/ C6 ^
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ O0 j% w; W& }4 |/*2 V" U3 z1 O! P& ]" G
* Check memory range for valid RAM. A simple memory test determines0 ^7 E; A+ q' d( t$ d3 D0 U* x
* the actually available RAM size between addresses `base' and6 f# z/ I# J6 E8 ]% c7 G8 [- _
* `base + maxsize'.
% ?2 }  g5 Y7 U+ m/ S# H*/
1 f/ `+ t5 z8 ?2 Q/ vlong get_ram_size(long *base, long maxsize)
" B: F7 S% G2 o9 D# A7 ^% |{7 T- y. p  M! |
        volatile long *addr;
0 s  _2 ?$ G) I2 y        long           save[32];* z0 C6 I9 ^' k0 r; g  P
        long           cnt;, U9 c( i- B* f9 ~/ R8 R( N7 i* H
        long           val;' q' Q$ B% C/ j4 w2 S
        long           size;$ v. S- `( f7 k6 z9 b' r) }  [
        int            i = 0;
" n1 F7 r# w' t/ y: y1 D" M# j- X( n7 M4 X
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
0 h: B- ^% E+ v; z+ P- q$ P                addr = base + cnt;        /* pointer arith! */
/ U/ ^* y2 b; z; G. i                sync ();% G5 @6 M  m- w8 c
                save[i++] = *addr;
0 c7 ~! c8 W5 q                sync ();1 z' z" }% V/ ]1 J: I4 p
                *addr = ~cnt;+ L) I5 |6 L: L, J  E  X
        }* b* E$ X: o- l& C) O

( R7 m9 D: U6 V+ l        addr = base;
' Q, r( E3 S: {! [        sync ();
+ O2 a0 v7 C0 T, K( f  A7 ?0 w+ X        save = *addr;
. L8 \8 E# `6 I" S6 E5 v, p4 u        sync ();
$ N9 K) H8 a( T3 U0 T" \# Q, M        *addr = 0;, ?6 l' ?. @5 G8 U% s# O
3 O. |4 z6 n8 h# [
        sync ();$ I5 F, \! O( Y( f$ c
        if ((val = *addr) != 0) {* Q2 m  p' v' V
                /* Restore the original data before leaving the function.
6 i! e" E: E; A3 y. o                 */
" b3 ?/ l9 c; L" H                sync ();
% `/ H( d* m% z% e8 \8 E                *addr = save;
" c9 j: G8 B) F0 J                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {! k2 K1 ?. w3 |! }5 D' X( n/ ~
                        addr  = base + cnt;
9 Y5 {+ }) i/ Y" y                        sync ();
! a0 Y; C$ x0 F. D6 H2 e: D                        *addr = save[--i];& [" r% _+ M  _2 i7 h2 z+ g7 B
                }  h2 C. D5 A9 E) t7 C# s
                return (0);
( R' Z; L/ b( Y7 Z% h- k        }9 A9 ~( u" h! S% z

, f+ N- j4 [  @        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- f$ Z; U: p: E1 C( v& j                addr = base + cnt;        /* pointer arith! */
0 f7 w$ e: d. X6 Y0 o) P5 l4 I                val = *addr;, _: d- G+ |1 m$ j# @5 E8 j
                *addr = save[--i];, C8 a7 k5 v. A0 M
                if (val != ~cnt) {
* B+ \' R0 h- k                        size = cnt * sizeof (long);
9 W* x* e2 k5 i1 Q                        /* Restore the original data before leaving the function.
& P3 g( Q1 H, c  i: M                         */
' L5 o* _& W  ^* k5 Q- U                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {% ?7 [$ d) c# }) Q) F% w5 {, u  a# O- |0 ]
                                addr  = base + cnt;- D5 R: o. s$ K: l
                                *addr = save[--i];; L0 R- @" Q: `4 X6 H
                        }1 W- G: x4 b& F  o6 R# Q0 N
                        return (size);
+ m2 `5 a7 Z, l7 u* p& G7 \                }
3 g6 l8 B2 q' A' L& G- K) Y  p        }
+ J# g( J- b2 @3 b
; \3 m/ h# ?) v2 M        return (maxsize);
: A0 ~' ^; X. A6 n: o) Y}
$ b" w  }6 h$ V# q# R. Nint dram_init(void)
; K6 ~7 B5 P/ [: ~0 i8 @  g{" r& Y4 E0 z  r) N9 D- J, T: Q- y$ h
        /* dram_init must store complete ramsize in gd->ram_size */) R+ X& H8 m+ k( i8 }% w
        gd->ram_size = get_ram_size(
0 d' D! K/ o* y* g$ A2 p$ m6 f                        (void *)CONFIG_SYS_SDRAM_BASE,
2 h" d3 Z6 ~! n, O5 l% Q                        CONFIG_MAX_RAM_BANK_SIZE);) C2 Z! ^0 l* e
        return 0;, l* D$ Z7 ]- l# u# p  \8 f0 f# k
}
# Y5 g9 {% I. `4 U4 A( T2 X! Y: p) @" i% b1 d" k  v

( Q# y* k; A. |0 @
2 H+ q0 ^$ x! A
$ b5 a. g* @7 ?+ D! x, U2 Q3 a, r: ]FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!. R6 z/ T5 l  b: a# T' c) ]0 {3 d

: @' ]1 V0 E# K  y1 R4 @! _) d
) V4 j; q; @3 V4 O
, z5 V/ |! u' S/ w
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-4 13:41 , Processed in 0.041694 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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