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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
' E! ^! G! t7 z! w$ I, c核心板2:DDR2 256M Byte   NAND FLASH 8G bit
% o  ]; k& G+ u# ^这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?: ~+ \2 c6 K0 H; h, w
6 D, J9 K5 Y" V0 B9 s
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 x% E4 r- r1 h8 w7 l1 \3 k0 |3 Q2 n
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:+ t0 _' r2 E" C  w6 v- U! D
/*
0 x2 Y  s- T/ f) g8 U% T* Check memory range for valid RAM. A simple memory test determines
: {5 m) Z/ Q; z* the actually available RAM size between addresses `base' and
0 J9 }: \9 K! w3 q7 K0 G! V0 o* `base + maxsize'.
2 |+ Z+ ?. Y$ {, G' A7 T*/
0 m! e7 u8 z  T* q2 x% J" ilong get_ram_size(long *base, long maxsize)2 t0 g' d0 Z  `$ n) E' O
{
9 x4 f: r! e: ~: X4 H( n        volatile long *addr;
& e, M4 G  d7 [        long           save[32];' S1 c; S# z, h
        long           cnt;( x. \" Z/ m7 z1 b/ V0 ?
        long           val;
6 |- @9 P. J1 s        long           size;+ w3 ]8 i! D! \
        int            i = 0;/ O* t0 u3 t- l: C
9 r8 F5 m) z# b" W6 A! }
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {  U8 B& b3 _+ O, b) C% U
                addr = base + cnt;        /* pointer arith! */( l: J8 F9 F; g5 y
                sync ();
* I2 Y* j4 g) o9 C  S. _0 v                save[i++] = *addr;6 U+ b& g% e  N3 f2 M2 W
                sync ();
& d: x% d9 q" }) A                *addr = ~cnt;
# e/ K7 T2 Q: \) i* K+ [& [        }
  m: o4 y0 O! {/ t. K4 _! `% D/ T; |$ ^& Y6 [0 [* K1 M
        addr = base;7 g6 v. H$ U2 z1 |+ I1 J# A
        sync ();
: ~  h$ v9 i/ O, H0 [0 ]& [8 X        save = *addr;7 N1 e" f! ]$ p! l) o; X
        sync ();
6 i* H8 ^7 J4 K        *addr = 0;1 Q2 A# N& f  ]) S" T6 X
+ P; u2 n! k; V( d# J0 [8 B
        sync ();
* A2 D8 M. ^2 Q; {' y2 X        if ((val = *addr) != 0) {
3 B9 _9 j* K  n' p! a                /* Restore the original data before leaving the function.
6 `2 P* |5 t8 |% ^& i1 d  K+ H                 */
5 K( m& Y, f9 |9 u8 U% H                sync ();
, ^( `) @1 G8 W* f5 K2 X- \4 D; {                *addr = save;5 E" G( H! Q- @3 g) X
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {$ O) h1 W. b2 O5 S: f
                        addr  = base + cnt;
; P8 }1 g0 e, t1 B                        sync ();
, @/ [8 B' ]4 ]                        *addr = save[--i];; }4 o9 p/ ], p' c. {! q7 B
                }
7 y4 E: [. U9 Z5 L                return (0);
. o; n1 l% A- F        }
$ G$ V: o4 ]0 u- J1 w1 a$ T) P" i2 h: d& s  Z: C4 O
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# S& A( R& Z* Q4 ]6 K7 D' e# Y! i% z5 H                addr = base + cnt;        /* pointer arith! */1 K* c, N4 `4 W- Y0 Q8 Y
                val = *addr;
8 S1 B4 F* w2 J0 P                *addr = save[--i];/ z- K* R0 Z* ]  I; [7 E
                if (val != ~cnt) {& w7 K3 y$ u- R! ~7 X( w/ V
                        size = cnt * sizeof (long);
2 s! v( x+ g# S8 n/ k. h                        /* Restore the original data before leaving the function.! ]5 ]* }3 N+ l
                         */
% [9 j/ N/ t- W- q! `6 s                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 X3 b5 G) v6 T# k+ _' W" x                                addr  = base + cnt;6 P" a) A1 v7 s6 g  e; m
                                *addr = save[--i];
9 Q1 L8 L, q) J# ~' h/ t                        }
) N5 l! y0 H. W0 L, n                        return (size);* N/ W- ^. i9 v8 e0 _
                }, @, x* {1 U/ x  ~! u8 j2 g8 c
        }
' t/ [1 Y$ R) c  l' |6 R
, k6 F1 _/ W* A( b% R4 r& a+ u; Y        return (maxsize);& {  H, B. }! z" B7 x% @2 B
}6 ?( V3 l% w# z; ?
int dram_init(void)
* W  Z- u+ _5 s* b{8 K+ E: Z9 g+ z9 \+ K9 i! I6 @
        /* dram_init must store complete ramsize in gd->ram_size */; [0 R3 O* _4 a  v& T7 M6 A
        gd->ram_size = get_ram_size(1 X: D' ]- D; a. C% W+ k, O
                        (void *)CONFIG_SYS_SDRAM_BASE,/ ]1 r' d7 ?* d% V8 r  R/ ]
                        CONFIG_MAX_RAM_BANK_SIZE);
6 ^. V7 V# x9 r, B. J# Q8 Z        return 0;
6 z6 q, L, T9 m# o2 @/ ?6 E+ S' c$ i# }}
$ i3 @' v" H1 j' {
$ k; Z  Z+ F4 ~
, h' {' G; t, ^' ]( G" D. @
0 g: z! d4 t! O0 f
6 e4 J( G$ z1 T; w% [) R% U! eFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!0 u0 z: |' [* n% [+ R; K5 z) H

8 X8 Q9 B* l5 p0 a( R
4 y% b9 N( h: `
6 f4 l# K$ S0 v) b: }" V
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-10 02:56 , Processed in 0.039376 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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