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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit8 l2 k1 V/ U! L$ o5 y1 e! v
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
# w7 {4 ~5 t4 c& d( H* n2 m这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?; m, L, Z' S1 t, B% v' U. S

! p9 i. ]& G5 e1 N是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?6 q4 }$ y2 Y% q- H9 ?+ F
: [7 L. r) z1 \+ q4 ~3 b6 ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:5 R4 @& H( `. Q1 R% J
/*+ B, T) Y( C* I! b# E
* Check memory range for valid RAM. A simple memory test determines
0 [% B; P% L+ I4 k* the actually available RAM size between addresses `base' and( W# j1 B% a+ ~
* `base + maxsize'.
# e3 ~1 g% f2 A3 T* e( s: L*/) A$ I3 Z, E* p* b
long get_ram_size(long *base, long maxsize)
* Y) x+ B0 D4 r$ c" B/ i% Q{
3 K; i- ^! H2 w! P, B5 }' B& r        volatile long *addr;. p$ ^; T- C( R
        long           save[32];9 I5 d( ]1 x) v
        long           cnt;- ?- j+ X; W7 D
        long           val;5 U: C" I" g& n5 b5 w  T
        long           size;
$ i0 C2 q! {# c) b) X* _        int            i = 0;
) r) a+ I7 E! e8 P
  b2 q: e/ g& D- e& M, a        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {8 N/ N) S9 p" E
                addr = base + cnt;        /* pointer arith! */
% M5 f7 H/ M8 p  E                sync ();
  r$ N) _1 B! j/ s                save[i++] = *addr;
& G' `* X# o  c0 ^! r# Z                sync ();4 z" _1 I/ |1 z' ~; a
                *addr = ~cnt;/ h8 @0 s- v' j% P- J% V8 d  l2 F
        }" X3 {# A/ g2 v" z+ P6 J
: m* W0 S* O4 R" f' t. i3 ?
        addr = base;
& ^+ A5 w0 q! z1 N- |7 p4 O        sync ();' ^' P; G( n' M: h4 n
        save = *addr;
7 \$ N  X. ^- k6 `9 Q        sync ();
" ]/ A+ |" n% u& D        *addr = 0;6 L, Z! ?9 r+ a' R

; h/ P5 ?( L. ^% ^$ e0 c' i        sync ();
1 c/ L" _- G6 w        if ((val = *addr) != 0) {
5 w1 l& r! S( ]# y                /* Restore the original data before leaving the function.
! P! n8 n9 S; n7 r+ C% r; f                 */
: x, x  K) T# W/ A' p                sync ();. w' f' s  {1 J' X
                *addr = save;$ c) @! }, c2 u& o" p- d
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
  k& d, ^$ g( H  l7 S5 B4 O7 d                        addr  = base + cnt;) j0 ]1 J% h9 C" F$ D. ^& i
                        sync ();
7 O0 `2 Q4 A8 l; m1 N) P$ A                        *addr = save[--i];
4 e# }  X6 ^6 Y# q7 W                }) W; q: G6 [- g% }1 f- m
                return (0);+ u8 y, X  d$ A2 r$ u2 U1 q( ?7 K: R
        }
  L6 s/ ~7 Y/ S1 N: z9 @
  j) i9 v. o1 Y9 p2 d# F        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 [4 a9 U6 S% P5 W1 l: E: w4 [) K$ `                addr = base + cnt;        /* pointer arith! */
+ l& q5 J7 q3 u1 v8 j! U" H5 ?                val = *addr;9 _& d; A1 g/ m. ~/ q
                *addr = save[--i];. W2 e/ C& _; s: }& a
                if (val != ~cnt) {) z1 Z5 E* t7 f. ^! P# v
                        size = cnt * sizeof (long);2 C2 A0 M/ H, V/ m  u# I0 `
                        /* Restore the original data before leaving the function., H9 U, m, a0 ^4 N$ Q
                         */+ K! n& D& U8 `" X2 d8 q
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 c7 L' i7 H+ Z                                addr  = base + cnt;
; |7 |: \1 O/ b$ w                                *addr = save[--i];. f; i6 |4 V( M
                        }
* A! I, z+ e! Y* Q                        return (size);
& W  O. n0 {* u) Q9 ^3 m, o% m                }3 g7 `9 ^, U/ q1 m7 j
        }
  f' q/ H$ D6 [8 ~% M  r8 u( J/ e4 f& ?& S) s5 x# B
        return (maxsize);7 M  t( p# K" N1 a2 g' L
}* V8 f/ D! [6 G2 Q6 J
int dram_init(void)6 @0 z0 K6 H0 f" S! v) q, U8 N
{
  ]( N  J& }# ?2 Z! |2 p2 ^        /* dram_init must store complete ramsize in gd->ram_size */
$ N$ w' N% @* M' K( |3 x, \        gd->ram_size = get_ram_size(: R/ d5 e  B, p$ A4 R% u
                        (void *)CONFIG_SYS_SDRAM_BASE,
3 i! w8 V; q) c* ^) i) p1 ^                        CONFIG_MAX_RAM_BANK_SIZE);- Y! l) j- e1 c( U
        return 0;
. C5 ~3 |: F' j}
: h5 K- O! A1 [0 a; m: W/ ~* f4 g& P1 C( U3 O: J9 ]3 c2 W5 Q

5 i' F8 C! I/ E( J
8 y9 G6 P/ t& q# P! U/ a8 x- U7 [- J
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ ^3 Y1 `' d4 e8 H( e* `. w
9 e, E+ `6 C2 {1 I0 f1 I+ p, H  [. z
' q9 ~" |% S( z( Y7 b

0 c  i4 W5 I- J3 {
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-6 23:52 , Processed in 0.038171 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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