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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
& w0 Z, g# k# w7 g1 X9 {5 Y* M核心板2:DDR2 256M Byte   NAND FLASH 8G bit) f$ i5 F# Z8 t5 v# j
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?& u& _1 O3 T$ R# ?0 B
. y# S1 y8 ?0 U8 A/ [7 s: a
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?2 G, q/ H; o, L1 J, f

: {) e1 ]+ ^+ U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( D% l% A, w9 S0 G/*
6 q  n8 x- M, J# ^# [' a; P  F* Check memory range for valid RAM. A simple memory test determines
* B4 M5 n. n# b7 _! S& o* the actually available RAM size between addresses `base' and+ \  q% ]" N: T1 q8 {6 K' _
* `base + maxsize'.
4 \6 S8 y* n7 y+ f9 t) m$ f6 r; \8 X( v*/
* F* n+ j" j* e- J; X( g: Ylong get_ram_size(long *base, long maxsize)2 B6 R) V( j1 T; k7 r
{7 ^  Z+ _2 G/ Q. p
        volatile long *addr;
6 a- W1 Z$ o9 ^6 b' ^        long           save[32];# H4 w" w( A% L! p3 B
        long           cnt;1 R7 G9 R* T0 q, |+ {
        long           val;  ^2 i' p" M6 W, \3 D$ E
        long           size;
9 z4 N8 @2 F7 y        int            i = 0;
8 q) y& |% U- d
: x0 P6 j" S& f        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {4 |4 |( B$ l. y- ~$ H7 X, m* x7 E% |/ ^
                addr = base + cnt;        /* pointer arith! */  d1 h# {$ c: |
                sync ();* I7 M! F" A  b) N+ A, N! I
                save[i++] = *addr;
' u5 O2 e; N4 J3 }$ z                sync ();
) ?; O2 |3 c3 H+ U$ n- q                *addr = ~cnt;
+ S( f* f- K2 Z, S# o3 k        }- f" ]: i1 J- \) v

# k- D1 }3 H' s        addr = base;0 [" ?" r9 P* j+ [/ L: d
        sync ();0 r: G8 d6 F' H1 A2 p
        save = *addr;
) y2 b& Z( l+ ^; c' I        sync ();
/ r/ \2 b  Q5 q4 N! C        *addr = 0;8 i3 A1 H; X8 M) I( H0 ~. E
2 w" G* I- }" M! `. V+ ^
        sync ();
" r* n- D+ N- U! ?% V        if ((val = *addr) != 0) {- P! m/ D7 q0 n& t0 |# h  N
                /* Restore the original data before leaving the function.
+ ]7 y; q! S8 u. \# q3 k+ z  Q$ F: u                 */8 |3 h7 r8 l/ f: B$ s* w9 P
                sync ();
. ~. P$ c6 a! }- \3 o! X% @7 j                *addr = save;2 ]' {$ D) F8 |* b% T$ j6 w
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% T+ v5 W8 U7 A" ~, B7 v+ W                        addr  = base + cnt;
4 C: @8 @; g1 r/ ?; s& P                        sync ();
" _1 |! d' A3 C                        *addr = save[--i];8 M: w3 P1 o% H2 O2 a) p, L
                }$ ~; f* y! ?7 n8 l' m' E2 W
                return (0);6 d* q) B2 g5 Z) o# A
        }
: t& R" K9 |8 T/ e! l. @% Q% H" {( g5 }) |% Y
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# R7 K- }! S5 x. w% M: L
                addr = base + cnt;        /* pointer arith! */
6 }' Q: n# A5 d6 q                val = *addr;
; h/ `# K. c/ r- ~                *addr = save[--i];
% C& ]" {  I# V8 h( h3 f                if (val != ~cnt) {' d& Q# J: [; D  Q5 U
                        size = cnt * sizeof (long);
4 A+ D7 j, R5 ^7 f2 X4 h+ M  D$ p                        /* Restore the original data before leaving the function.
# Z3 R2 {3 ~# F) l8 o                         */
& X  H. J6 }2 q( Y0 R2 Y* s% m                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- b- b$ ^& g* s, T0 d- U: a
                                addr  = base + cnt;
9 U5 G* H: Y% h( d! P5 ~- ~( s                                *addr = save[--i];
, v5 k9 f2 }9 Z' J% F                        }
  C( k8 x) Q8 L  i  [                        return (size);
1 {2 q, j8 i6 T6 ]8 b                }
$ D; X) o+ @' [5 O  ^3 [8 g        }
& o% T  f; `, D( ]! g- H; Z. n2 }; U3 L8 c* q1 }
        return (maxsize);$ g! A' G) ^% ^  w; a  I
}
% x: {" t0 @+ V( e" O) u2 }' wint dram_init(void)
! K. {, d9 Y0 ?8 n1 V. i0 N+ Q{
: b" i# L2 `' ^6 o        /* dram_init must store complete ramsize in gd->ram_size */
! M! J- z1 u1 U1 z4 Y        gd->ram_size = get_ram_size(
0 j9 S0 E: E2 n4 s) P' N: ~" ?                        (void *)CONFIG_SYS_SDRAM_BASE,0 k4 q0 i$ {; V% ?' _
                        CONFIG_MAX_RAM_BANK_SIZE);
$ Y7 w! x) K% H9 v, M3 J        return 0;
+ X1 c$ D5 W- w3 ~& c}7 R3 y6 A/ g5 D6 f4 }

# d1 F/ T' `0 @" {( `4 f
0 M, c( L- n3 T) `  g  H
+ N9 C" r- d: Q8 G, S' |" r9 w5 E' j& z9 V+ _5 s  n8 W
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!* j+ @4 B0 A8 Y% W2 w) ^2 e, Y$ |# j
% ^! D: w( W* h( `+ `) E% H$ C

8 m+ Z8 z4 N3 T9 B1 E' O

) ~1 |. h# x; a7 r  ~, u
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-8 16:51 , Processed in 0.039030 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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