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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit0 r3 e; }" r8 m. P# ^, ~
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
: I, |& e! Q& G. O; u这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
8 ^9 K# P3 |1 m' [
1 R/ [6 E# _% G# e6 n$ t# w% D是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?  Z' U' Y* Y8 d3 h( x1 g& N9 y

9 x/ V/ o5 k4 p3 {* _% U" U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ w" J1 b: ^% w, T7 E' V/*
" o: m& J6 J1 Q* Check memory range for valid RAM. A simple memory test determines
% ~# q! e4 p$ O' n2 `  B1 n* the actually available RAM size between addresses `base' and
) n- B8 C- z2 I) {6 U- E* `base + maxsize'.+ [% T5 Q% q7 v! A+ R* e# W
*/
4 d7 Q- w3 \. along get_ram_size(long *base, long maxsize)# R  _* [+ c% S
{% p$ S% B7 v& A# i$ w0 n" X" _- }
        volatile long *addr;
" n8 d( {( d' e; P. d8 s        long           save[32];* z% [+ A: G7 ?6 F$ G/ q: H
        long           cnt;
* v! r% @5 ]3 }- w& {        long           val;
* q: {& e( K; y7 B4 L/ {        long           size;
$ d2 d$ z. j( [3 f        int            i = 0;
2 k: r5 \# l# l( j0 Y, f* a% W: f6 s: t6 \
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" ^' l2 x; r+ J7 R  k2 w                addr = base + cnt;        /* pointer arith! */7 c5 B4 k8 P9 e3 S, ^1 i
                sync ();9 T, E4 b9 M4 M  h4 [
                save[i++] = *addr;
9 U9 }3 B9 k( ^! s* p. [6 I                sync ();
# B+ W0 u9 t" u6 K2 X% J                *addr = ~cnt;2 x' c: z9 ?! Z/ }
        }
" d! z+ y* E" u7 h9 x$ x
/ R& M# O  n5 d' X& Q5 b7 i        addr = base;/ Z( E- f5 z3 h; c) [( I$ G
        sync ();5 B: j0 I0 ]# N5 j3 _
        save = *addr;
0 D  P8 [! o: t/ [' y1 q/ Z' {  _        sync ();
2 M: O6 \" ^! k# z" v+ d) u; l6 z        *addr = 0;
# c* f; ~8 n7 b7 W% {' W& A. H, G" G- W
        sync ();
- ^. m. s! x) r4 H* J6 z) Y6 `$ D        if ((val = *addr) != 0) {  y* J) R8 w  @! k
                /* Restore the original data before leaving the function.& }/ W* M# F$ R% W* N5 O
                 */
: q4 t% f- v& }                sync ();
# L8 l) ^5 }  `5 e% @) c: ?                *addr = save;
; _7 T  N& ~1 ?% B& b) s                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, \. B8 d! R9 {: h3 U3 @, @) R8 e                        addr  = base + cnt;0 i2 G7 A& E0 [" o0 F4 X! [/ a
                        sync ();* ]9 u0 S9 H  q# j" D2 s" p
                        *addr = save[--i];
  p: U- \6 o+ i0 F* f/ ^  r( o                }' k. {4 M$ C( k+ \! g
                return (0);
3 b! n! `: Q: _+ @5 p/ Z        }% f6 L1 F' M5 {: e. U) `. Y' j

2 ~/ o  S% E* S* e4 g0 i        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- u* N% K3 R2 W( |5 G$ `                addr = base + cnt;        /* pointer arith! */
: u0 m( ]5 N( E                val = *addr;5 B/ k/ x! v; c( u) h/ H/ {
                *addr = save[--i];
! D$ b* T) u; [/ b/ e                if (val != ~cnt) {5 J4 h- ~. g7 A7 x+ J+ X/ q$ K1 H
                        size = cnt * sizeof (long);6 _- I7 q2 d9 h1 {
                        /* Restore the original data before leaving the function.
3 T- w' W5 L# T- G$ r: Z5 \                         */8 d! A6 a% H: j8 G) \
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. ?+ k0 [$ {! @/ p/ D
                                addr  = base + cnt;
! X; v/ t- C9 k4 M/ v) t+ H7 f                                *addr = save[--i];
4 X& s: h  o* k                        }
" ^* V8 G+ f0 g                        return (size);
: s1 d  }4 @# B4 C0 l* t: [                }
0 `6 V4 ^. v5 a        }
; ^0 P& Z+ q" x6 b# B& b
) n  _. D3 E; E1 T) R; ?# l- I        return (maxsize);
6 J# r9 U* l( n" h}. P) `" x0 y. h5 W  C. }9 [/ R
int dram_init(void)8 C/ p; q$ Y& C7 p: k4 ^8 ~
{! P4 U& C" y8 Z3 @2 }$ p$ y0 {# u
        /* dram_init must store complete ramsize in gd->ram_size */4 A% T6 e7 r7 @. U, {
        gd->ram_size = get_ram_size(, m8 J8 H& Z4 ~8 Y  I8 h
                        (void *)CONFIG_SYS_SDRAM_BASE,. B3 r- P/ V! U- W; B9 i# ~
                        CONFIG_MAX_RAM_BANK_SIZE);
4 X0 @0 t' _' |# T- A; z        return 0;
' K/ T3 a) b8 W, d; u( P* d}
8 p  t0 v+ D) ]) ^6 ]& ]8 w& r3 G% S7 N  ?( f& U
! U( s& @3 G; B6 Q1 m

  w. _- v+ \3 V$ O5 S6 j4 \) v- c! {
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!1 A* ^) c6 q8 ?# |3 d6 y

+ J1 B2 _. e* O/ q/ S  Z+ X
8 i9 J" y* s! l( D, L7 Z

" f5 n! u6 F( x: ?/ L# A
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-5 17:08 , Processed in 0.038595 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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