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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit2 x1 g% G0 W" D& Y7 X5 q2 G9 X
核心板2:DDR2 256M Byte   NAND FLASH 8G bit5 q7 v: {6 z7 l5 F
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?, o( m& A3 j6 K

+ G4 k- _8 J/ j) U- {是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 O8 C# e0 X) p  D$ H" }7 |+ T; g" h' r1 i; e: I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:/ {: L) n' k3 F2 o
/*$ g% U  _! J0 }% x
* Check memory range for valid RAM. A simple memory test determines0 D; F$ ~1 s7 e4 h) V; X
* the actually available RAM size between addresses `base' and  ~9 }' k. a5 d6 ]/ d
* `base + maxsize'.
4 b5 T6 L$ a# p/ {( p) S*/  u4 K2 C1 J& ~- X% a7 z
long get_ram_size(long *base, long maxsize)6 N/ U: N1 }  a3 M$ U
{
, d: R1 E- z  z& a& E: i( u        volatile long *addr;- r: ~/ O: g6 h/ X6 t$ o% v
        long           save[32];7 j* D# I/ r/ h. a
        long           cnt;
2 _+ J* U( }8 q# @# w        long           val;) W. }: m" m: p2 u4 ~3 o, E
        long           size;
' r! L. d$ t7 E' b6 L2 h* F3 W: ?7 w! h        int            i = 0;
9 C/ {" t5 T: \: B0 R; P; x- L; ]3 R0 z
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {# t: Z: C- X: b5 G" _4 K
                addr = base + cnt;        /* pointer arith! */
6 X8 P/ p4 O9 z1 n' g                sync ();
1 ?- R% D6 I& j/ ^! f/ ^$ c8 ~                save[i++] = *addr;
0 E3 w' q9 `0 K/ |# Q* q                sync ();
" ?6 |) o' b9 U" X/ D* z; u                *addr = ~cnt;2 P& n1 C1 u- ~, V% ^& ~) u: x7 f
        }
4 @. |! u1 ^- w, ?* G) X8 d
- I8 E6 O" O7 v; g; g8 L        addr = base;
% K2 @& H% k, t' ^4 n1 E        sync ();! C  L1 y$ _5 G8 Q: ^
        save = *addr;
# I/ M# }5 Y' C4 m& y$ B        sync ();3 z/ H8 C+ W( J
        *addr = 0;
: `: n  V- s- u: p7 [: ^4 H6 C
% j# `7 |$ v+ v+ c* F% H/ n        sync ();8 z; e- v4 S: O
        if ((val = *addr) != 0) {
7 B" y& V0 n6 d& T) Q" m8 x                /* Restore the original data before leaving the function.* k. T% }! ]4 A+ k& e3 |
                 */
% L. S. f9 K4 F                sync ();
' O3 i1 n1 r% b( r" c, J                *addr = save;
$ X+ e# u$ V2 Z8 O# [; H& E8 n                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& X/ |+ m- w' ]' X                        addr  = base + cnt;
- V: Z- n9 r% P/ p, |! W  S                        sync ();' C) X6 M  F. e2 e. P* y
                        *addr = save[--i];
$ Y" R0 l- V8 V, O5 J                }
: a/ k/ h+ q5 k; Z+ ~$ P7 U                return (0);
- `9 s3 M5 d- C. O: Y6 h        }3 M" e9 x( W& s& S

  o4 z% Q/ i) O0 ]- @        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 X$ V& j5 j# R$ t0 a! I( `) i) L
                addr = base + cnt;        /* pointer arith! */
1 t) ^  Z) z+ M: D. ]; @; u* |1 E                val = *addr;
- |' F, Q- \+ |9 x                *addr = save[--i];$ m" e. q* O. F: ]
                if (val != ~cnt) {; @7 ^( [1 L4 C3 _9 X! A
                        size = cnt * sizeof (long);
- p0 K! ]" U" @; q/ c6 g                        /* Restore the original data before leaving the function.
7 ]5 h1 M! |2 W( g8 h& r                         */
# w+ R6 m7 S% Y8 y7 P- [                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 N4 j: G; a. g+ _9 C' B. p                                addr  = base + cnt;
& O4 S3 K* [( ~! N, q5 X( t  v                                *addr = save[--i];4 r+ _$ _; a4 [; \- g) l
                        }: S0 F7 w. O9 u- U* ?  S* w
                        return (size);
( U* x9 r1 Q/ x* R# U$ W                }# h, x. }, u7 Z
        }: g- n/ S) X' r8 I3 l

5 I& W3 S1 u7 j+ v        return (maxsize);
  P6 r% z  {+ Z6 D}
5 u5 ^6 r4 U$ f( ]  Fint dram_init(void)
) I. H, p9 z7 q% H# G5 b$ ]{" T9 b) S1 B# X! J2 ^
        /* dram_init must store complete ramsize in gd->ram_size */
! k3 ^$ Y# Q% l+ X; p( a. n        gd->ram_size = get_ram_size(
& z* Y  U& r4 Z3 T0 ~; {. V                        (void *)CONFIG_SYS_SDRAM_BASE,
& u; c) l. `! n7 i" Q9 ?- r                        CONFIG_MAX_RAM_BANK_SIZE);
3 T! Y. J- C6 H! P1 |7 O4 t( s5 G. u        return 0;
- P5 {$ R, f$ N  l' G! Y7 p}
% f7 G) ~$ m  V! d, g) a
3 C4 i5 ^, i: l
1 b' M5 c: f! Z
$ g. Q! s6 b. k% g3 b% ]
6 H# m0 K% t. ~, P0 ^2 e; r8 s( EFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!7 R8 @% w5 c0 H! R/ X

4 O/ _: p8 V& P9 H) f6 I" C: b; H2 X" K
+ r+ h. s- D, {1 B6 U& v9 z
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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