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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit, w4 [2 e5 G3 b; s
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
* m' N& ^( Q/ x( q这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?- `# ~3 k- E, e  T* S! i0 k

& _) B6 t9 Q, t$ N1 z/ t8 k% j是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& F0 k- t1 c" }4 t2 i* A* E  w
, m* O/ }) Z2 c% O( [7 o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, y& s, V' h5 z3 E4 V( y/*
$ ^8 ?' y& N  B7 \- B; z* Check memory range for valid RAM. A simple memory test determines" V" Q0 [4 W! B
* the actually available RAM size between addresses `base' and. M# ]! ]/ b+ v* Q
* `base + maxsize'.
. U3 \% H8 G; E2 R1 D7 D*/
. c5 L( t! r1 \3 d" Plong get_ram_size(long *base, long maxsize)3 ~3 I7 J' j- O# q
{
' ], C6 f3 A& c6 p) o: e4 @        volatile long *addr;; T- i1 D0 N! P9 L
        long           save[32];5 v# n/ p. h/ ]9 r* x2 C
        long           cnt;0 j* ]1 u3 ^8 V/ G% t
        long           val;( m- e, q* u; x2 s
        long           size;
6 W7 H. p5 h. z8 R        int            i = 0;# t4 |* `4 j  L

% b! B; t: D+ F; C! p        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {( S/ M8 u  J+ n
                addr = base + cnt;        /* pointer arith! */
$ C; i/ b6 s; s9 g* K8 p                sync ();
0 K) x, l2 r4 _# y- N) v# f                save[i++] = *addr;
4 Q! b2 h* b! z$ T9 H7 v                sync ();
- Q. _( k" [8 v: M* h* a! y- P6 E                *addr = ~cnt;
2 Y* b. E, R4 ?        }
. c. u8 E) W4 |
( O7 V9 l: ~" U6 o" k        addr = base;6 T( V5 M& e* e. r& v! ~; o0 B7 W
        sync ();) |4 o3 h& j' D; g
        save = *addr;1 ?) c1 _9 {& |# Y- S
        sync ();" b% K9 }$ T8 P- q! U
        *addr = 0;
' `2 z$ x* J! ^6 \: }- j8 r0 j) E3 t. u3 r9 X* n$ Z
        sync ();
% _. U+ z* K/ z& C% _1 m& X        if ((val = *addr) != 0) {
8 H4 @0 y& L. c                /* Restore the original data before leaving the function.
! C' j( I6 h" a                 */
) g: b; k$ s' c, F3 Z                sync ();
5 B: a2 R4 m* j) l                *addr = save;% ~3 b2 y, ?  C0 n
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {6 y" Z# \4 k! x. r3 h6 M
                        addr  = base + cnt;! b4 U) N8 ]* B" y+ Z
                        sync ();
4 X  J" \" P, k6 i                        *addr = save[--i];
3 C" e. _+ [. S3 }) U                }
) J' X  X! u9 z+ G6 s, L                return (0);; k" a% k- `% O. |& {# E' f/ ]$ o$ ?
        }
* U1 n2 z0 y2 n2 N0 o
8 S) {  {9 _9 a( E3 h' P6 J" y" V        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( C; ]+ r+ ~2 N( P$ [) [                addr = base + cnt;        /* pointer arith! */: g: R0 x1 T/ C9 e: g* b2 G9 B
                val = *addr;
9 R. P) V% O( V1 q                *addr = save[--i];
( Z7 S& ]  W9 p; j+ I! H                if (val != ~cnt) {
& C. U) s: g# l+ y                        size = cnt * sizeof (long);' Q# l! }2 `3 }- S( ^2 ]) B
                        /* Restore the original data before leaving the function.5 ^6 S& O: a* }  u, I
                         *// q( l# U, Q2 S* l! K
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* r- N9 N) o) D& G% p  q6 S% |                                addr  = base + cnt;
* ~& L# u. c5 I& W& t                                *addr = save[--i];7 _5 }7 J7 A! q; H6 S" A' }
                        }
1 J, q4 N( q8 W" F( J& j: Y. D                        return (size);
  f6 ^; D, T% w                }6 |. z: x, S: k: z/ ~
        }4 {2 j0 w4 A$ A' I; z& |! m/ o* r

; ~5 r7 {! x4 }; h+ W8 p        return (maxsize);) v8 R4 K2 u8 M/ O* U
}* K: g+ p0 J) v6 h* L7 F0 H
int dram_init(void)
) N4 i- h8 X! |3 `* [{. O' c  K3 u# q7 d7 x( _/ F
        /* dram_init must store complete ramsize in gd->ram_size */
; P" U" f7 p3 V        gd->ram_size = get_ram_size(* P8 u( {& s/ {! o) e8 Y2 s* X! z
                        (void *)CONFIG_SYS_SDRAM_BASE,: A1 ^2 S6 ~$ }. o: Q* s0 f# e
                        CONFIG_MAX_RAM_BANK_SIZE);$ h4 J  {" |! p) |! v( Q8 W
        return 0;% D  o% W" t- ^- ~1 |
}
6 D/ f6 Z: D# M8 A" V7 l' F1 f7 p8 E

6 z7 j- M& p( |" Q! m$ q9 V
; F, M9 d+ t, y. x- S' d8 H8 L  U6 y! f5 {/ R2 _7 v
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!5 T- _8 Y7 [1 |
' D1 L% |! R$ r. K/ V/ v

9 r! [. g% g' `$ S: t/ Q
5 V8 }1 v* t9 O  _
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-18 00:01 , Processed in 0.038644 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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