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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
& ]; L9 Z  `! J& m  Y: s3 l  y核心板2:DDR2 256M Byte   NAND FLASH 8G bit
4 I( p( i# X; i% L, V这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. w/ ^& p& o: _; k' z% X" g
. p( L% d6 Q1 s# P/ l是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% X5 ~$ q/ p/ d( s/ K
$ A& K5 b3 w, M, D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:. U. k1 w, ~# S4 z$ _  y  }
/*
# k& @+ ?4 o6 b; Q: P. T* Check memory range for valid RAM. A simple memory test determines
- l1 `, ?7 q2 Y4 T* the actually available RAM size between addresses `base' and
) v7 O! S: d1 v* `base + maxsize'.# j# s( h  ^% A$ D# R, B4 u
*/
( Z/ m4 X- W1 `- S% m: k0 Y* a! ]3 nlong get_ram_size(long *base, long maxsize)
# |. D! e3 M. C7 N8 M{
" E: Q, f; W2 p" D7 R1 l8 C        volatile long *addr;9 r- g3 k+ T8 `  X% e
        long           save[32];
. \$ D: f# c. R2 d- m        long           cnt;+ z5 j; T) P1 Q% S* j9 J; l8 W9 }
        long           val;
; j  ]+ g" }: u$ m        long           size;
- x/ L8 i4 S( l  V& L: {9 R        int            i = 0;' G; d2 ^( n! N4 e  V

& A3 e( R( Q2 m: s6 l        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {% b  _3 D. E! c- K* t. Q
                addr = base + cnt;        /* pointer arith! */
) U8 `. K) w/ W5 t' \& y' f- F, m                sync ();
$ n8 r1 N* u% A5 @6 W$ P) _                save[i++] = *addr;
# q) F6 t- z& @; w8 K; N                sync ();
5 Y/ m5 H* b1 l/ E4 ?9 ^% e                *addr = ~cnt;
! E: K+ D" I/ E& f4 @) l        }5 c% ^! B% y4 k  H/ j# w

$ U9 k& n9 n/ u! K+ D) g        addr = base;
8 a' D6 E" j. F  g! k+ d. k        sync ();
+ H0 h( s) A8 g; ]+ @- m7 {: z( T        save = *addr;# h* F/ E  E+ ~) e3 I& n/ [
        sync ();
0 T/ Z+ J# o8 p/ k- M: q) }        *addr = 0;
2 r7 @& m  ~$ X0 `
" i5 J. y9 u' m3 c( R) R0 g6 V) Q        sync ();! i5 b/ j* x; b
        if ((val = *addr) != 0) {8 A! n3 w* w' {$ K; ~3 |: w" x
                /* Restore the original data before leaving the function.
4 ~6 G; x( E, [3 Z; g; l. k0 A                 */
' N- d0 h4 J- }# z1 i5 @% _- ?                sync ();" S, V* c% U& ]9 k
                *addr = save;0 |' u. e" C/ L# l
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {& ~! N  |+ @$ A* L2 b# t
                        addr  = base + cnt;
4 W- P+ w% K+ r: B$ M4 k8 ]                        sync ();# a8 S3 R% X  B1 Z# _4 s
                        *addr = save[--i];
/ f8 H7 f6 ?  _0 P                }
! ?, s# M: n' W! {' l                return (0);3 Q  q% u& V3 c% Q) x) u. O5 J( C
        }
9 l2 C" F/ h  W# m
9 v( j8 \& u. F7 S! w$ p, T        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ ^. N8 J" B# C+ d7 c1 d
                addr = base + cnt;        /* pointer arith! */
) g, b5 ]7 Z( f' D0 H" n! ^                val = *addr;: W- R' D! `( o# Z$ A
                *addr = save[--i];) Z7 l( G" D# W. C/ R/ Y
                if (val != ~cnt) {
3 y; F8 f6 \+ n" a* R1 [( y                        size = cnt * sizeof (long);" a/ G9 P1 G& @2 b" E7 F
                        /* Restore the original data before leaving the function.
. u4 A) R  s3 _  G7 T* G  B                         */
; [8 G% j8 d  p1 ]. {                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ \3 b/ R; X/ u* A. R! H! \2 [                                addr  = base + cnt;
0 s( z- `6 o. \3 k( p' a/ n                                *addr = save[--i];; k6 o) h+ n$ R; t
                        }& B( h0 c: `; s- Q
                        return (size);
+ U4 j5 A0 t* p  Z                }
- x0 A3 z( A. f- S* @        }
2 \& R$ w  q% D! a0 o1 {  p( z+ y+ X4 F1 z2 T1 ?$ U4 A
        return (maxsize);
  i. `( p8 ?: R- G; O}
% q& w9 E! E, r" G/ zint dram_init(void)
1 O$ ?7 Y5 q( `( |# E* o8 \{0 \# d3 k) k; R+ @2 O
        /* dram_init must store complete ramsize in gd->ram_size */
4 A$ G0 V5 Z4 y( u1 ~+ o        gd->ram_size = get_ram_size(% M" D) T! ^. h
                        (void *)CONFIG_SYS_SDRAM_BASE,; h1 E- H4 P: j3 F, q) `
                        CONFIG_MAX_RAM_BANK_SIZE);
3 X& D8 g, G; c% t- t# |        return 0;' e' A/ z+ f* ?) s/ Q
}) ?" w8 d9 }8 m$ d/ S
# j2 j% s2 {) O4 i" f2 _

) l, W9 p' l0 C- Y) A( O8 k% X4 k. G! n

* L; P1 G% M$ B( mFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" z6 w# B0 K! A! y" d, T2 d
: Q; p5 s' B% _. z/ `8 a6 ]+ x2 b9 B& ]0 S( v: |0 |1 X

! A9 F, ?7 w0 d! x8 C
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-9 22:13 , Processed in 0.040370 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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