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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
, l* x: m4 W3 j! p  F) o* q核心板2:DDR2 256M Byte   NAND FLASH 8G bit
. y+ \& F: H6 m- K这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?" {+ o) n3 }! w" e6 }
( F) C& p- f3 K7 v4 i4 o- b1 R6 |
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?, I5 h+ [1 J* t, G
+ g. t: P: m" a% ~3 M5 b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& a; `# V/ p' U" b' @% q3 ]/*
6 C- M% ]# c+ K+ E* Check memory range for valid RAM. A simple memory test determines7 k3 N0 U- W6 f
* the actually available RAM size between addresses `base' and, r% \5 n6 E' p$ K
* `base + maxsize'.5 V7 _! N! C7 L8 K
*/
$ u3 T- v) O0 @/ Blong get_ram_size(long *base, long maxsize)+ I( r! m5 b6 y& v( I
{5 [- O1 @4 {4 R9 }& I# j  Q
        volatile long *addr;5 Q& Q# I: ]+ W# i: P1 H
        long           save[32];$ I/ J0 [& l: ^" q) v" q
        long           cnt;
8 v, {& b% W9 H" S/ }+ z. U# W        long           val;
! f/ X0 v7 F+ |" O9 d        long           size;+ n; i* ~2 T* D9 Y
        int            i = 0;) e* w; P" d# G  T

" s2 K0 R; I& |: {2 ?2 _0 q: c        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 E8 ?' w  W+ y" i" i                addr = base + cnt;        /* pointer arith! */+ V  h# o6 o# Q  b. Q2 s
                sync ();
' V; `# ?5 R1 |                save[i++] = *addr;5 ?8 m8 X* G$ `& Z+ ]* J( m
                sync ();
* `3 ]* d6 M2 H* Z                *addr = ~cnt;$ b5 T  O7 W3 x2 I. p/ x4 e
        }
, f. z0 y9 h8 S+ l; K" E( u. @3 v$ o' v& v6 ^5 v) ]  V
        addr = base;$ [4 w, I7 D' X
        sync ();
7 x! ^8 X3 f. a( F4 _        save = *addr;
- ?8 \6 j3 T5 a7 _        sync ();. g$ m* v' {% n( ?! N
        *addr = 0;6 e3 v' O/ D- h0 P
; H' f/ Q. x) ?! y
        sync ();
; _) e7 |) b; n        if ((val = *addr) != 0) {
/ X7 K, C& b* c$ j. u                /* Restore the original data before leaving the function.
5 |7 y  e, d( S) i3 h  R: N1 r, n                 */8 \+ U. N+ s( ^- r2 k$ U- x; X3 ^
                sync ();; s: T/ J4 v9 R. O9 K9 u
                *addr = save;
* J& V8 q* z( n4 u                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 t! }  T& v5 i4 [& g4 }                        addr  = base + cnt;
3 v0 D: ?: ~$ s* ~                        sync ();% Y/ \5 r- C" z# z0 y
                        *addr = save[--i];
6 A* R( O4 i% |1 y- }                }
' h7 g+ V, {# q/ s4 C% W                return (0);
+ m% X, o/ ~  i1 q7 B0 P* a0 z. d        }& V7 v- r, O7 q0 \

0 p4 b1 D+ I: w' F4 T1 I        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 @0 z. K5 {/ o' J& W7 B
                addr = base + cnt;        /* pointer arith! */
0 O- _; q( s5 K- w6 P, B& D                val = *addr;0 S. u( \: d* k4 c- ~9 r6 L
                *addr = save[--i];' i: M( B/ d: P0 j
                if (val != ~cnt) {
9 n8 ^9 p4 N+ n1 W8 M, h7 `' x                        size = cnt * sizeof (long);2 d% r4 f  k* l# c6 {) v
                        /* Restore the original data before leaving the function.9 o; e3 z! ]4 G! @# v. P
                         */
. u- s% p7 ?$ {9 {6 P! q8 u                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 v% V! g8 V, f. Y
                                addr  = base + cnt;
+ c+ q" }: f3 m0 O. t( v                                *addr = save[--i];$ E4 s" ^: n. x0 f% s, X
                        }4 M: K' F1 x7 f7 r) C
                        return (size);' }, ^' [, M0 n3 c2 A5 h
                }
. O( \- `! K+ X, j6 }; Q: y        }+ E: ~: x" W) ?: [% ^: s0 W

4 `( Z/ U# W9 E! a! k( X7 K        return (maxsize);
8 `! G# U& V# i! d& t}
2 [) W+ t/ S- I/ c- Oint dram_init(void)2 p) _  h! G4 c) W2 V( m
{
8 Z) B  ^- v% f7 v& v        /* dram_init must store complete ramsize in gd->ram_size */
7 T" [! k, b# c; q0 H        gd->ram_size = get_ram_size(1 u4 x; ~$ b! d# B! r9 n; N- \8 R
                        (void *)CONFIG_SYS_SDRAM_BASE,% B; K4 q' Z' V9 ]
                        CONFIG_MAX_RAM_BANK_SIZE);
) Q3 _/ Q( a: y1 S1 X+ z7 W9 g* R        return 0;
7 I: G6 g. S$ E; U% |}
& W5 J8 D3 [9 U- r2 g( R2 `+ l$ X2 _7 c+ s8 J. N; Q( w( l$ R2 [

3 L) R5 q, `) p4 I# `+ _& I6 x( Z+ T% H: A- s
0 t" d: F- r% J1 {- p$ m+ q, K" F6 n( N
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!9 H; R: r+ O; c2 J+ r0 C/ f

8 u; t0 b6 B1 ?, x
8 B# l% ?( i% r1 N7 U

0 [: `" k  z% H( w$ v
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-26 08:49 , Processed in 0.039225 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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