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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit4 S: Z# e+ Y5 L9 k$ Z+ `' T
核心板2:DDR2 256M Byte   NAND FLASH 8G bit: D3 a0 p+ _! f3 {! k
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?) s1 P& `$ ~& ^8 I8 N
7 _& Z) B9 N  Z& ?. e* ]7 p
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?  T& i0 `( O- y6 f) b  Q' E

( b8 L& [" I# s$ x* E. U' g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 D  z# i3 c. u' J) {1 g/*( A6 m& B5 J2 o+ u
* Check memory range for valid RAM. A simple memory test determines
0 r. [  h2 U( L$ T# {" H; q5 u) D* the actually available RAM size between addresses `base' and
! Y+ V1 n5 S; @* `base + maxsize'.8 v) g$ G$ E3 p! h
*/9 D) b3 @/ v; ^1 U
long get_ram_size(long *base, long maxsize)1 g( o0 ]" `( c* @/ h& X0 j
{
# o) R/ \( L/ V5 W        volatile long *addr;
0 y5 V# E, }3 n* K1 `        long           save[32];
* n8 Z5 B% p/ I7 @& `3 f        long           cnt;* F  `2 }" l6 [) J
        long           val;' p5 M: t2 H, ~- f% q3 V
        long           size;
+ K( i$ U" r/ x: i& B$ \3 [        int            i = 0;! h: Y- e- ]- l/ p+ `8 S

, F9 I2 I3 O0 X4 s        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
5 W. y% o% R" R7 ^3 S" p                addr = base + cnt;        /* pointer arith! */
) ~5 Y% i% Y" Y$ V7 O% \. V" r                sync ();
) G+ U- ^  |& f  m/ a                save[i++] = *addr;' d  ~/ n) k& T- F0 X' _
                sync ();
3 {9 o* t7 j; q/ t% U0 q                *addr = ~cnt;
$ [7 O! q5 o, C        }
6 H  _& @1 a  h# x3 V- r" f) |" w/ Q1 d
        addr = base;
* z; H" v/ {" {  h        sync ();, r- C* A0 G4 o! t% M; l* |
        save = *addr;1 l( E1 D, S  X& E2 O1 v
        sync ();+ ^  \8 [7 q# ]: B; U; F
        *addr = 0;
1 A: T1 ?! ^+ V; R( M) C7 ]( U/ w7 z/ [% g' Z4 D4 F- g2 \
        sync ();
9 g9 }2 K; F- t1 q4 i        if ((val = *addr) != 0) {
& S( m0 C% C! P6 j+ Z+ W. P                /* Restore the original data before leaving the function.6 o8 q0 g  h! m3 ^- O3 D
                 */
' ^4 K5 B6 f3 P! O+ A$ |, F* V                sync ();. R; ~. Q$ \8 p
                *addr = save;2 _; W( [1 p, ?2 {, J5 P' A
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {- N! x  o7 T! P# O1 [
                        addr  = base + cnt;# S* S, C% f6 r, h4 n, ^! K# G
                        sync ();7 x) E/ v8 y+ \0 O5 a
                        *addr = save[--i];
3 t% [! |; \" n7 q7 O9 K0 m* m                }
) W& C3 ^$ T0 |: l                return (0);% u9 O, x1 r; s
        }% {6 N& R" \% Y' m" p* H

/ T9 H0 K; `* N7 O& t: O4 C        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 Z7 V2 w8 H5 J; ^# k4 o* p- ]& C
                addr = base + cnt;        /* pointer arith! */
' E/ ]' j& C# m4 P, d& _# D                val = *addr;
4 Y$ m3 ?8 z7 O* a0 m                *addr = save[--i];
% L1 `/ q/ K  ^* L' i2 O                if (val != ~cnt) {7 d7 v" C6 T' x: \0 n
                        size = cnt * sizeof (long);
* `  N2 }; s& ~6 }; d  q' g& o' u( H                        /* Restore the original data before leaving the function.
2 J+ M6 z' \6 T- x7 K                         */3 y! ^, @0 P# ?) q, ?
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
  e- ^% Z% \2 T                                addr  = base + cnt;$ ?, N- C* P3 p. x" j
                                *addr = save[--i];
, Z1 z$ a$ n$ O/ j+ U3 z( W6 w# N                        }; h. M4 q9 c* O1 B; }$ I! m
                        return (size);
1 s9 _4 F7 H9 _# p; r                }) ]9 w4 p4 q( o- m* u" y
        }) G/ ~# R3 {& A$ E. T
: }5 i$ c; |" V- r* C
        return (maxsize);& A4 @' W8 o' R" \% s/ l( U2 M
}
: w* q* b! s) r4 z" M. p# ~" xint dram_init(void)+ R9 s, j$ @2 B* S# j5 T3 c3 W9 i
{
* W% m; k% C  p+ T( e8 O4 M        /* dram_init must store complete ramsize in gd->ram_size */
" }& X/ }6 p4 y2 {. t0 |        gd->ram_size = get_ram_size(
/ L! t! f0 r; P1 [$ V4 p                        (void *)CONFIG_SYS_SDRAM_BASE,1 e1 f0 L) R; e: O+ M: C; Q, H9 ^
                        CONFIG_MAX_RAM_BANK_SIZE);
5 V6 x. Y! `6 E$ R4 z        return 0;8 b6 I' S( w/ B8 r8 [  C2 a& _
}
- H/ J7 G& t, i' p6 Y) h
( ?$ g: b5 V% O1 L( P2 |& M) d
2 ~4 q, w" l0 J! e7 |- A/ E( |5 T1 m" C9 U7 A
! s8 i/ b; ^6 l. t
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 i% [. q3 J* V2 K; w5 y' Y! d/ H; {1 \/ _/ O) |/ v+ Y

& j: \6 G: y0 y# r6 }/ U

; j/ P2 o8 r4 a6 d
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-11 22:43 , Processed in 0.039942 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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