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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
; y- y7 b8 f& S' R# B* l核心板2:DDR2 256M Byte   NAND FLASH 8G bit
2 k' e8 X' i8 i7 ?5 {这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
1 ~5 n, }1 |2 s$ A# _$ @1 `( c6 f% a1 O
, N4 Y, `/ ?  T1 d+ h- ]' L0 L是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?# r* s/ n4 p0 C/ s/ ~
7 n" d  Y& N* V1 `' x9 _- O1 A
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:4 L. ?0 F# v6 l5 T
/*1 U6 x$ K+ O( @
* Check memory range for valid RAM. A simple memory test determines
! l# W* e9 @5 G" K( E* the actually available RAM size between addresses `base' and
  ?, |; Y8 Q* L& v* `base + maxsize'.
  M* |( K0 ^) S' z*/, O6 Y& Y/ H0 A/ c
long get_ram_size(long *base, long maxsize)( _$ n# y" F" ?3 |, H" {
{8 R+ C# B+ [) ~4 p4 y
        volatile long *addr;# f: M, ?1 |- k/ P! S
        long           save[32];/ F6 W/ e+ F. R
        long           cnt;# u, P+ d8 V4 N* ^0 s4 ~9 s4 o% I  J
        long           val;0 q* ?! d/ i; m' \
        long           size;/ j9 ]% D5 }' p; @& t# i
        int            i = 0;
3 E8 B' ^+ m' ~- }) @% x3 @5 @/ b7 z' Z; K$ s* w
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: i; j7 o4 i- x. r                addr = base + cnt;        /* pointer arith! */
2 S4 g! V7 a, t" ^, ]! K6 }# J& H( W                sync ();6 {( X$ A" [0 s$ A  P/ _
                save[i++] = *addr;9 N) T+ F. M9 @+ A
                sync ();
' x" g; C& K, p& {/ z# @- h# U, R                *addr = ~cnt;+ f" s* b' }( [, \. ?2 q0 [
        }) ]* u  Z. K4 z
& ~: x/ {: s. k" n5 L8 ]
        addr = base;6 X( d  t) ]4 s$ A+ }1 z# |
        sync ();3 m4 `, o  H/ k! {
        save = *addr;- D3 b: Q4 R% s) i2 n6 b" U+ z1 r
        sync ();
6 L! q  S; z( ?8 `6 j9 Y, V  e        *addr = 0;
, {1 N4 N8 k6 `; J& L- O% V& R' G. \
        sync ();! Q( Z- ^) S: R) P4 q0 C8 W
        if ((val = *addr) != 0) {* v( H. e# x+ ~% r$ X- M2 Q
                /* Restore the original data before leaving the function.
  }+ n% }5 A8 ]                 */
4 D7 M+ Y( u, h* I* c% u                sync ();6 G2 C: H* C" s5 L6 B
                *addr = save;
& h$ L& v; P( g9 i% }. |5 y                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 @$ d( n. Q" c  O# _" W1 }                        addr  = base + cnt;& ?, A/ @8 _. e4 J
                        sync ();4 h' S4 n  j" j+ u
                        *addr = save[--i];
  K% j1 ^, [! C- r. N+ k& N                }
. W0 Q$ G0 r8 C. s                return (0);+ N6 L2 F& _; k7 a& U! h
        }% ?" K. [8 V5 ^9 h. O  C/ r% x5 Y

& r2 q) |6 Q# N0 x* T- O/ S        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, s; b3 t$ h: U
                addr = base + cnt;        /* pointer arith! */4 x  X& O( U0 T; z
                val = *addr;) G7 N; q) F- X* _( z, w
                *addr = save[--i];* h7 c) O& m; l
                if (val != ~cnt) {
/ v- Y0 ^- z9 x- j4 F' U+ [& I! O                        size = cnt * sizeof (long);1 }+ w/ A9 ^6 q6 [
                        /* Restore the original data before leaving the function.
' z7 o3 E- p0 I6 f( ~; o                         */
, y$ G% B2 ~9 X( p5 o+ _: T& `                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% X: R  x: k6 n% @( }% U                                addr  = base + cnt;+ k- S7 E% H1 K' R9 f
                                *addr = save[--i];7 N& F7 p9 G! d" f  `  r
                        }: O: X) n7 Y8 d) X  P0 i5 l6 x1 l5 p+ Y
                        return (size);  h) ?5 x. q; i8 U9 ~
                }7 `( T; y# R# ?6 c0 a# J2 U
        }) Z2 S6 q  X/ s' q. J! k. a
. h& [. K; r7 V) d
        return (maxsize);
. t: v: E3 Z, D}" I& \4 B* Y' i9 ?8 U2 T
int dram_init(void)# Z4 Y8 w# s7 p( t" y
{
- ^# D5 D: y/ ~7 q& G6 D        /* dram_init must store complete ramsize in gd->ram_size */. U7 f! K( T, k5 g/ ]
        gd->ram_size = get_ram_size(. ?" ]" d" Q/ m, K. f
                        (void *)CONFIG_SYS_SDRAM_BASE,
7 C/ V4 \  Z; [3 ]                        CONFIG_MAX_RAM_BANK_SIZE);
8 F4 _% t' g9 g        return 0;- ~. w) b, T0 ^8 Y6 |. i- S3 p/ F
}
5 O, C+ `; S, J+ s# D4 z4 v9 f
! g) x. X( ~' V2 e! ~5 Q' b; p! e" D2 ?* j, i

3 z" q( q& i# l/ f; I2 j$ e4 h
/ I2 c' ]2 A8 O: ]: eFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) H) H- _$ V0 z# y4 U; e" w4 B  N- N+ C) _, h1 Q9 E) G
, u* h6 w9 ^: y1 ]( @& u7 I

: x- _" D* g4 A7 p  `4 s
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-18 21:00 , Processed in 0.039084 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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