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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
% m) X+ ^/ d3 k2 U核心板2:DDR2 256M Byte   NAND FLASH 8G bit
# `0 V' h; t3 d* U) r+ f这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?- N" D7 X0 B% ^, K5 X1 C  I
, ^6 {# V* d/ h4 t1 z$ p+ }
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
5 @4 M' E4 F( r2 z/ F
, a& D2 O$ v- H. H
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! i9 p7 ~) [+ ]6 k4 w/*4 n: u3 y1 u* U# m" J
* Check memory range for valid RAM. A simple memory test determines7 ^1 U+ u: \/ u2 d% n  F, D
* the actually available RAM size between addresses `base' and
) A! S7 P% h& k% l; g1 f% O0 @* `base + maxsize'.; k. ]9 v- F* J2 Y7 N
*/3 |8 q- n: _6 W: ?  e
long get_ram_size(long *base, long maxsize)5 ^5 \$ E5 G' A9 d5 Z
{9 ?' n. F* l, E, J' h2 W+ R
        volatile long *addr;
. m  m' T4 I0 O7 m; P8 E        long           save[32];
: K, b* z* {* v, ^0 R7 `- p1 i        long           cnt;9 _2 B# T3 N7 m3 h. y+ L9 X# v1 Y
        long           val;
! w5 R) h! n( X' B        long           size;
7 U5 x; ~/ F" d1 I! a        int            i = 0;: B' z3 K( n. n% Y

3 ~" W; G) G2 k' g  ]        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {. [. I) V& J/ u. g
                addr = base + cnt;        /* pointer arith! */) ^  `' }5 h9 _- q+ f; D+ V6 [
                sync ();: l; ]; y- y( |; p6 Z% b
                save[i++] = *addr;7 D4 T- K0 \) r5 b- P
                sync ();, n5 a3 A( S  K( I" ~
                *addr = ~cnt;0 y1 [9 P& `6 N2 I- [3 r' ~
        }4 P* h5 B9 P1 c4 @
1 ]+ I* A/ Y9 a1 e4 F+ {: u
        addr = base;3 h/ ?: k8 e, ?- D8 \
        sync ();) }5 f) j' |+ e0 B
        save = *addr;4 }+ n" U( S1 z4 P: K
        sync ();8 n/ G: O  u  Q! R
        *addr = 0;' t, U2 u! J7 a! L, H
; W# A* F4 S! F# F* Z
        sync ();
8 z- k' n0 X, d3 Q/ K        if ((val = *addr) != 0) {
6 w* T9 o* q+ b0 l$ n, Y                /* Restore the original data before leaving the function.
$ z( r3 d6 j/ C- i" t; n9 W3 s" U                 */6 S' i8 V/ F5 O! n* C! q- {2 L
                sync ();
% f* F6 H3 e* `/ O( B6 `                *addr = save;
, r5 K3 Q( `5 q$ j1 J                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {' Z, |: t' l. f/ z9 |& x: B  m( A
                        addr  = base + cnt;" D3 Q. K1 R0 x9 D7 i9 x
                        sync ();+ F, M0 e! F4 b% O. H1 i
                        *addr = save[--i];
) C( h- r: s; N9 D0 Y# P                }/ D: e: N- u/ q- t* j' A
                return (0);7 w5 I' z; s- P, |- d  G5 }
        }6 N) t6 [# w4 L2 n% d! r5 I

( c. O3 C+ d4 p! l# h8 A        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& k$ T4 G* F  o* v, x                addr = base + cnt;        /* pointer arith! */
. @8 k) ]. F( B4 R4 c* p                val = *addr;
/ |0 j5 r9 \( F& G                *addr = save[--i];
5 T# G' n* a' M4 @                if (val != ~cnt) {
! J8 _/ R0 P4 t! e7 ]: P( i                        size = cnt * sizeof (long);
4 M5 r) Y! G" f+ i; c                        /* Restore the original data before leaving the function.6 H! x6 ^" [6 Z5 J5 [) K- x
                         */7 ?; }6 _8 F8 G0 R/ Y" ^
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; c) n, D7 L% D. r) g
                                addr  = base + cnt;( z  p7 W# m2 u; X; J
                                *addr = save[--i];
$ V! k) L8 T2 B) M! b4 ]                        }
2 ?/ E- a# q% q1 f3 h! h! B% E                        return (size);
* R! u# k( e: i# Q4 [                }: u( ]" _0 Q# D3 P% d9 a8 z
        }
0 U$ i9 L: E  P+ @" A4 U$ r8 H; P) ?
        return (maxsize);. h" |5 N8 _# E* \6 V4 P% M" b2 D7 @
}% r" _/ i1 S! @
int dram_init(void), O+ P3 c; B  ^" q. N
{
! ^( F7 n; ~. h' ?/ F        /* dram_init must store complete ramsize in gd->ram_size */* P; ^; `8 D$ U/ R0 j  x( R& [
        gd->ram_size = get_ram_size(* |5 u# V9 c0 h  [( u* j
                        (void *)CONFIG_SYS_SDRAM_BASE,
2 r' ]: q1 Q; H' r5 [) v                        CONFIG_MAX_RAM_BANK_SIZE);
  b. n; l5 V4 |        return 0;; U1 m* {0 O& G9 ^
}6 L8 F  D( Z8 c+ L+ P  W, a
* ]% y1 e" L) I8 q

) A( }' t* e' v" k' G5 X. m% C2 u: N0 [* d- x# H# k

7 C, v* d2 }: y7 fFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!) O: o$ _7 |8 G2 p, V" _' F2 Z( z

& |4 |( @. F3 b2 q3 r7 a% d/ p% C/ e: t# w+ ?
$ ]9 ^8 B1 i$ I% N; I& S) r3 W
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-6 01:50 , Processed in 0.043267 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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