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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
4 k$ X( ^% n* i1 s( P- W% t/ E& X核心板2:DDR2 256M Byte   NAND FLASH 8G bit7 n) k0 K1 p& e  e8 t
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
# g' I% {0 H2 g( ~2 f
8 P9 L3 o" e4 D' }4 U- k: r5 h是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?2 Z8 U9 O/ Q0 G6 j

- S! E4 Q# L  k9 W( V, R/ K5 }( S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 i0 n; b, k: f3 B& o/*, c. S8 D1 ^. e
* Check memory range for valid RAM. A simple memory test determines) v. P$ l) |* H) m$ P/ _7 ~
* the actually available RAM size between addresses `base' and
+ J% h% Y- p% k* `base + maxsize'.* t5 C$ D) @3 T( P" T
*/
4 E  w* f+ Z/ O! [, [3 e" }long get_ram_size(long *base, long maxsize)
+ P- G% k1 |7 O1 _* _6 b% {$ v{$ s1 p4 L8 k+ [% f$ b
        volatile long *addr;
1 A; ^3 z( H$ B        long           save[32];) |6 G% y: x/ A  u; U) m$ q
        long           cnt;+ v7 r! t( n, z/ _. c. F9 @
        long           val;# w6 `8 B9 Z5 s- D3 W4 I# J
        long           size;  \+ n, S/ Q3 w$ p0 D8 d7 Q3 _
        int            i = 0;0 e* w7 \# L! L  z0 f

) o  x& W: }# _2 x        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 `  g+ k$ H, [( l                addr = base + cnt;        /* pointer arith! */
- [/ A! ]6 x. m' E5 }' [, u                sync ();
8 P. M* o& L, W$ d                save[i++] = *addr;+ f( k0 a+ A8 @% P6 k* ~
                sync ();2 A# h: ]3 [; G$ |) |2 S
                *addr = ~cnt;5 g2 Q) ?& _; q0 b# Y
        }9 @+ y( J2 @6 I" b
+ U  C- k# O! A: O2 L
        addr = base;
6 ~2 i5 P+ R1 `. w. ^4 V( W        sync ();
9 n- b( {% G! V6 b5 P) V        save = *addr;
# ^5 z9 \9 L# Y$ z        sync ();
  N& d5 [9 A, X9 i0 Y6 i. }$ e        *addr = 0;- K# p8 |$ |+ |* H5 H( P

8 M( x  i9 i! O1 h        sync ();
$ y6 g4 k/ Y$ N* N2 s8 ?        if ((val = *addr) != 0) {( [+ Z" u8 x9 ?+ E6 D( U
                /* Restore the original data before leaving the function.
) ^6 }; ]! }2 l1 W# u                 */
( i! K5 O0 ^: f' S" Y9 }3 S( T                sync ();
, T5 C* ]1 o0 w0 k7 W  o                *addr = save;$ h# ~$ h/ ~+ U* O
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {8 y9 G' H( |$ _) c
                        addr  = base + cnt;
+ h7 G6 X  @$ Y9 F3 x* ^                        sync ();
! i6 J4 N+ V! b7 ]6 g8 |                        *addr = save[--i];
" K* ~! ^$ x: P1 m" W9 b                }
2 L8 D% D0 v. o                return (0);
( T* C# K1 j5 @7 B2 s! D% w        }4 E; _# t% _: b6 s  a

% Y, G: X4 q; A, c        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 ?+ x! }* H' T3 |& n# b4 r9 t! q) _/ Y
                addr = base + cnt;        /* pointer arith! */4 o; ]4 c. U, R, |0 a( i$ M  m) M
                val = *addr;- L" `- h6 ~/ U' O  k, M
                *addr = save[--i];4 `; ?( l* Q# q# a0 y0 m
                if (val != ~cnt) {
/ l# H9 z& V7 [4 O6 M                        size = cnt * sizeof (long);
6 l5 M  `! W8 L% [  `. ~8 [                        /* Restore the original data before leaving the function.9 @! F" H% S( F$ s. |7 w& Q
                         */
/ w' d' x& z+ x' Q1 _' ^- f                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 B6 Y& I8 {2 w) G  f) }% b5 m( l6 p                                addr  = base + cnt;
! r5 k7 `) ?" P2 t                                *addr = save[--i];9 A" e2 Q' P* i8 I
                        }% z( B) w: @) _' z: J: k4 G7 s
                        return (size);
- s7 z8 e4 r3 w* s3 {, j! G                }
4 R+ K+ v3 D8 g$ ~( D- R0 U3 e        }6 z  ]+ z7 X( A
- d" l3 r% b' u; g. Q
        return (maxsize);# j0 p6 z3 G; i* s8 c! L1 N
}- ]$ W- q+ {' v# C# j4 v$ d2 U- a  v
int dram_init(void)2 K, l' e8 Y1 j" s
{
4 s! b+ U( `4 _- w1 r        /* dram_init must store complete ramsize in gd->ram_size */) _3 Z+ X! Q9 X  E% m
        gd->ram_size = get_ram_size(
/ V& N" g  |9 b# K( Q  F+ ^                        (void *)CONFIG_SYS_SDRAM_BASE,% ~/ ]* u% T6 R0 B
                        CONFIG_MAX_RAM_BANK_SIZE);
2 b" w) E  g6 B! N& W. c* i& V4 A- n        return 0;
6 p7 L, T, H" L9 b: |}
4 @% Z4 {4 Y& F# g0 b* L; s4 [8 J6 Z& M: Q( d8 Q3 x7 T) W7 A
6 i: a8 @5 q7 n

: p/ C0 J  J! G0 C! C# _$ P* ]8 N
' u5 \9 A! ~: s6 Y$ A) r9 F3 A- p# ?FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 S; W  R) u5 x/ z# Q( u/ Y" v- T( V% m6 `, S

! t. g3 g( R6 @# N

+ V$ i: }* L  n* v! v6 x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-18 06:32 , Processed in 0.038147 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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