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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit1 ^' z+ J$ K+ S
核心板2:DDR2 256M Byte   NAND FLASH 8G bit; d+ u% o; ?6 a3 b3 Q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ j& D! m4 l2 [! E
/ s% D/ u4 j: y2 R1 S3 h是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?- Y/ c" z# V" ^& M

, O7 I. j* q$ Q# z. |5 L
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:+ S  {- s  }: a
/*7 [; r. v! I( O! e0 N& B1 _% k  W
* Check memory range for valid RAM. A simple memory test determines9 G# }% u$ d7 d/ t& }( h$ k6 u$ M
* the actually available RAM size between addresses `base' and' a! x& _8 W$ L
* `base + maxsize'." L2 ^, f  J$ y0 C& J1 |
*/
' |, e: v# B6 h$ N" v3 H- tlong get_ram_size(long *base, long maxsize)
1 @5 B6 X  F5 |5 Y0 O) M+ A, N+ Y* @2 a1 n{6 A. l& N8 I6 m- W4 _1 B+ ~: }
        volatile long *addr;% @9 f! x" Q' J8 s* h0 V9 d$ j: r
        long           save[32];8 {5 ]7 f4 {4 h
        long           cnt;$ O. H* |( Y, O
        long           val;, e: A* x7 {6 p# h8 P& e
        long           size;1 V' P( l* m1 B1 B
        int            i = 0;
* `4 a1 D5 Y, R. J+ m/ Z* l. p' v7 F8 w9 w! o# ?' G
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
9 T- G7 [: {$ C7 R! }0 s                addr = base + cnt;        /* pointer arith! */" [9 {; p5 ^9 M. Y
                sync ();6 o5 N2 D- Y1 G- L0 S0 S* d
                save[i++] = *addr;
% E# ^2 B5 G6 P) q( H, p: @# |, k  E                sync ();; n  U: p) [1 b! T3 i, \
                *addr = ~cnt;
4 G" e6 E, J: G+ v9 _+ j        }9 Y2 z/ \" ~( e
# k* p- Q+ G' ]9 P9 u8 U9 `. l7 t
        addr = base;5 _5 G4 C6 L, q1 ?! ]8 ]2 p
        sync ();& K4 c! T, H! |* H  q+ M
        save = *addr;5 d8 R1 ]$ v: d; E4 r
        sync ();
$ ^% x5 _! v: ^  e- H: q% l, v        *addr = 0;
7 T* |7 c* M) F2 H3 x  K2 s. Q. ?! I1 z- d* v9 {1 ^! l. i
        sync ();/ i% \: _% Y; S4 Y' ^8 }
        if ((val = *addr) != 0) {
0 |) c+ ^0 h4 a* I/ c' K1 _                /* Restore the original data before leaving the function., Y$ b; q$ T  b3 K( K: i9 V
                 */
: T, c$ Q' Q% ]) C5 C% O  Q                sync ();
8 v  d( w* `( R: X" P  ^                *addr = save;
; q8 T' e7 I8 `; `/ ]) n                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {, V$ p  k6 R' B7 f) E! R8 e
                        addr  = base + cnt;9 J$ O" K2 E; q* f5 t2 c0 W
                        sync ();
3 r! H; Z4 t0 I# M& B9 L                        *addr = save[--i];# |, c- X6 C% y# T5 d. A" ?
                }& y% I' M8 d/ o+ w0 U! H
                return (0);/ x- `3 j7 \, s* L8 y8 n6 Y" C
        }1 k9 {9 s5 O2 b

& ?1 t& T7 S( d% I4 n4 U+ f# u        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 H& Y3 H, c+ F; P                addr = base + cnt;        /* pointer arith! */
3 J0 t9 L- w& N% N                val = *addr;
: f  S- I/ D, z- R                *addr = save[--i];
3 E1 c8 s$ {% c0 T- d. I% u                if (val != ~cnt) {
3 A$ g6 J4 H* K5 f1 X: z                        size = cnt * sizeof (long);, w$ `% s* A; ~/ a
                        /* Restore the original data before leaving the function.+ o( J/ w$ Z- F4 t5 e- s6 E
                         */0 i$ h7 P& Y. j8 \) I
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 K+ i0 M3 s$ Y8 _- x, J                                addr  = base + cnt;7 M  N. w$ s" g5 p& B: ]
                                *addr = save[--i];
( ?0 W% D5 h4 N6 k2 M! T' Y( q                        }3 P2 I+ @% p' g6 m% Q9 V
                        return (size);
4 ^: o6 [" x6 ?                }( R8 c8 x4 b! W2 G
        }' P3 o6 ?8 Q0 K, }  \& B4 |

1 \+ I. g+ J, {1 \. m% ]  S! j        return (maxsize);
3 O1 m( B" ]! d$ L9 r}
# S4 P8 ^0 K% K' u3 X0 K- o! kint dram_init(void)$ S/ h, U3 _+ U( i% a# `
{6 U: U  r5 z8 g, W7 {6 |- X; N
        /* dram_init must store complete ramsize in gd->ram_size */
, ]1 X/ n4 V1 x& p  ]! c, T        gd->ram_size = get_ram_size(
! P7 F" x$ l$ o. o/ S7 a; I                        (void *)CONFIG_SYS_SDRAM_BASE,
7 f( j! a' o1 J( H3 S                        CONFIG_MAX_RAM_BANK_SIZE);6 h4 m+ D: V* {
        return 0;
( a# Q9 ^. {1 J% U8 N}
8 O5 |* A. k5 M0 U( |
) g7 ^2 [6 [( y: D+ e& b7 l. ^8 b' h6 O

, t) Y$ P; W; r8 E7 l+ H8 r6 \3 a) |% q# w$ B9 {" u7 p
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 O8 s! G$ g. U! P: T9 f
: i3 J8 @. \7 Y: S6 f5 A+ S* G( u
( K( F7 N+ @# W+ V0 t% `

  g5 ]0 Y9 S7 B/ U/ b2 X& j
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-28 11:21 , Processed in 0.042152 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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