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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit$ q5 X, w: F) v- @
核心板2:DDR2 256M Byte   NAND FLASH 8G bit  u" }) N  F5 [' T
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) [( }) I) @& |1 S! p- w- k0 f) ?# x' O& U
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
, z9 z, M/ }! u2 q' b! p
  V$ w) x1 d8 A9 w4 L
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ X) o9 T/ f; b8 M3 N/*) h0 v( ?1 J; p4 N. [7 w
* Check memory range for valid RAM. A simple memory test determines
% T- h1 U! p, ^* the actually available RAM size between addresses `base' and( c. |! i' _- P& q4 |
* `base + maxsize'.9 ]8 o3 h0 l/ t$ ?7 o& a
*/
7 m2 D9 Y/ G! P' ^# c0 ~, Xlong get_ram_size(long *base, long maxsize)
7 w" w; N& r# C( Y! R' }/ P. j{
  @( `$ w( ^: B/ O) f9 j6 _        volatile long *addr;6 B" T  ]% M& I0 L4 |
        long           save[32];9 t5 {! a, ^- i
        long           cnt;$ W- U" c5 Y* E$ l$ {- {" f$ Q
        long           val;
6 a* }1 C1 n  [: t) r. i        long           size;* @5 X2 x1 c6 J( w
        int            i = 0;8 g8 F2 B, J1 z1 y

; @" H6 ?$ E7 }/ U2 X        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, R/ G3 D2 I% ^6 F) {- W) y                addr = base + cnt;        /* pointer arith! */
! d2 W5 j; \+ W& {# T                sync ();5 m& O% J' r! ?" S2 ]' K: A
                save[i++] = *addr;
& Y! S* T) Q3 a1 x' u                sync ();
. g% m; \) A8 ^6 @* L                *addr = ~cnt;
( w8 C/ e0 Y$ y' G# p4 i        }) h3 A' |2 g3 R4 c

& f7 y( G; t/ M4 T. b" V        addr = base;# h! D; \' T, E5 f2 b
        sync ();. N/ V$ m6 A- e5 V. F. ~
        save = *addr;& _8 u8 j; u8 r2 t5 w/ e4 M
        sync ();
- ^3 {8 _3 m2 Z0 e. \        *addr = 0;# a& j8 i0 N. X; B! G

& n3 W( e& R6 R, }9 O$ z& d        sync ();& {* v" P( p$ G  Z+ ?. ?- Y% z0 R
        if ((val = *addr) != 0) {) o% H. F# `. F1 E( V6 J7 \
                /* Restore the original data before leaving the function.) P1 E$ `3 o- H6 E9 J% U1 S
                 */8 o& Y0 _' N0 q( ?; x
                sync ();
4 u; V' N7 {5 w& N7 G) e& x                *addr = save;1 j- k: n& _5 Y
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 \5 `; d2 n. S$ V. m# e) g4 J                        addr  = base + cnt;
( k3 ?/ a* [4 N& j0 n: L+ B0 \! T4 W                        sync ();6 b" G  W. S% M4 k% ~0 X
                        *addr = save[--i];2 |+ p+ x3 ^9 F
                }) Z* P# M6 z% \% O! o
                return (0);5 |! g- B2 W- T9 \
        }6 U4 X% V7 h. L+ G1 {7 R; a

, D( X2 c! z* N" ^0 M, A1 Z4 q. a        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* S# k0 g$ z0 E6 Z6 V8 w
                addr = base + cnt;        /* pointer arith! */5 H0 D5 x0 {8 F. G
                val = *addr;
( r2 q* r* a3 n' L2 q                *addr = save[--i];
% t7 M8 R5 I& h9 w                if (val != ~cnt) {2 s5 G- f3 |, w( \% b% g
                        size = cnt * sizeof (long);
& C$ h' ?9 D6 n6 w) b                        /* Restore the original data before leaving the function.
" u+ M& d4 k9 p7 X0 ^6 `0 L                         */
9 i0 a* N! F) S  t' n$ ]. {1 a                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: e( z; d6 W! D# _5 D: q' \( S1 ~, ^
                                addr  = base + cnt;
4 l6 \9 w. y! r1 K$ W) k3 B+ \                                *addr = save[--i];
' P. d" |! b- K                        }
' J; F  a% F; {2 q7 ~$ N                        return (size);6 |9 C# a" S. c( t: ^
                }
  m" A/ {6 Q0 t& [        }
  R$ E3 f6 h* Y6 Q0 C, ~  x
3 T0 Y2 j5 a% B2 `( X        return (maxsize);
# K) f8 U% B- \/ d& ?' L/ O* B+ A}8 m% p$ a- i: V: r  k  |: d# g
int dram_init(void)! X" `! n+ K4 ~' e0 ~9 r3 H5 m( R
{) z7 r  |, @* ^0 j
        /* dram_init must store complete ramsize in gd->ram_size */
- g( T$ d. _: b! J) \% j        gd->ram_size = get_ram_size(2 s; t2 |! n6 K* l. |( Q
                        (void *)CONFIG_SYS_SDRAM_BASE,
" P# l% ]) Q# S: c                        CONFIG_MAX_RAM_BANK_SIZE);
- i" [# M4 _7 o5 O8 e' @! |! V        return 0;+ k3 x: F& @$ d5 b0 Z1 F% P# X
}
0 l0 T/ E- p! `* a3 |
. A; ^7 z7 k  j: H: ~
" o0 t5 ^  ~' ?) d1 W. E
/ W- I6 u, p4 e
# c0 v/ g; D; {; V9 YFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 [8 {5 k4 k& H. I: q
+ o8 K; j( P$ ~- q( u) I
, q/ V% \) h% B+ E5 N$ l# `
0 d' U. S. E' }2 H
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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