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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
  m$ ^6 y  O: K6 H0 }; E# w8 A0 ?核心板2:DDR2 256M Byte   NAND FLASH 8G bit
' _$ V5 s  E2 d+ @这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 m5 a; |0 d9 ]! F2 j2 f' U  ?0 ~1 ~1 k1 H! J& A: ?0 S
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?1 T; [: ]3 ]2 J* d9 k4 }
4 s/ d. e/ c. D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:5 S. z+ Z9 i% U6 q, x
/*
2 c8 B. `, E! h; n/ `. c* Check memory range for valid RAM. A simple memory test determines" T0 b: f. I: _8 l/ f4 v" K8 V
* the actually available RAM size between addresses `base' and- J- L, _5 Y) r* g
* `base + maxsize'.! Y2 \& {! G# v  s
*/8 ^% v! M9 L, H: I% N7 o
long get_ram_size(long *base, long maxsize)  S- m% j" O0 Z! Y# E+ [. u$ }" i
{! r* q, H$ @/ A
        volatile long *addr;$ T# W; X2 i3 ?/ S# j
        long           save[32];
4 p: j( G+ B* B( U- y+ V9 E        long           cnt;  p) P% d: N. s; c3 P( z& n  r! Q- N
        long           val;0 o* x7 ^' P; F, {
        long           size;$ g* L! {$ t5 f: F" i) `2 w
        int            i = 0;" u4 N' K) h) O' e) C
9 D: @) a- ]) c2 v) t2 S" u; x  o
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
  [3 B" m3 I+ s% N/ l  _                addr = base + cnt;        /* pointer arith! */$ E. K2 J5 G7 }9 X- `) ~- a8 ~1 G
                sync ();# d' z3 }: M+ b' k! d8 o( v& q
                save[i++] = *addr;
5 ~: D7 ]9 ^. r" K                sync ();
. W7 M& x  s! B# l$ h2 B& V  `# [                *addr = ~cnt;# v( N& H5 e. p$ O+ X
        }4 L6 f, T; V' F# R( B

- t3 j6 x9 F) O; ^        addr = base;, b7 i% E/ E0 b) H7 @% T
        sync ();
! ^  D( R" K2 i; D6 }1 ?        save = *addr;
, `$ d1 T( [8 m$ ?+ |9 p        sync ();2 E# G1 L4 z. g9 k9 \  f* g
        *addr = 0;
; @3 h8 \2 U. U! G0 |6 i! u2 p6 B! n$ [9 t+ a. Y  H
        sync ();  S, t: R' C# A. E8 }# E7 s$ t0 b1 ]
        if ((val = *addr) != 0) {% @% T0 t* ]  e  u6 l2 {! q
                /* Restore the original data before leaving the function.
# s2 \% V6 `4 ~8 o2 `& W5 ?                 */; U9 W0 P, ]; l* f& F- P
                sync ();2 L5 z) O) P5 P  L# j# Q. p
                *addr = save;+ F% T  V1 q. a% b* h% @1 w
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {8 ?+ D1 n9 X1 S7 M
                        addr  = base + cnt;3 Q4 m8 V5 U* G1 z
                        sync ();
# k9 e" S7 }& S: r  P2 q                        *addr = save[--i];) \8 \1 i9 D! z4 O
                }
4 z: R/ H( n/ v5 m/ g2 W( R: Q/ s9 g                return (0);
0 P. D# _7 t8 P$ T( V  c; z0 m( H3 N. ?' b3 d        }
' h% i$ l5 E: g. M
0 d& Z- d+ a9 x2 p8 c        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 N3 ?% e. h, ]* [5 x, k                addr = base + cnt;        /* pointer arith! */
$ i8 @# z; f8 F; C                val = *addr;, Q$ E6 M3 L0 B+ J
                *addr = save[--i];- g1 B* E5 Q  R' `# h+ `1 U, u$ _
                if (val != ~cnt) {
5 r2 F' ?! _3 y: Q& `                        size = cnt * sizeof (long);& }3 i! T9 o: x
                        /* Restore the original data before leaving the function.
/ F" k' b2 ~( A$ E                         */
9 M8 ~. ^1 w% F0 c; E                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; |5 n8 Q6 `. ?                                addr  = base + cnt;
0 _0 d! B& m6 t2 W9 T7 q                                *addr = save[--i];
: [" N3 ?) [- k- ~$ x                        }( E0 ^; ]; Z) W- _' J) R
                        return (size);" x) D- J$ E5 @9 W) R
                }+ \% m7 E5 g/ P% w
        }
. G! @; G$ V- W. M- p% E  {, n; y
( b$ G9 z+ F* t4 ~  q        return (maxsize);
' G# @# K" p! d7 h8 g0 p5 T: P}
+ H' x3 `5 C' I4 f' n. O( ^int dram_init(void)
! i  M; {4 u9 X4 y. N4 N{' J7 K( h4 T1 h" ]' {6 P% ?7 c
        /* dram_init must store complete ramsize in gd->ram_size */
  p# I: x7 Y0 f) @2 z+ C        gd->ram_size = get_ram_size(
* l7 H; {) o+ u) P                        (void *)CONFIG_SYS_SDRAM_BASE,
3 V0 H# W, q+ x) O2 `, i8 |8 l. m                        CONFIG_MAX_RAM_BANK_SIZE);
+ \, n1 ^2 t3 J4 w& @        return 0;
) m0 T$ Z: M8 L" Z2 ?4 ?) x" H}
( F, N5 S0 Q8 W' h7 I
2 {% i0 c0 S* A# Q$ O' ]$ t2 b" t! \" \* O: s! u* a0 r

2 R9 u4 {) u4 b  G: d' K) S" L. n2 b0 a% n! S/ R9 t
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!! \: y9 z: s, A( u! B( D
; x! e: t4 `0 m! p$ z

# L. p5 _( e/ s( P7 B  ], |8 _
0 z* ~4 b4 ^- u: b& h" u6 r
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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