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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit+ \- G+ i) }2 m2 z; I) }3 O& x- F
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
  B4 R1 K' m" h  R1 @4 n9 G% `这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& A/ Z4 k0 V7 D' e: D4 k9 i4 @! v5 K# Q
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?2 y/ w0 [; e; O* e8 D% G/ C3 h

* @; r) [. E! \- `/ T0 p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& ~3 g* F4 h. k  C0 R/*8 |( z' k' L" a: `5 b7 B6 `+ n& @
* Check memory range for valid RAM. A simple memory test determines
" N# x: Q$ j& L& N3 ^& G) Z* the actually available RAM size between addresses `base' and
2 S0 ?6 \( S6 ]0 l) e% z* `base + maxsize'.
; t. h: [+ X0 W! G*/
. }+ {) w4 B2 G4 j# e) z. @  V: K8 elong get_ram_size(long *base, long maxsize)  _0 y4 n/ Y7 O% M8 J# G, ^
{
( }2 f! j! ^1 L! j. t& [6 Z        volatile long *addr;
  l* U0 I. V& ?/ x4 h  o        long           save[32];
% b5 e- ?8 p' v' m9 R5 ]1 J: S        long           cnt;& L: m9 `, r7 x# ^
        long           val;
* f6 E. [8 l. m) G" L6 n# }8 Q        long           size;
- \* Y; }0 [  f7 S        int            i = 0;
8 N0 G# ~8 |4 x7 O, t* A  |- N
, Y6 \* u% L; `3 ~2 Q' E/ e        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {7 b  x$ R0 b& A  J/ e
                addr = base + cnt;        /* pointer arith! */# \" t4 r7 G6 [1 c; S
                sync ();
! a+ f& U# a. b" N- a" w                save[i++] = *addr;
, o1 X2 z) Z- ^5 a+ Z) x                sync ();
$ m) y0 }! o( o* I9 `) H                *addr = ~cnt;2 p# f2 V9 ?5 \; `' B
        }- S5 t: ~) }9 d

1 F2 y  D/ d) l: v        addr = base;
9 V" F2 }8 \! e) t7 E# h2 \        sync ();$ d, d( ]( a: M+ t
        save = *addr;
8 J. D- G; @1 _$ }, G' A        sync ();: w$ z! F% ~7 V" g0 y, e
        *addr = 0;& x- Z' R! @7 r1 p

& ?, M5 J0 e7 d3 @" E' Z        sync ();6 o4 t4 U# A4 p
        if ((val = *addr) != 0) {
/ _9 _- Z) ]1 |0 Z0 F4 k4 ]6 n' W                /* Restore the original data before leaving the function.# g; _/ b' ~$ g- P
                 */, e; V! l+ ]  T( f
                sync ();9 m8 m4 Y' e) C6 o( S
                *addr = save;
! L" W& A  W# F; `0 L% l                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 P& @. |+ g8 f% W: C, H                        addr  = base + cnt;6 h, K: f' |6 u8 k1 k& W1 _. h
                        sync ();
0 c5 n9 ~1 i+ c; F                        *addr = save[--i];9 u2 i+ B7 O* T: P
                }+ A+ M! P. ?0 D
                return (0);
8 F4 M9 o( Y; }- h9 M  [( C, v0 @        }
% J. b0 L* F' ]0 f/ `, F! D* s; ?" @9 S3 }0 ?) b$ R& I
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {! c& F# g1 Q7 j0 t
                addr = base + cnt;        /* pointer arith! */% H) H: `/ n% i' Q
                val = *addr;
% |$ F% Z) L( ^2 h2 V" W                *addr = save[--i];6 e2 X! ]( ^" J- T7 c! L8 r: _1 k( l
                if (val != ~cnt) {
& r  q3 Q) K" S1 p                        size = cnt * sizeof (long);5 e& v; l# K& z7 p
                        /* Restore the original data before leaving the function.4 z2 @4 i* {$ v9 r$ a" K! P) l0 ?
                         */
  s' g, \* z! I0 S& U8 Z$ `                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {4 E. P) h! f: N
                                addr  = base + cnt;" H% _0 ^) o1 N# F! [" \
                                *addr = save[--i];
' B% I* m3 ?2 K# G3 M                        }
" d- [+ e1 L& W" u! _$ x% h# \                        return (size);
) K+ ~  I- ~* y1 ^                }4 C+ l8 l' i$ g. ?
        }3 s; @$ [/ w6 k; v
$ {" X* k" P- S$ J2 _8 T2 q
        return (maxsize);
7 ]/ \+ j) Q+ ~3 \}
; x: Q% r* g6 B& c8 @int dram_init(void)
1 H8 J* L( Z" T! R9 ^) `- d{% O% }1 Q" U8 F: p- Q. N
        /* dram_init must store complete ramsize in gd->ram_size */
( z8 r' e6 @8 m; j& t  {  P        gd->ram_size = get_ram_size(; k% M- i7 }2 r; P2 g7 Q
                        (void *)CONFIG_SYS_SDRAM_BASE,* n9 U  q2 D& P2 w$ b: O3 ]
                        CONFIG_MAX_RAM_BANK_SIZE);
2 ^- N- \' l" T  x1 u( {3 k        return 0;% L' G0 D* u- z' ~
}
+ K- n+ V( ~  p* p0 s, m/ X0 @) K# @& Y

- K4 D& ^  K9 x0 U& M) Y2 o3 O! a+ |, w0 u5 y

- a" x% I# |5 UFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!6 l/ m% ]( [+ S# \

8 S  Q) C' E/ ?* x# N' `
2 h8 d! E0 k0 p

. w/ ]# \8 f& |
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-17 20:43 , Processed in 0.039050 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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