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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
# A+ A" Z: W0 t+ K3 `% s9 R  ?( \核心板2:DDR2 256M Byte   NAND FLASH 8G bit
9 j8 z3 E  J* i+ e: N  q6 E这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?/ r0 i1 S& R9 M2 \% J( {8 M3 u
# r: |3 U' i& k9 ~, S+ E
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?/ u9 k7 n( G( |* n
$ t& y/ ?& F+ A
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. p5 d4 W* I- @, P/*( o- z+ G4 m0 Z( o" k
* Check memory range for valid RAM. A simple memory test determines2 P9 A% K' h! e( m' w
* the actually available RAM size between addresses `base' and
# U: Q3 u( X2 V1 w8 L: V" A* `base + maxsize'.; I% ^, s8 }7 l& {
*/
0 ?/ n; n+ B+ F. ]long get_ram_size(long *base, long maxsize)$ l$ ^& {* j- z3 H' M
{
, q' j: g; a9 D8 h2 [2 B' n        volatile long *addr;
! \3 }' G8 Q5 e* t( r2 f1 J* s5 j        long           save[32];" s4 g2 [8 c. Z$ i5 x
        long           cnt;
+ x0 H, M$ Q" Y" D& D/ k' @        long           val;% C, e9 w. M- M7 B* b
        long           size;2 P$ n  b' j0 S3 I1 w0 W
        int            i = 0;
. z1 E3 ^8 a2 `! V! a* @" A" u5 f! i# H* f
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- E% [9 G0 |, T1 [% l; P                addr = base + cnt;        /* pointer arith! */
5 P' C$ [9 W6 D; u' ^& t9 ?                sync ();6 u$ h/ M: k: N
                save[i++] = *addr;0 v! i/ |$ g+ U  L6 p
                sync ();
8 W7 J0 W' O% B                *addr = ~cnt;
' q9 M1 C0 ]- z9 a4 g% d0 j        }
; {% W: K/ j. {5 b6 A1 S  I- b6 {5 @& X* n* }. f  L' N/ X4 |" v
        addr = base;2 n2 F7 U1 x2 N. j
        sync ();3 A4 D  Y; |7 O: C! a
        save = *addr;
3 t1 P; ?6 D" ~* m" t' x1 c+ W: U        sync ();6 B# F$ J4 J- [: L6 m
        *addr = 0;' @8 Y9 f) D( `6 g
/ G2 w7 X  v; F% H. ~/ t# m/ ~# H+ s1 s
        sync ();
5 ?/ V' @2 g2 c( |        if ((val = *addr) != 0) {
2 q( H8 k' i8 J/ _; c2 D2 M                /* Restore the original data before leaving the function.
( X9 q. r: @; D6 X! i                 */1 b" a! R9 w" G) ~, B7 K" Q
                sync ();
7 x( W( k4 ]1 q) U: u; V                *addr = save;7 H" ^7 O7 ?- r, z" U, t9 |
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {4 N+ B, y) X+ l2 W! d; Q
                        addr  = base + cnt;2 u5 |3 T* u4 r+ C. p2 n! I* G6 n- x
                        sync ();( O7 e2 v" \- e- N& |: N, d
                        *addr = save[--i];( V2 Y. F% S( R! f: j
                }4 R! S" {& d8 O
                return (0);
% L- r3 X( v  a  ]' i        }
6 D% C: L8 J! ]3 Q5 q; P, i7 _( S( B( x" d+ g" y
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 W. [: P1 A' h1 V# }9 w
                addr = base + cnt;        /* pointer arith! */
1 G7 u4 ^1 N. J* z1 ~' E+ w                val = *addr;8 a9 N# P# G$ M8 O" z* ~( s
                *addr = save[--i];0 h8 Y% e5 t8 M! q. t1 k, u
                if (val != ~cnt) {$ K) A/ @, ]0 O# z
                        size = cnt * sizeof (long);
, b8 m; a8 i# Z                        /* Restore the original data before leaving the function.# }' S: u" D1 |( _  g
                         */; y( a) K& E5 _0 ]" q
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 m) w+ p- W" E                                addr  = base + cnt;
! a7 Z' J1 ]' q                                *addr = save[--i];( t, r" D5 b# Y- z, r
                        }
. B3 E* N- b/ o                        return (size);8 U: M9 e. R# E% N
                }
$ ?  `, C+ ?7 z: [6 V. E& R        }' s( g2 q  g3 Y6 N+ `
) v/ N; g! _' q8 t
        return (maxsize);; f: s" p. P4 n. a% o
}
, p7 r4 J& Z0 m/ vint dram_init(void)  w' T. R' D5 L9 ]/ O
{; K4 U& c4 h1 R
        /* dram_init must store complete ramsize in gd->ram_size */
5 u; ^! s6 O+ ^/ B$ ~        gd->ram_size = get_ram_size(
! k+ Q% m' N2 D/ a8 n  r% b# |                        (void *)CONFIG_SYS_SDRAM_BASE,
+ G1 L+ B3 Q$ W                        CONFIG_MAX_RAM_BANK_SIZE);9 {2 Z' W2 x1 e# K5 s8 Q
        return 0;6 \. V' R4 Z, g% N" e/ {
}
& _) k$ X" U- ~" v0 K
" [& j, m0 D. L$ {4 K9 N8 X# @0 r. U; r, A& S- Y/ n4 g9 P% l
' m& w5 d$ K( \9 ]8 o1 n, a
" @1 V/ r: G$ ?! ~4 O
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!, U$ y( l! K5 h
# ~$ G. ]- N1 f7 W2 b; A

: `( ]& d- s+ ~
, ]# L2 p0 |- }9 d
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-6 16:19 , Processed in 0.044865 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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