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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
& E5 |9 E4 U6 F  w4 @核心板2:DDR2 256M Byte   NAND FLASH 8G bit- w! E9 g5 _: ~
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
$ S) M" C) ]2 W, z& f! H) A( m4 s7 P  s
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: c) {  A* O5 `# I5 W! j6 x, E' b0 |) j5 x1 u* j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" y$ P5 U1 Y* o5 j/*
5 q, N; s: x' D1 u6 q* Check memory range for valid RAM. A simple memory test determines$ r+ e+ X, a" |+ d' S7 Y
* the actually available RAM size between addresses `base' and
( Q9 j; E# h) c5 }1 y' S- u% Q* `base + maxsize'.
1 G7 X: L- o4 p3 H3 X* f*/
' r$ n0 ^- c- J! Xlong get_ram_size(long *base, long maxsize)) o$ M( d) a7 M, ]3 B
{: j8 ~% K6 w* g
        volatile long *addr;
/ z; P1 M1 ^2 @2 p8 m        long           save[32];
! {- {( O' m9 ^/ M- L# t        long           cnt;
" k# E- l7 S* A- Z$ j        long           val;
' x4 I8 x1 t( G' |$ n& N" M        long           size;* C# E$ v; a% m+ _+ ?. X
        int            i = 0;
: {4 U! L/ U5 o
8 ]5 I4 `' I' I. U        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {( b1 T3 w% Y# q( K& ^  r
                addr = base + cnt;        /* pointer arith! */9 G# P$ Y( e6 A! S
                sync ();
/ h* T8 c5 H9 G  G+ v$ ^                save[i++] = *addr;
' F/ ~: \- V" o) C                sync ();+ l" X5 M3 w1 g$ B( r8 H
                *addr = ~cnt;& {" A- n( a0 K& n8 P
        }
8 P6 R, T2 w, ?' G1 Z3 }
6 P! E8 Y' L8 j' ]# I) E! n! b        addr = base;
8 ~$ c% E- K$ V1 y        sync ();- ~9 d+ k; T- P7 |
        save = *addr;: {7 u/ H, _7 ^2 B! i- g1 n& n
        sync ();& c' _8 E5 w3 |4 ]5 A
        *addr = 0;- H, q$ ?+ @" V7 t

' o' Y' g1 |& u; m; ?! y        sync ();4 W) ^( m. o; b8 M& D6 u4 a' z
        if ((val = *addr) != 0) {8 c8 O: D' }% k$ g; _/ T  x2 T/ a  I
                /* Restore the original data before leaving the function.# K+ \# U) o3 N
                 */' H: c& ~8 O8 h
                sync ();* |: G; A/ ~$ ?# Z% T. }
                *addr = save;
* ?, t: C2 Q# P; R$ i! g9 I                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 t6 w7 ^  z, U" b                        addr  = base + cnt;
7 ?# P: E, m  F8 L% F                        sync ();
( z: a% N: X: Y  [% y                        *addr = save[--i];
! Q/ K# D2 `+ a1 L2 x& w. T2 h                }
- G3 S3 c8 E$ I3 \+ Y  W                return (0);+ ?- n5 ~6 r$ I& {6 x3 g0 ^$ \
        }
  \/ ]9 k, s+ g$ h/ n8 [
: U9 z! E' w3 i7 @9 @5 `        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 ?$ b* i6 H) B5 Y3 [0 @$ b" C8 S
                addr = base + cnt;        /* pointer arith! */1 e% E) Q- G/ U+ N2 M5 Y9 A
                val = *addr;; B+ i/ d! ?/ [1 ^# a: u
                *addr = save[--i];
) p, Z" Z) ]# Z. F! q3 [$ O9 ?5 W                if (val != ~cnt) {7 S  ]! p3 J7 x, ?( o" |, e! [
                        size = cnt * sizeof (long);2 @4 Z' ]- j2 c$ y
                        /* Restore the original data before leaving the function." s. w. {9 h3 V! s
                         */' h5 e  i& S* I! P% |. m
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& e1 O  G& L* k                                addr  = base + cnt;
# ]) E, ?9 w8 {- V8 h0 g                                *addr = save[--i];
0 d; P* @: u% ~  X                        }
' B! o- T/ R* y, b. S                        return (size);
& L% Z4 k. V9 l. @. O3 t! [                }; _  Y7 Q- ]' P+ V
        }
3 X5 B) L7 c% P! G" v0 t
4 q9 x* L3 K* h        return (maxsize);
, S- g3 C4 F# e$ S7 w/ L. T}
  u- o1 D- w: }, kint dram_init(void)
& ?6 c+ Z5 o9 H, u7 X{
1 ?5 P0 m- A# ~( ?  F, }1 G! A        /* dram_init must store complete ramsize in gd->ram_size */8 P" w3 k/ @$ j9 X
        gd->ram_size = get_ram_size(6 _( ^( X* z4 W. c9 W' `' m. \; V
                        (void *)CONFIG_SYS_SDRAM_BASE,0 [; i% _  @. t0 ^6 ~4 o3 J
                        CONFIG_MAX_RAM_BANK_SIZE);
! T% l# h3 K2 c; B        return 0;2 J) o! ^- h5 a: P: l' x' \
}
* v+ U( b  L. S
" a1 x( x1 [6 r) _  ]$ {5 z
- U8 G$ P5 ?8 C2 q; I1 w. I2 k9 V) i2 U9 {8 f9 A

/ q4 B& z, V$ k1 G9 F+ d0 MFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 S7 I" B: J% C$ {  v
$ D. P! K  ?& D1 e, |2 b. A. b4 k1 k# Q: \9 ^9 H4 p$ B- |
2 ?$ s: j! D+ A0 S: J3 [1 T" s; A
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 16:33 , Processed in 0.035726 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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