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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit# l6 F% ]1 f+ `; D0 i
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
( I/ A; B0 V9 M1 e8 z) F这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?, j9 x% E' V. Z7 W' V& D
3 n. U5 A3 @* f  ~- U: f
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 |7 z, M1 A* J. \" u7 d) P2 |. S# s* C9 `
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:' R) ?( C' S& \' I$ r
/*2 q9 z4 n/ v) F: D5 E9 }, W6 h# ?
* Check memory range for valid RAM. A simple memory test determines
9 M3 V% S- C; c* the actually available RAM size between addresses `base' and. k" n; c6 s: `! X. j. f; S/ s& n7 |) n. H
* `base + maxsize'.
9 }9 _, B4 I/ f& [; U9 G*/
8 w- u. V0 m- p+ E4 o" klong get_ram_size(long *base, long maxsize). c! p1 g  }8 x' @! r
{2 t; o8 n; p( v) O
        volatile long *addr;
) [) M, M& Q% A& F: o; C% d# k2 o$ f        long           save[32];
! j0 p3 g* n# Y& s        long           cnt;
$ K6 Y" X) H- V$ ]        long           val;# D) w9 D3 E/ k
        long           size;
, h; z* z+ d4 W        int            i = 0;' r) t$ Z3 I2 r3 J

% h, b& }& Z; {; k3 @! K; L- ~7 u        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {7 _3 i4 ~, c# m- e4 G
                addr = base + cnt;        /* pointer arith! */
0 f/ E8 n' F7 X$ O7 }3 j                sync ();" b/ k$ \$ q( `. J/ R7 z! z# c. T
                save[i++] = *addr;
, ^- o* k  r$ M/ s" _                sync ();
, G, p. R. |6 X/ E; t8 _$ C8 N                *addr = ~cnt;
, N2 [, k) B  _2 o5 R, f' u$ [9 c        }
3 ?; @% d5 p; N7 F# K/ W3 |3 N# z; ~* J% ]0 {% X# ~
        addr = base;( H" V4 {% W) G4 I, `
        sync ();# F1 C' S' s5 n. o4 I9 O  N3 @
        save = *addr;* ?, A% j0 v" a$ }
        sync ();
: V; G6 k, K% ]$ l( n. p/ g2 j) A0 z        *addr = 0;
4 }9 Z7 |- A9 F4 s8 r
2 F8 r# H* {+ {( e) B        sync ();
4 U5 ]5 D  t: j4 U" k        if ((val = *addr) != 0) {, E9 u/ S, ^) l% I
                /* Restore the original data before leaving the function.. q% ], N( {: V0 O
                 */
2 a$ o2 j( k8 ]: i                sync ();4 R; [! _& Z; H0 v
                *addr = save;
% W  x0 @' L8 K: f# _" S/ \) K9 `                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {, T4 O9 s# K3 i" F7 t8 u8 c
                        addr  = base + cnt;
- x, f3 V; `! {8 o. O% u5 d                        sync ();) s' U% f% G5 q
                        *addr = save[--i];/ q+ s5 i# ?1 ?% o6 p3 B6 W
                }% A  _, c; v8 e: c# a; Z
                return (0);% G& n1 @$ v( l) R
        }
) _$ Z- `2 w7 e1 M# Q  }- `. ~  M8 y
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 [9 V( ]6 a# K/ H                addr = base + cnt;        /* pointer arith! */6 ~2 g0 J: x* U; w6 M8 p. t
                val = *addr;. ^; s& L' W% A) M8 ~
                *addr = save[--i];- l2 @- A  \/ O$ X. l
                if (val != ~cnt) {
  m) W/ G& d  Y" @5 x' f  U                        size = cnt * sizeof (long);: u( o9 r+ l# D1 Y$ ^
                        /* Restore the original data before leaving the function.& _3 W7 v3 J- v  ]3 L
                         *// P2 T: Q% o/ h0 V) A4 I0 g$ ~# V
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* O$ E2 x: a7 s- b' w2 x7 S: n; p                                addr  = base + cnt;# }% s  r  N2 ^6 G+ s
                                *addr = save[--i];3 @7 ]3 M; k' D
                        }
0 G2 X2 V! z- \0 s                        return (size);
8 ^' U+ G5 Y- v1 m7 O                }+ N5 F5 r: h4 t8 Y; E! y, B: X
        }, F" I3 V' `7 g# n" \7 R
* Y6 R4 R; _% [
        return (maxsize);3 n6 Q) O# n; Z1 V" N. T
}. i6 i3 m; z- H; u- g( W+ @
int dram_init(void)
" e* _: g1 m& P& }4 |{0 g; n# A- U  O
        /* dram_init must store complete ramsize in gd->ram_size */
" j: m6 Y4 {% z5 X        gd->ram_size = get_ram_size(% w- m. N: f1 R% e+ j( Y* h
                        (void *)CONFIG_SYS_SDRAM_BASE,4 m. E3 C. s# I; C
                        CONFIG_MAX_RAM_BANK_SIZE);
- \3 T: v; ~- G8 N        return 0;' T# q4 Q2 k! _
}
! }* \8 R" m( \5 W8 k3 ^  u; ~2 [0 n4 v8 q9 _
7 G  e; p' e; [% F: C+ e

; l2 z; L; H( q' N3 o4 r& e1 A& ~0 j6 H2 c0 f
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!& X* z' _5 S/ \6 R# e, q, d6 w
3 C& G) O/ w$ l

" u! q6 I. L# L' @$ r

* A6 }; f' f# Q
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-10 00:14 , Processed in 0.039695 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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