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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit* ], G8 w( T; I4 l0 Z
核心板2:DDR2 256M Byte   NAND FLASH 8G bit& V" d( G' ?4 \: q5 X8 V: j
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, d7 U- }4 h# Z  ], M/ m6 h% Z# s6 U" ?: c, T$ t
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: F( A# W) c* M; E
. R8 P' T+ O" T+ K/ t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:7 h" E; ~+ _" C; D# \$ W
/*; {" S3 j8 h+ ]$ Q1 b1 s7 H% R
* Check memory range for valid RAM. A simple memory test determines% O6 D$ C5 L7 S; }- a# m: W* g
* the actually available RAM size between addresses `base' and: x5 F# t/ D. ]2 l
* `base + maxsize'., a7 b9 Y* O' y7 |8 n
*/, |# s7 @5 w. a5 M* y+ A: f3 m
long get_ram_size(long *base, long maxsize): k- E2 w. c( A! q- n$ x) O$ X
{
3 f/ q% D/ `6 X3 H        volatile long *addr;
/ p0 n; s6 J" b% F; B        long           save[32];
6 L- t8 K% I% n* X& p6 G" I        long           cnt;" _6 M- p* }8 X8 C2 I
        long           val;5 @" M" P/ Y' ?- D
        long           size;7 s8 g- B8 ?1 q
        int            i = 0;  `# o) s, N6 ]. U0 _/ t0 [  R

) D1 c! w. W- C        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {0 @+ y  T3 F, ]: s2 k$ |, V3 g) g( z
                addr = base + cnt;        /* pointer arith! */
$ k" T/ _8 ^6 M9 k' u! C0 e                sync ();
3 K; O5 \0 c: P                save[i++] = *addr;
4 J0 ^+ k* L# i# x% P; E# `/ F                sync ();4 }, _- M- W; L( \
                *addr = ~cnt;
& ~3 T4 F8 K5 s        }
; Z- g& e: t, A9 t- L$ J/ B5 D* B7 n# X. M4 }! ~, |0 R
        addr = base;
0 O- m& r% J* v9 ]8 R1 N        sync ();. l  j7 L8 U9 N% n2 j
        save = *addr;
' x+ w% F4 |6 f4 K  U) u/ _7 R        sync ();
/ |3 j" k9 i& }  W/ ^        *addr = 0;8 Q; f) v  T9 ]

% K# e1 ~" ~' a6 l) }, [4 _- {. l        sync ();
; P  ]4 g% K0 w1 _9 L* d. |% F        if ((val = *addr) != 0) {
7 h6 a- G. a# f0 F                /* Restore the original data before leaving the function.
" t3 H8 i# H8 F8 T' `                 */
  Y) R" }' _9 Q: m6 V* I                sync ();& ]1 s  X% R( A: G3 C" i1 o
                *addr = save;( f! e9 v4 ]; m- A8 f
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 f: D) Y7 S7 }, j: P                        addr  = base + cnt;
& }7 e2 e; [" B2 E3 ~                        sync ();
0 s# s! a8 K  m* h0 i* S                        *addr = save[--i];/ Z3 n# Z8 E& K/ \0 c7 R
                }
6 |. R! c% G& P# |+ g/ x" B' Y                return (0);1 Z, l; u. O1 h6 N. D4 L2 _' @' J. I
        }$ O4 r, d- w+ K! y. r& l$ _
! n) J( {- f) b+ H# V
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; H! H- F+ r! i, D- N" ?. l- ?
                addr = base + cnt;        /* pointer arith! */
9 Y' t+ C2 K( Y4 W3 L( `5 J1 W                val = *addr;
8 n% A! [! Y6 X/ z# p4 h# B0 g$ ~- A3 j                *addr = save[--i];" W* P& ^- Z" z' R$ X# A
                if (val != ~cnt) {  j& I6 l9 k$ J" w$ e
                        size = cnt * sizeof (long);
( i' w% t2 W; S5 a* N1 [5 m                        /* Restore the original data before leaving the function.: S( D; L% [7 c! m- L
                         */
9 s- \9 i8 W8 F3 J                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# x' y! G1 S" [5 G+ W                                addr  = base + cnt;
9 j( o3 J( x6 L: k5 A6 k                                *addr = save[--i];( K8 k( o# o3 Z+ J
                        }! ]5 O( Y  l: I1 e7 f1 g8 h5 y
                        return (size);
$ M8 k8 D! ^% z$ @5 v1 |) x, P                }
$ N' t0 k3 ]4 F        }
& L7 @- F- f6 e7 O1 }
# g  R* G6 _  H5 `; b        return (maxsize);! W& Y8 r. \* p7 v2 t4 R1 d8 t
}  M$ f, F. c' Y* o4 n5 G
int dram_init(void)
( R9 h; G! t; A  m- J& o0 c+ C{, b& X: b8 ?7 D0 D4 J7 @5 h8 |# B$ A
        /* dram_init must store complete ramsize in gd->ram_size */  [+ X# ~2 ]. N: o5 j+ [3 m+ P
        gd->ram_size = get_ram_size(# G; K- b1 b% Q
                        (void *)CONFIG_SYS_SDRAM_BASE,' K3 ?0 q  O% D- q
                        CONFIG_MAX_RAM_BANK_SIZE);
2 s$ H6 V. I, \: }9 A% m1 B7 `        return 0;
6 q  |/ u' H* O+ C& h9 m3 T+ i4 {}
! d# C% F: W- L% `9 F5 W- Y9 z* y' ]0 `: Z; A3 R0 q! V2 `
7 u  q( @' u; B; B% b! Q

$ C! y$ M% I, @3 s! A# p6 z" O! j2 e
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ Y# S. B7 @- I7 ]9 Z, \6 S" M8 u4 M7 ]4 f5 k
4 R; h) W  h0 ?

8 W+ [/ ^" v& i& f, D6 }# C) X) d
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-4 23:07 , Processed in 0.040914 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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