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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit9 z* p3 F' \1 u7 ]) ^4 D7 r0 h
核心板2:DDR2 256M Byte   NAND FLASH 8G bit: j- {# _! i9 M1 |6 o6 H
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?8 {: y# B8 }" i. D- r( Y" W1 m0 e
, S2 ~, S, r: P5 q8 u
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?5 @# Q, _' r7 h

3 V5 r1 y- k+ T* ?  X8 D, U/ f
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:% x, ?4 Q& R* U. t. W" [1 p! h
/*+ I. L. u# ]1 f* ]" m! G; d
* Check memory range for valid RAM. A simple memory test determines5 g- H1 L' F% b) H( u
* the actually available RAM size between addresses `base' and
0 E: c' O; Q. O) y* `base + maxsize'.
' I" Z, ~% S( ~& q! w. q. @*/6 R0 u# e) k' i6 H$ Q/ q- f
long get_ram_size(long *base, long maxsize)
/ h$ \6 L9 ~7 O8 B6 k4 ~4 A8 i{
" H, p- k& G2 x7 Z: k+ e6 w7 T        volatile long *addr;
: g; P% l& m- g( L/ Q& m$ ^        long           save[32];+ ~. o" z6 H8 K9 V6 T# j
        long           cnt;
* l0 g2 {' q0 R7 z( c+ T& y        long           val;
# l2 N. |* N& `& P* ?        long           size;
; G% x8 j+ d2 |' [4 e5 I" I        int            i = 0;
  H( V3 P, k! \( W5 e( n0 Z$ ~3 g0 D1 n2 _3 ]" }6 z/ Y- K
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: ~+ L% g$ `4 D. j                addr = base + cnt;        /* pointer arith! */2 z* ~0 `$ q3 v' u7 W7 z$ Y0 U# ]
                sync ();
% u0 I% q1 N3 ~0 N0 }                save[i++] = *addr;/ F: n$ C0 q: m$ N
                sync ();3 R, m" O+ ?: N3 `! n& C8 A. W
                *addr = ~cnt;4 W% e: Y; M/ \2 ^
        }  Q# ?( R; \/ i
6 U: d9 ]$ r: S- G& x9 m
        addr = base;
  A  x1 M. {# A7 F7 N1 M        sync ();5 u1 e- T; B2 N' z1 a7 u
        save = *addr;3 k  J+ R  R. j& ]. n$ O$ {
        sync ();
4 l6 p- p9 X' t! S        *addr = 0;+ |- O5 ?: K' |. R4 l  O

1 y8 N4 R$ l' f# X7 i* w) C7 v        sync ();" o/ k8 u+ P1 W+ G! a
        if ((val = *addr) != 0) {
9 u, `' a. `& f) P6 b1 x4 ~                /* Restore the original data before leaving the function.
( q: v9 k" ^# o7 s, y2 o! R( G                 */! D6 M* g+ L) A* y2 v
                sync ();( o; F; D% [& B6 O/ Q
                *addr = save;
: o& e! B' }0 B5 C4 m1 ^( F1 Y; Z                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) s( J9 x: ~, N  I! Q, [. ]) C7 j                        addr  = base + cnt;
* a5 H' z( ~4 D2 M                        sync ();9 \5 i" {& V$ a' }* r  U1 \
                        *addr = save[--i];5 W9 A# i* m3 E, S5 y4 A1 A
                }
8 N/ j4 V* W8 @                return (0);0 T7 Q& X# j' u4 ^6 Z5 h% L- L
        }
3 k) J2 Y) r/ ^. Q
- F- v/ b  g  `4 }) v        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 D! P  F; Z# H2 |; c+ U                addr = base + cnt;        /* pointer arith! */
3 }' J# o3 z. E                val = *addr;4 J5 b6 V+ E0 e8 C! M
                *addr = save[--i];
$ [- f4 P; l& j                if (val != ~cnt) {
: e9 L$ e, {6 J                        size = cnt * sizeof (long);/ h8 U1 C! U6 s" z3 m0 C6 `. X
                        /* Restore the original data before leaving the function.8 ~9 a& b& L6 q5 a. ^( V* f
                         */) l% I( [5 P$ {- t4 u
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 c8 a, f+ e# M4 w+ `* ~2 M& z# i/ r
                                addr  = base + cnt;
5 C' t2 K5 d( l% x- a                                *addr = save[--i];/ T/ ^. T" o* O$ l/ f$ x9 [- L4 T
                        }
' G8 R) D9 c) A& ~; p. ~, G6 p4 i                        return (size);
( X/ \# Q4 |( v; M4 V                }
, c6 m) @$ J8 |4 l0 k' z) R2 s        }+ I& l3 h: D$ ?8 E) q
. k( c- ~$ J# y% r: w
        return (maxsize);7 G6 [4 T: s) a" @5 C  {
}( Z" u4 X$ c7 a0 N( {6 z
int dram_init(void)
( A* s' u" F/ ~/ \- l( Y{
) Q. X. E; [  N( g! \1 f) M  s+ C        /* dram_init must store complete ramsize in gd->ram_size */
" O- x( Z6 T: Q7 Z        gd->ram_size = get_ram_size(4 V# x, E. [, J$ g' g1 W
                        (void *)CONFIG_SYS_SDRAM_BASE,: L* l% G4 F$ @6 u1 D- x9 \% G2 H, o
                        CONFIG_MAX_RAM_BANK_SIZE);
7 m( T9 m/ i" e' y9 N, V; K        return 0;
. @0 }  Y8 Y4 L+ O. a& B}
9 x) `& a5 c# P2 J* Q- T
* i+ @; e- r) e  `4 w% O
  k2 {* ?" T4 t' w
* c2 i8 n* i+ R* |9 u6 G4 m$ q& ^( P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!9 N% i9 Q5 G- I$ c; x8 J
* ]$ E9 Z6 P1 l8 B  k' m9 B+ V
5 `( G* |/ H1 ^; P. I* q: D" W

. I1 c; H6 W- ^! \" W( x: E+ o6 u
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-5 21:32 , Processed in 0.041653 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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