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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit" F* N+ n! |. W. z9 k% O" W8 _& R
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
/ z- X4 Y* g6 Y  _8 B这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?- E7 F# Q2 r$ ~# ~1 o3 X( r/ r

5 h% @  `& x2 s2 l- W是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?/ d1 w& q, ^6 Q" C& t

8 C* D4 S5 u, `
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:6 f" O6 R. i, @5 O# V
/*
% ^/ W/ U( s8 o/ a- X* i' W: C, V* Check memory range for valid RAM. A simple memory test determines* Y* y) u7 G% B! |
* the actually available RAM size between addresses `base' and
. O2 S/ M/ `- J7 `" P* `base + maxsize'.
4 Y6 \5 w* k$ m# |5 \/ J1 y: p*/
- W& C" Z+ w6 K" z" xlong get_ram_size(long *base, long maxsize)
9 J8 C9 s& t' u9 E2 u6 s{
+ \( o1 o) a% U; A; L0 N8 j        volatile long *addr;
+ B$ Q2 ^7 t3 \3 ~        long           save[32];
+ D2 n5 D' {: c0 G# |9 P        long           cnt;& k0 x0 r0 Q: z6 }7 r" h
        long           val;+ Q0 r) ]+ v; w5 U6 P0 [" G7 ^
        long           size;
; Q" ]6 Y2 s$ P& U; \" r        int            i = 0;( d& q9 S  c  L' O4 Z

# x$ h. u" M' V5 m        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {6 I+ `2 \/ n6 g% B' n( I" C8 H
                addr = base + cnt;        /* pointer arith! */
' M" Z3 H( t! l8 E                sync ();
- x7 U) L4 [: ?7 R% y+ r( @+ C                save[i++] = *addr;
2 }" N/ v) `. b4 I& h* e                sync ();
; [7 P" o4 O$ d7 q                *addr = ~cnt;- [6 k1 ]# r0 v4 C
        }% A3 s/ c8 P* n; Q: t# K1 u0 Z
4 n, @6 l5 B6 F  ?" R$ G
        addr = base;: `- ]0 L1 j6 z# r
        sync ();1 C, x7 h* }! z6 d3 S% b
        save = *addr;
5 l% y" C& @  h$ T% p8 X3 V        sync ();) l6 [: P$ Y. Y& K$ [
        *addr = 0;
  L3 _, T1 [, ]  w/ I0 e4 B3 `/ p) [9 _, b7 h, c
        sync ();
; M; \: ~8 l- K1 `) Z! n, E& _        if ((val = *addr) != 0) {
! D4 r6 e# b. e4 p* h; k! t                /* Restore the original data before leaving the function.7 O0 g3 e# x' ^9 ~. }
                 */
6 h9 d! X+ d8 K% x6 ~3 v                sync ();: D) Y. {8 o' O
                *addr = save;: F/ c1 \) O) E- u
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ C* D1 E  q$ J- _/ Z- _                        addr  = base + cnt;. G# X2 g3 w$ V# I9 w5 ~( g8 z, g
                        sync ();
, f5 ]( `2 j0 y# Z& T                        *addr = save[--i];& V/ a/ }- q4 ?- U$ p
                }
, R2 A2 F0 q( R" V. a                return (0);" h* }; x3 ^( u% R# V; ^9 ]
        }
+ }& F& a' f5 Y  w$ P
  z; M3 f/ ~; V3 T$ Z, G        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& `4 {: r, Q8 Z9 s. ^* g, B                addr = base + cnt;        /* pointer arith! */: O) K0 \! B+ @- R/ J2 b  z% L8 _
                val = *addr;
$ Q& Z! ]* J# P                *addr = save[--i];5 C+ b0 ]" y* c* ~1 f2 ^: w- {
                if (val != ~cnt) {
% |  T5 z& G3 J& a2 v                        size = cnt * sizeof (long);
* \( W- f, c# l; `9 z9 I& O                        /* Restore the original data before leaving the function.0 b4 ?- J* g4 z2 X. L
                         */
  s$ j# n; u4 c' L8 _                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- K$ [& n" v  ]# b                                addr  = base + cnt;
5 O! z, B' R& f  R: s: ]                                *addr = save[--i];" P1 N! l* S7 Y6 Q* J2 p- I5 t
                        }
9 a# ~. D, P0 N' _7 o+ `                        return (size);
$ c. C7 v. i# A4 c/ q' }                }0 ^+ k0 I/ h$ u( h0 r
        }
6 R, B+ Y' d/ u; h* D" k
" I8 e2 R! c) }% r8 A6 ]4 P2 ~        return (maxsize);
5 y( W) ]- u. Q* K5 s: ~1 A2 {& E4 d) @}; _' N" a/ I$ D
int dram_init(void)+ b- K1 S9 }" T8 V
{; P& T0 l# v6 }8 o
        /* dram_init must store complete ramsize in gd->ram_size */
) Q+ K$ Y  f. ?  Y7 Y: F        gd->ram_size = get_ram_size(
+ b: ^6 k( \/ T. a                        (void *)CONFIG_SYS_SDRAM_BASE,
$ d% N4 j! r1 J3 d                        CONFIG_MAX_RAM_BANK_SIZE);: p8 k1 l3 Y7 L- m( b- m, Z
        return 0;& r  F, `3 L- X/ k* T+ [& f8 G
}# L! D+ E5 k8 W! d0 D

0 j9 n% v4 V; T4 V1 V4 N! \. F" ]1 D2 u+ _6 Z

7 d6 y3 w. e+ P3 x( ^* b# J/ k9 W
4 _# _/ ], f* }3 a. `: V0 |6 PFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!; ~# u* {) c8 o% v

/ m9 \- W4 P1 [* o$ d% r* ~& u- R6 i' G' A$ s8 L: v0 K( d
7 [, x  c+ o9 M! O5 Q
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-20 08:26 , Processed in 0.037410 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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