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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
1 S! K- y8 p% r! R. f! {核心板2:DDR2 256M Byte   NAND FLASH 8G bit6 I/ ^8 h3 u5 A& _' P: w9 u  X5 b
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?  G' z% R8 q% z+ Z2 p

( p7 l6 D! |1 R6 Y7 j是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# y9 U- f. Z/ H0 s# C- S# B6 n  L9 Z3 t/ X- X* f
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:0 y9 w2 j+ P- S4 ~* w
/*
4 u+ ]  N3 {/ r( U1 G* Check memory range for valid RAM. A simple memory test determines4 I0 y  r, d: W8 t# g! N
* the actually available RAM size between addresses `base' and
5 {8 \8 s4 K6 h1 ^, K* `base + maxsize'.
* s7 n6 N5 W5 m3 n*/
% u  M% m# Y4 N" C$ `long get_ram_size(long *base, long maxsize)/ e! S0 Y: o2 E- S$ T
{; S) o& v( ^+ g( e- S4 S4 r6 P: d
        volatile long *addr;- x2 Z- m, V8 g) q2 ?6 e8 d1 [
        long           save[32];
* P& A- |. \# i/ j* C        long           cnt;% A. h; }: z! J" F& T1 X  ]- q/ Q+ G
        long           val;
3 `7 l1 L) w; N* b; B+ y        long           size;
( Q* }: `( J9 Z. {. O        int            i = 0;
. I* q6 K6 u2 |( l7 J
8 B% |8 ~& h: M) G8 |        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {4 D) c: X5 ~. V( }* V
                addr = base + cnt;        /* pointer arith! */
+ j' V) Q- X, A& t6 I5 S5 l                sync ();
7 p+ [& p: N/ A( T+ ^7 C( o" I                save[i++] = *addr;& L3 J3 z& U6 S6 s) M
                sync ();3 G7 Z! U& g3 `" S7 i, F+ v
                *addr = ~cnt;
  ~2 I% D& G* @* c; t        }$ _/ u/ A( E( U8 H" K$ R
' X4 h3 L' g! X# b* [
        addr = base;% k& C/ l" u- D
        sync ();
, F( g5 e5 V6 _' v+ ?" g6 r0 I        save = *addr;5 Z; j' J: S" t
        sync ();% q. w8 \- |9 ^) @  p, _5 I6 P
        *addr = 0;
+ H  I& S1 P' Y  m* H8 _4 [1 G8 K7 Y  n# K+ A1 a) @2 R3 o- I3 Q; x1 @
        sync ();6 N2 \  B) G2 r) I3 A
        if ((val = *addr) != 0) {" z; u  p3 @# w, I  d1 E
                /* Restore the original data before leaving the function.  _5 n, K( N* g
                 */8 Q. Q9 @. |# v* o
                sync ();! p& I2 @  U6 b# M2 M
                *addr = save;
2 X( u$ X, ^2 t                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
3 r& v7 p. o, U% W8 M: x                        addr  = base + cnt;
6 a5 I3 ~; g7 A' B$ I4 L                        sync ();0 X8 u9 u- R# l+ W+ u
                        *addr = save[--i];
5 F# v: C7 G: P                }
. z5 s4 l' `, w' q                return (0);
6 X% a# y6 t3 M  w) R        }( l0 d; q. ?0 h* B+ o

( m5 I1 m# ~0 r' X8 I        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% c0 [7 D" A3 Y) q) c' T6 v                addr = base + cnt;        /* pointer arith! */
& N- a8 C$ o) R$ J( G0 }- H                val = *addr;
, B; Z1 q, R9 X                *addr = save[--i];8 s' t6 T5 M9 Q) N. J+ q
                if (val != ~cnt) {
" T& V: ~8 n6 @" O2 G" X                        size = cnt * sizeof (long);7 P4 @0 g2 Y+ L$ ~2 m
                        /* Restore the original data before leaving the function.6 f# t+ T* I* b. L
                         */
, ~4 h/ s, b  B$ ]                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 O* p* S8 K3 q6 J) ?2 Y
                                addr  = base + cnt;; z! n7 X5 v$ Q
                                *addr = save[--i];
( w9 F- V6 Y% T1 F$ v6 f                        }
& ~2 j( x8 y4 x' p$ e                        return (size);
3 p2 R* {0 }8 X                }
3 e) Z6 P% }4 C        }
) M6 a# I$ c5 T1 R( [. W$ K, R+ P! P. F. D) u
        return (maxsize);0 H% k' g. g% e, H1 T
}1 T8 _9 ~6 m: c. j6 P
int dram_init(void)
" J# n4 O. R/ z# C: _{
2 C$ s5 f& \6 \' |        /* dram_init must store complete ramsize in gd->ram_size */
+ P! {1 P. Y  k8 Q        gd->ram_size = get_ram_size(
; A7 ~9 b% _7 m/ W8 r                        (void *)CONFIG_SYS_SDRAM_BASE,
# ~- A5 a  [7 l0 t                        CONFIG_MAX_RAM_BANK_SIZE);; O5 O) w, U3 m( u3 y- c3 w
        return 0;
, E3 {) G5 b: L: P# v. U}
( R1 c% [4 t- [4 f# d6 W& s5 Z$ d  `+ [- L, h! b9 d

4 e- _5 E# D9 {$ o1 o6 f
4 d; m5 B8 f( a: s( o+ b3 Z7 N7 f$ i& n9 j& _
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& O$ {8 P5 b( f; i# T. o
* u+ N7 t( p7 n" r" A; g
: `1 r& Z3 W4 P0 k8 o" G

$ W8 W0 [2 i+ e0 e4 F5 K0 \, y& d
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-9 00:31 , Processed in 0.040421 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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