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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit$ E- J7 V4 a* A( I, ]0 ^2 b
核心板2:DDR2 256M Byte   NAND FLASH 8G bit2 c) K. a. i: y8 h
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 L5 Y7 C8 f" A2 }' H( z$ ?; p' x2 s& W8 H* K' W& e
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. D: ^& [9 l4 a, N! [3 ~. l2 n; t6 \1 D- ~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 ^) \& q1 \& E+ B; i: ~0 U; e/*$ S+ f" P" `6 G! w" W1 u
* Check memory range for valid RAM. A simple memory test determines
/ D. }6 O  E* O2 H3 {* the actually available RAM size between addresses `base' and8 t- U( {" Z1 z& r6 F" o  Z  X" i! k
* `base + maxsize'.
! G# {; e. }) g# I4 G4 v1 ^*/# k/ k0 T  D  r5 z
long get_ram_size(long *base, long maxsize): K: ]8 h" |6 l9 V7 g6 e- C* a
{
2 h, O+ a* a( C- X! b        volatile long *addr;
" f' V6 ]6 p6 G, B/ D4 z        long           save[32];* P3 w" J0 j6 J
        long           cnt;
) c8 h: ^( \( Y: d9 U  F& G        long           val;
1 K( k: d6 j; C) h9 \0 E, A4 F        long           size;
5 X. l1 n+ B& {2 P        int            i = 0;
. r( `0 b* I% m* J' h7 p. B  J5 E' [
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {7 T! B3 `  v+ \  a3 w
                addr = base + cnt;        /* pointer arith! */3 k, W3 t1 B; N  Z( c/ A4 T4 H
                sync ();
! R/ F, z- {+ t: Z6 y# X4 Y. F$ B- Q6 {                save[i++] = *addr;) {& W1 F5 W' b! ~0 [% t
                sync ();
: G+ p2 ~& ~8 [: d$ K0 m/ g                *addr = ~cnt;
. b: w# E3 |8 C$ T! L        }
9 G" `7 M0 i3 c! M( |
% {+ `# N5 S) `& i: w        addr = base;7 R! `9 Z3 ^! z& Y5 i2 R
        sync ();9 w( x4 A4 L" `0 n8 f
        save = *addr;# u7 l* m7 x1 q: a
        sync ();( K) o4 i& \% K( R
        *addr = 0;! t! A: d6 J. `* |5 V

5 j: K- p3 T) m5 d        sync ();/ p! Q( n+ {0 s- @  J
        if ((val = *addr) != 0) {
% G% U7 S" }6 |% I+ b( I- i9 |                /* Restore the original data before leaving the function.
0 ]# ]7 Z* u8 A                 */" r8 M- U7 g6 C+ H) }& `& X
                sync ();
, i( `) z0 O0 x& {% t                *addr = save;# S8 X. j9 v8 D3 D
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: ?8 c# ~- [. Q" x1 Z- Q                        addr  = base + cnt;
' R' T; @1 ~+ H% g4 n                        sync ();
$ `/ z0 y# J, A3 h4 a4 n                        *addr = save[--i];5 B3 a; j! X( B5 v1 n1 |  R
                }7 R% L4 ~: A( a7 c  q. Q! q
                return (0);
0 p' M9 w" E8 f/ g% U1 x        }- \& d+ q0 w3 u6 |- \- X
7 b7 L4 m5 c+ ]' b4 H
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# ]: F- }  |. k  t
                addr = base + cnt;        /* pointer arith! */) F  K% N+ N6 ?
                val = *addr;
9 x& F3 q, O4 i, Z                *addr = save[--i];
0 m; n# H, r2 O4 G7 \                if (val != ~cnt) {
4 R* C% m9 d4 t                        size = cnt * sizeof (long);6 [' i. a% M0 a, D
                        /* Restore the original data before leaving the function.
/ Q3 B$ ?# q% V: j$ o                         */8 h; t2 \3 J# k/ Z! g
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) I9 ^  p& S8 d2 H" @! _5 c                                addr  = base + cnt;
: Z/ S1 G. b* u; H: v9 r, c' P                                *addr = save[--i];$ u( F: E- r7 t" H: k
                        }+ Z+ L, U8 s, Z, W) V
                        return (size);
8 f  O/ o! I5 E% g! H5 c7 z( i                }
! d: T7 R3 }( J        }
; w' C& N6 Q3 i% w* s( V% J/ `  q% h$ i" S* B7 `) m' _2 u
        return (maxsize);# `; h. `0 b1 Z: v) _0 @
}
- {% u/ e( r3 g& S% ~0 R0 Yint dram_init(void)/ `' {0 B- J" [1 f
{& m  S2 T/ I+ F. H7 z( B
        /* dram_init must store complete ramsize in gd->ram_size */. w6 x. d2 y) [
        gd->ram_size = get_ram_size(
9 p3 E& J2 A' H% t+ E- I- {! I) `                        (void *)CONFIG_SYS_SDRAM_BASE,
' E5 o9 s$ n+ |6 @2 z/ F2 N- j                        CONFIG_MAX_RAM_BANK_SIZE);
9 ~8 W! W4 a3 }( k        return 0;
9 U2 {9 R8 D; p1 w1 b}# J' c" u  H5 a4 m
/ U- V1 {9 b+ R1 z) j1 }7 s5 r
* B. s) ~! c6 F0 q3 r, P

! }! i6 c5 G; K0 x
5 x9 ?* \# u, b5 ^8 yFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!1 F: p# u5 Y: X7 P8 k
( j# ^& P: k0 b9 e- I% u9 f
- Q, w8 T+ p9 A, M' W7 b

- E; G# s/ X; k- t
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-6 13:17 , Processed in 0.038595 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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