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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
+ ~$ d' Q& Z% |4 M核心板2:DDR2 256M Byte   NAND FLASH 8G bit* ?$ k* ]" O* q  L" n
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?1 e$ s. c2 k- E6 U9 @% \' F  `9 F

6 A- K, G5 a/ c, S) A1 M" P8 i是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?6 F9 e( n7 e+ P: F+ _
5 Z( d' L' G# c( D7 P8 w8 y  D4 y5 A
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:+ A  j! T0 r; V! G( A% ?' n9 t# Q
/*
/ t  b6 z: ]( s* ?- C* Check memory range for valid RAM. A simple memory test determines
# O, Q8 H3 L8 o  r& o$ s* the actually available RAM size between addresses `base' and: t/ S* k( c2 p
* `base + maxsize'.0 h% |! {9 y- N% z7 U
*/
$ G+ \# Q# ~1 B& Nlong get_ram_size(long *base, long maxsize)% {4 A. {4 b4 H* a/ h. L
{! }/ Y' N, L( ]. r( M- J* G
        volatile long *addr;4 [5 b/ C* m4 z, K
        long           save[32];
2 H+ P* N6 I. q! o. ?+ \! l$ A9 P        long           cnt;- Z  d5 T! _& A( H2 v
        long           val;
* h. W/ z( @/ B9 p7 Z        long           size;, u, V3 O, ^0 W. L
        int            i = 0;
+ _1 ?. l) s7 |! |) L
. s7 K* S7 S0 s; R        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {7 R( `+ e3 w) g7 x/ p1 }
                addr = base + cnt;        /* pointer arith! */# }" H  q8 z3 Q$ \% k& n
                sync ();* }+ b! S. g9 P
                save[i++] = *addr;
1 |/ o' E3 i& @+ s' Y                sync ();9 h- L1 W2 z, E) \
                *addr = ~cnt;8 A0 Y- G1 a$ x3 u; }/ U- ]% N
        }
+ R2 ~! C4 A  J
3 Q4 O& p% K2 Z" L* {        addr = base;
7 i* C- \, |0 g8 _* R0 B        sync ();& p3 g5 W' }( y' `% ~5 m
        save = *addr;
  A% I. r6 g; D        sync ();
: `2 P; X3 f1 k, }! a        *addr = 0;9 r2 \+ d- q( }1 V' m# H+ r
4 B% d7 ~6 f3 r' Q1 @( h! V7 o
        sync ();' h0 A9 K8 t3 F& B3 S3 I' k
        if ((val = *addr) != 0) {
/ ~0 W- F8 w8 L* }                /* Restore the original data before leaving the function.
5 B. v) c/ t6 `                 */' o- i. G* n5 s/ k
                sync ();
" Q$ L4 o9 u5 ]+ W/ i                *addr = save;
# m9 g- r0 }% N! k* P2 X- G                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* @0 O6 o3 g/ H. w0 d( t0 y                        addr  = base + cnt;
: K! C3 [* F7 Y% R0 E# ?) r7 }                        sync ();
: e& G7 C3 G  p' V. l4 ~  g" n                        *addr = save[--i];
) o4 V5 K8 \# D* F6 ?& t3 z2 E# c$ `                }/ T% P! e  [1 {: ~+ q" ?$ F& Z
                return (0);2 {& t9 n1 R1 B
        }
- j* s3 c+ s) D6 ^# ~  k2 F- N8 p
5 L" I$ J9 _3 H' Y9 a        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; a" d' z2 u4 \5 T; ^, \  Q, @# I                addr = base + cnt;        /* pointer arith! */
7 N/ U$ R3 [9 |) X: I8 V                val = *addr;$ n- ~+ d- }- ?) @
                *addr = save[--i];
; e! x% n' t, Z$ n! x2 s' Y+ I                if (val != ~cnt) {
* q) p! y' m' ?' x                        size = cnt * sizeof (long);! V9 J6 H: v" |3 o9 R! J$ k: h; v8 \
                        /* Restore the original data before leaving the function.% \( `2 P% p6 R9 U  B! K
                         */# N: R" {* t1 e
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ l0 h0 y! A+ x9 S' z: Q
                                addr  = base + cnt;
1 V3 Z- j4 q* o. T) @( ~3 @  y) V                                *addr = save[--i];
' E- K* N' ~8 w/ X6 m                        }
' C3 S- a1 y2 [2 B' ]                        return (size);1 o+ X6 G# ?& o% r4 [
                }
9 d7 T4 Z  i' e. A( A  n* w) e- m% y  r        }+ v$ G$ a/ [: c& x% D5 N3 d8 P
7 w4 F3 W& b& ]+ W9 p: y8 F
        return (maxsize);
% J7 v: t( x, _) Y% L9 V& R8 j" ?; I}( n1 f! {$ ]0 e3 ~& r2 G$ S+ r8 v
int dram_init(void)  {; h: u9 |. n( a; K
{
; i# B$ i! V( X% S0 I( X1 X/ P) D        /* dram_init must store complete ramsize in gd->ram_size */
, e1 r- r- U0 J: r6 o( E$ h        gd->ram_size = get_ram_size(4 U, _, z8 B2 U, K
                        (void *)CONFIG_SYS_SDRAM_BASE,- [2 ~# R- ]# C! Z3 _- }
                        CONFIG_MAX_RAM_BANK_SIZE);
  a8 r: Q: u; L% M4 n        return 0;2 {9 Z, X" ^1 R# L( X. E
}) f/ \, _" U  X

0 o# _2 E4 k4 K, S& \7 `, u$ f. @2 R% o; y. T

' x; k* S$ G9 K0 |/ @3 T' y( t1 C1 T9 t8 `8 y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 O! c8 N9 H( K( `9 q" h& i& S* |& ]2 R, j

; p+ K2 r8 y1 S% M+ C( o' k
; T4 U, o3 c& A8 b/ c7 s4 {
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-29 16:56 , Processed in 0.042386 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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