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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
( y, ]; J* L! |' i5 {核心板2:DDR2 256M Byte   NAND FLASH 8G bit
  b, M' J; l) x; Y3 V0 j% [; F这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?4 m' }. T6 g6 a, |. t; _" V
% i  M; ?, {8 D: J4 \
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?/ w! G' U+ W# R

/ g3 }! `8 f+ d$ \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:/ H$ d/ i  q! T
/*3 M/ ~, `1 V7 W+ s" T2 q1 @
* Check memory range for valid RAM. A simple memory test determines
" h0 u- D: ^: k0 l) B8 e: _* the actually available RAM size between addresses `base' and
# N9 B0 _1 a$ _! Q4 J) V. L; \* `base + maxsize'., h5 A2 k2 u) M
*/$ u7 O$ d3 r$ b& a4 D' b2 r1 F9 @
long get_ram_size(long *base, long maxsize)' U0 L' c" w) W1 H
{1 g& f% i% g6 p$ [
        volatile long *addr;8 k0 ]  Q  w- \6 T3 s4 {2 b
        long           save[32];
! P; n/ R  x+ h  p' i6 R# v% W        long           cnt;
7 t) i& N& u9 z; R9 U, g        long           val;! r3 E9 i! U9 R; i" Y
        long           size;( u, H7 \% n, j8 x  U( b
        int            i = 0;7 i  B; Y) y/ C* t9 ]0 [1 b
7 V" D. A4 U! `
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {8 O9 l) x7 v$ q1 r5 j8 Q( M
                addr = base + cnt;        /* pointer arith! */& W7 h+ F  _5 ^4 V* o1 \5 A
                sync ();! A' s% v8 M! x. {1 p
                save[i++] = *addr;( R1 A4 s0 K" ]* \9 p) I; a
                sync ();
! _+ K, d0 a6 [7 ~# S                *addr = ~cnt;
8 a$ u% }5 P0 T7 \: ?        }
2 r) ]8 T+ |; n! p2 U! T0 A: l: ]* F" C+ |; z+ I
        addr = base;
* o6 i. g# ]& ^4 F        sync ();
' r( _) ]$ I' V! U        save = *addr;
4 V. I$ h3 P1 o3 w; G9 e        sync ();2 Z" \% V$ E" t7 j
        *addr = 0;. _' h& ?8 [/ \
( Z2 a; w, H4 }" A
        sync ();
- i3 i$ a; [0 l, W$ D+ Y$ }        if ((val = *addr) != 0) {
, J# Y* k6 K) L1 G' a) }                /* Restore the original data before leaving the function.
: c' k" n! i4 D6 w% D$ D& l4 ^1 Z2 ]                 */
4 D* x; Y8 |7 H0 F( s                sync ();
7 h7 z/ g! P% o; i& t; @                *addr = save;
1 h0 \' `5 n9 K% r8 i5 _                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {- X2 {9 E( a$ J' V
                        addr  = base + cnt;7 ^4 W" p* U- l
                        sync ();* L! z+ @) M+ p
                        *addr = save[--i];
/ d! E9 l# q- N6 k$ N                }+ D7 u6 \& Y! U6 c3 V! O9 @& f2 @, v
                return (0);6 p3 D  X# D3 i- W! g, m. ?4 g7 E) o
        }- W, a5 y7 X5 s' @$ m( d

% l) R0 h' U) n* \5 T        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 H6 E5 |9 I: A
                addr = base + cnt;        /* pointer arith! */
3 y( D) N" B7 H* m) K( L) P                val = *addr;( s: t' C4 m$ @7 F4 @  a" c( Q, Y
                *addr = save[--i];5 o$ E" \2 v  v( m. E
                if (val != ~cnt) {9 v! D* h* \& ]' h1 J  F: E
                        size = cnt * sizeof (long);
; w  e. H+ S+ J5 I$ K0 o                        /* Restore the original data before leaving the function.  y, F4 M' d" i4 V( O
                         */
! K! d+ R: J* J/ _6 L0 [                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
  ~8 s3 V! k8 q) s* P) ^& V                                addr  = base + cnt;3 O+ _3 f8 u9 i( h3 d! Q! H, t- w
                                *addr = save[--i];
. A2 ^# \1 n6 }5 X2 _$ B                        }
3 w' S, K2 M% o, `7 c  q- M/ v                        return (size);
/ g; c) G% w7 p! G                }
- s; z4 E8 H7 N  I1 j7 e        }; r/ E/ l. k/ E' n
6 P7 Q, \0 i. p8 l' [2 N- W( G
        return (maxsize);# n2 B+ |% r5 \' K2 e2 G9 K& W( t/ z
}
& I% a. R$ j/ m% o6 ~int dram_init(void)
0 ^$ R( K: k( G4 O0 G{4 y6 R: U5 {, b% ~8 n' i# l+ n! d
        /* dram_init must store complete ramsize in gd->ram_size */  |! y, D% ^! h& w+ X
        gd->ram_size = get_ram_size(0 ~! ]0 C* k/ ?' M
                        (void *)CONFIG_SYS_SDRAM_BASE,( L. j9 w& K) F
                        CONFIG_MAX_RAM_BANK_SIZE);/ S$ c- Q( K  L3 H
        return 0;
8 E; j6 s! \) s0 D0 v}
7 F  z) w7 O# ^8 b/ o) k, r# p7 g
! R9 X5 D+ k& s, [+ w& R% V' N- ]: M& ~. E& G
# e9 U$ |9 g, u
- P& {6 G+ l+ F: i6 I. q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!1 P- x9 p5 n# ^% w8 b3 W: P

  E5 Y8 L& D* V3 Q$ Y6 j" B" r% {# f2 L/ |: I3 x
* q7 J* [% P1 ]% q, _+ e
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-31 16:55 , Processed in 0.036808 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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