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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit& ]- ~/ i6 U9 r
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
8 {$ t% V2 k( y% d) f这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?% T5 W9 d* m1 F9 S1 t& N7 [% |# j
# }6 D/ Y+ [5 i% Y7 Q4 J
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
  J* {; ?! M$ ~, f7 z7 x. b" r6 X
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:  U% a- a; y  }+ f) D, `
/*
$ q# Q4 ~* z; `8 h( w/ q2 g* Check memory range for valid RAM. A simple memory test determines( W9 p% A$ t; D7 k
* the actually available RAM size between addresses `base' and$ G  P0 z/ K3 m! k
* `base + maxsize'.
. {) w3 y* t! O*/% s+ L3 D0 q6 G
long get_ram_size(long *base, long maxsize)
2 P+ p& g( z0 [{  \3 z4 h# @) f( B  ]9 {7 b0 _7 i7 ]
        volatile long *addr;" d: s# ~# Y; A( }# u+ v
        long           save[32];
1 c% q% @& b! C4 [& w+ T! R        long           cnt;
0 S& o) t' Z% F4 @/ h        long           val;
7 _8 i4 I- C' |2 g! @: }; x2 _+ J        long           size;
6 D  e! ]8 T- O2 c        int            i = 0;' @% K' F  m- m' ?& n) K" h

$ _, O- e6 T5 {2 R5 Q% w        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: f# c0 P# M1 D# G9 R' K5 p                addr = base + cnt;        /* pointer arith! */
& v( D, B8 ]* W* H2 I" m                sync ();
( x+ h2 A  U' m/ n  P                save[i++] = *addr;
5 B4 t& v( x! h7 u9 W                sync ();9 h) x& o6 I8 n: r( ]
                *addr = ~cnt;
) G; |! }$ ^4 Z& b. u& M        }4 N" X* p( v+ M2 t2 y7 c0 e

) K0 B* M6 ~8 P1 D        addr = base;
# |2 p3 O3 v4 C- w        sync ();
7 _. \! t7 O9 Q+ i        save = *addr;6 P2 Y7 k9 |0 \" {+ y
        sync ();9 ]. V# i" K, }  Y
        *addr = 0;& ]0 Q6 k7 R8 {  j" g1 {1 E4 c/ e- {8 s

$ M! S8 \( `' W5 w7 m        sync ();
# f  M% a& Z$ a0 \& j' P        if ((val = *addr) != 0) {3 h. m6 Y4 g6 R8 p" D) `
                /* Restore the original data before leaving the function.$ j7 Y  V$ `1 q0 Z) Q0 x
                 */
* ~! y0 M( q# ]: |* S5 C' i                sync ();( D: N' C8 I; i% b
                *addr = save;( q5 `! B" E" I8 |( n
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; q0 Z$ f: C0 V* ^, l                        addr  = base + cnt;8 I" g- k" ^$ z" n, i" C
                        sync ();" P& v7 W4 x2 H9 E
                        *addr = save[--i];3 T; z9 J- k4 V
                }
( y0 [4 M- |! ?$ \6 L                return (0);3 F* Z  [5 {8 f' i
        }
7 J/ [0 |2 U9 [/ H) H$ r) ^
* x4 a: h* s; G/ s. T7 V        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) m; M" W, f6 u1 v
                addr = base + cnt;        /* pointer arith! */
8 `* A2 K1 Z; a4 ?! w! E# U$ ^6 O9 R                val = *addr;8 a3 a+ I0 S; l
                *addr = save[--i];3 v9 ?9 W  Y; n( u: N+ t
                if (val != ~cnt) {. j8 W8 E! z" J( F8 q2 e8 b7 E2 Z
                        size = cnt * sizeof (long);
- \' I2 Q. k- @0 I, ~9 @/ `                        /* Restore the original data before leaving the function.7 }+ Z2 P0 F6 ]" E) V: k
                         */: @) n/ x$ I7 N( \7 {
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {! s0 M  S* ~, c
                                addr  = base + cnt;
/ @* b- s( D7 r; l- j0 t6 }" c                                *addr = save[--i];. w; E1 m3 l3 l) U+ _+ R% @
                        }
; z& X" C9 c6 E5 x0 s/ ~                        return (size);- _; u5 k) c9 v1 N) _
                }4 M6 a" U! k; K
        }! x$ d- h' A+ j! y7 C( ~

+ \/ v# ~( Q5 k: J! A* w! R        return (maxsize);; x) P4 B2 A- [
}+ |' h7 ]  L/ k1 [2 L
int dram_init(void)
: u9 P8 b5 Q( J& p0 [6 D1 A{  z* G7 A2 G( @
        /* dram_init must store complete ramsize in gd->ram_size */
/ u& d% P) `' a9 C. n; o( M        gd->ram_size = get_ram_size(
9 T3 m1 P3 e7 d) B2 s                        (void *)CONFIG_SYS_SDRAM_BASE,0 x6 s" d4 P2 J: A* t% \
                        CONFIG_MAX_RAM_BANK_SIZE);
5 p! O! ^2 L; w" n        return 0;
0 N' ]' {. L7 C! S3 R2 d}1 x0 R% g: F7 p3 ^/ K+ V

! I5 m( p2 W! H0 A5 C/ a3 B% S, ]$ f$ H+ M- H6 ?4 U& h/ a
0 l  I& D( E9 ^) l$ `+ G8 s& [
% g1 c; f& _) ^! x$ R7 g
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 E7 \0 Y. O: D2 O5 _" u* C5 Q8 H4 {. z" D5 ^2 _
1 Z  P* ~, Z- X# A5 v$ C) G- u+ F
# z& W1 @$ Q, I# O" q
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-5 12:56 , Processed in 0.046214 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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