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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit, X. k; m" J2 |- r1 I# o
核心板2:DDR2 256M Byte   NAND FLASH 8G bit! R) ]+ b2 B5 Q- D# f- [
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* o9 x2 [9 y" c: a/ a: @% i! ^3 @& m& B
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?6 ?% f0 ?& T# B; d  k, C
# ^* I' z: O0 m3 c
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:( V) j: _4 q" N/ n$ ?
/*
9 Q8 P- z/ N/ d' {( W3 M* Check memory range for valid RAM. A simple memory test determines
# ~2 R* `% _* u9 s- L1 x% p. }7 }* the actually available RAM size between addresses `base' and
8 d$ Y) M. I* `' |* `base + maxsize'.
3 Q, s0 }& p! h* [*/9 B' S% V; y4 A4 w& q3 ?5 Y! n
long get_ram_size(long *base, long maxsize)3 a! d/ J/ q% W5 _
{
6 {! v, ?3 f( J2 M! N8 d1 y$ z        volatile long *addr;* j& D7 f- C" I- d- C; n
        long           save[32];+ l, p- ~1 m% }0 J
        long           cnt;
# e+ \- k" L% Y7 G& T" F        long           val;
6 N% F  Y; E; ~1 T3 T        long           size;
* X2 e* o& U$ I        int            i = 0;' C# l5 w6 `( V# E

6 Y* T8 N1 {0 p        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ s' D4 ^0 x2 |/ \8 S! Y7 _                addr = base + cnt;        /* pointer arith! */
3 t; P1 }/ n! q6 h5 ~3 Z1 r                sync ();
3 ^. M) b( H4 ?% v5 w3 j8 T                save[i++] = *addr;
6 k, k. m9 M6 v                sync ();
3 j* N9 u. G# W. w; e                *addr = ~cnt;
0 X  E8 F0 M& ]        }& k/ T- M1 q; F/ w, o9 X

/ ~9 Y! e2 W" y! g0 }8 W( _        addr = base;7 r6 n$ Y; u& L5 v8 U
        sync ();
( {! O" S8 e) y2 A# @  W/ p- e7 [        save = *addr;
0 s" k: x, E# U; o1 j7 F  L        sync ();
9 Z8 g: ?* S4 N( i9 c        *addr = 0;
$ `8 b* p0 f; V) K# q: J2 Y* E+ i7 v3 ^1 `' X  B4 ~
        sync ();
, O( m6 J5 U! M        if ((val = *addr) != 0) {
- }# r; ^, b* p5 k( f1 `                /* Restore the original data before leaving the function.
9 t/ u5 F: v: h. `2 z                 */
$ E! B' ]2 B" u  a) T                sync ();  }/ H, P+ R; k5 }0 \
                *addr = save;, i6 X/ T; i7 B: S. W
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {7 H) J' {8 u9 L% ~- c
                        addr  = base + cnt;" [6 |$ x5 N6 i
                        sync ();( S  P8 ?3 b% P' l; M0 a& }: H( q
                        *addr = save[--i];+ G! Y4 g5 o! ]. N) {) ~5 ?
                }
; y" e& A5 k+ V; }; k' Z                return (0);* y6 N  S* j9 ]. ^( \# R9 ?, m
        }
  j9 L* n) l, @& u$ K5 C% l* {- F; E& K9 y# Z0 d
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; K4 [& l2 g2 U3 y2 Y6 b
                addr = base + cnt;        /* pointer arith! */5 o, g& r1 C# k' t& }- }. x
                val = *addr;
9 `+ [8 I0 y1 l$ K0 Y                *addr = save[--i];
/ r5 {4 y  _* n- Y                if (val != ~cnt) {! E  r9 u5 u) b1 h8 }2 p0 R3 B
                        size = cnt * sizeof (long);9 N! C5 C- l+ B+ N
                        /* Restore the original data before leaving the function.
: W0 q% l; E: H2 o4 v5 S' U                         */& e5 x# l; C' G4 R# j% k
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {1 w7 U7 z0 q- k, Q9 o8 U
                                addr  = base + cnt;6 b, j; g' Z% Q, Q7 M# v; b$ ]3 w
                                *addr = save[--i];
2 X- y" k6 v" F& L4 }+ g                        }9 y" B, O( a, I) I/ y) T, z0 b
                        return (size);3 m7 e9 A  a' j/ w4 I
                }' `0 I7 r! U5 \3 ^5 m( I
        }
" c* V9 q, [3 B& n* d" c; l/ _0 ?
        return (maxsize);
1 \7 T; ~! E+ y$ Q( C/ _}
8 c. f, ^, ~% X( W/ Gint dram_init(void)
5 g: }( C1 M' Y' N$ ^4 X3 P, N1 p{
+ Q+ @+ Z& V  B- |        /* dram_init must store complete ramsize in gd->ram_size */7 N+ B6 s* W1 G0 L' L
        gd->ram_size = get_ram_size(
  t2 [' s, @; b$ ?9 p9 v1 Q                        (void *)CONFIG_SYS_SDRAM_BASE,1 U/ v, ]  [- @& v: s
                        CONFIG_MAX_RAM_BANK_SIZE);. G+ a2 Q7 H- n' N9 x! F1 r9 F* ^3 L
        return 0;
, Q4 g/ g1 ^  Q3 K}& D8 C0 N+ M7 E' X- w3 J
( A" f, L- |* ~
/ n' T$ i" P- j8 y4 n7 [

' ^: M5 M; x$ k8 P+ v2 |/ r; w( c) p) h" L% R& f3 K" B
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!  v3 I: @+ G9 Y# M" T5 e

# L- F# S$ y2 N7 E7 D* W" G: t5 ?/ [$ n: Q# }
" N6 V3 S9 ?: @# `* C
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-8 22:07 , Processed in 0.039576 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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