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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
8 [" E; q' w" b: e: M3 o) _6 t核心板2:DDR2 256M Byte   NAND FLASH 8G bit
% @4 \5 v2 V8 L# K0 u这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
' [* d1 V, q% F) `8 u  U7 G" Q" t2 |' ?
3 }% D7 Y7 A/ n2 s* E7 H, m* b( m是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 W! c8 j, k8 m# D7 a: v- l5 y9 B9 k  ?. |5 t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:6 T' Z! U: U8 a
/*; P- w" T0 f3 m: Y4 D2 o) u2 k6 @
* Check memory range for valid RAM. A simple memory test determines  a, v; T/ v$ {3 f$ g
* the actually available RAM size between addresses `base' and# E$ d( {8 |% W3 e4 l
* `base + maxsize'.
6 D6 S$ w. E; h; F+ \*/
5 _) J5 D% F  Q# _# {7 mlong get_ram_size(long *base, long maxsize)
) B9 n# `% `$ F{
1 |3 ]3 N: F8 y' u$ t% J  P# D        volatile long *addr;  b0 f# ?" J: ?9 E% r
        long           save[32];$ x, }# Z2 r1 x! X" V& v+ }# `' w& c
        long           cnt;6 j4 o$ F6 M- `8 j8 Z
        long           val;- b# F% c. Y- D' _1 h) a9 Q; B7 _
        long           size;
0 K5 S5 ~, Q1 ~- `! K7 x& S8 A' F& a        int            i = 0;
: ~, a+ {, l6 ]5 u3 J
/ W# _0 @7 Z) Z0 X+ r: ~        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {, x  B) _0 \: l
                addr = base + cnt;        /* pointer arith! */
- J/ ]- T; A( L                sync ();$ y. n1 c& K0 s! D. \' v
                save[i++] = *addr;" `) f% H4 e* n) {; X
                sync ();
; P/ F3 a9 S( b: A" B2 E6 H                *addr = ~cnt;0 M4 l8 B2 t5 w8 c% ^+ L1 Z
        }' \  H. A! K& @8 A
6 Z' |5 B7 [' P* F9 r( O" O" n! m
        addr = base;
) L/ ?3 A) J, t/ l( y" X/ W, R# i        sync ();. {  Z' u' B! l3 H9 p+ n$ c' c0 u# \9 \
        save = *addr;
' ?9 h5 t# S3 i. i9 }; x        sync ();
+ U9 g: A9 L5 B" I: S        *addr = 0;* v/ `2 V& J) i/ n

. u2 z- |7 d( K! b1 W        sync ();2 s& g; @6 |/ ]  k& p" V& }1 f
        if ((val = *addr) != 0) {, C% X9 s* ?) z
                /* Restore the original data before leaving the function.
" e' s: |% b6 h6 b" Q+ Q+ c                 */
8 B2 u4 m4 T+ X& ~, u. |                sync ();
2 p3 H) G' z4 L0 Q                *addr = save;
, @. e8 E5 h* T3 y& P                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
  a6 V4 Z0 @( p1 ]; _                        addr  = base + cnt;3 E* `" I; I- x! o1 e5 R* {" M" c, g
                        sync ();# w- t) R: W% y/ [) U+ ~
                        *addr = save[--i];
& o/ Y$ K! T  {8 H% h( R                }
2 b+ X# B, D4 f2 s9 [- h+ Y                return (0);! o' t" A/ H; }) S# K
        }4 U7 A8 J4 _3 W8 [# x

% z. k% ^$ J. o; ~        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ P9 B1 P) h( F3 j% |% v) D: {                addr = base + cnt;        /* pointer arith! */
7 ?4 U. E+ @5 ]+ u' {5 n                val = *addr;- v; u5 L6 h/ u& W; J$ w( c  e9 l
                *addr = save[--i];
3 s+ O+ a1 J  P                if (val != ~cnt) {
+ r: D8 @4 p$ b: K- r$ n3 X" C                        size = cnt * sizeof (long);
0 X# C, J& H$ u7 ~3 r, t6 Q# F                        /* Restore the original data before leaving the function.
, a* r( t( H/ D                         */! o! P) B  u/ }/ H/ V5 A6 C, \7 |
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ L* e0 S, C! D  Z& i5 Y, e1 N                                addr  = base + cnt;
1 M7 [) g1 ]: {6 o6 N* r# k4 m                                *addr = save[--i];
( v0 ]3 {) m3 u4 L$ r1 P                        }1 \% A. u' b/ y8 H- S9 I3 h0 |
                        return (size);
2 x' U1 [6 y& {  m, j1 C+ Z( L) r; W                }! B# t( l* D' N" D9 [  D6 o: T0 X* K
        }
5 p/ F& B  v( z$ c2 {$ \) T. ~5 N
9 q8 p0 n9 y8 T* q: A, j7 E        return (maxsize);# D& S& ?* |1 F) b5 Z
}
, C: o% j& ^  {! N9 O4 i5 Pint dram_init(void)% j9 ^. c4 F( ]9 s- _* ?6 _- @4 Z1 I
{& o! c) {& n! P- a4 y6 K. W) R
        /* dram_init must store complete ramsize in gd->ram_size */* s* s! g; D, G- N" R* e. ~! m& R
        gd->ram_size = get_ram_size(0 R) p1 K& p/ z( p6 x) q) b
                        (void *)CONFIG_SYS_SDRAM_BASE,
+ h+ C4 u$ {1 u1 Y6 m                        CONFIG_MAX_RAM_BANK_SIZE);8 }. L3 x/ p5 i# a1 K
        return 0;
$ k% Y9 t/ S& l: u5 U" ~+ ^}
; h  A. ]' n/ I% K% U) {+ H; F- B. E" M$ s# {: }! o7 T1 ~

  A8 _" M( b: h1 r, U1 ^$ B7 w* _9 l7 m. ]
2 B9 z" f/ |3 f  Z  k' x
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, ?0 m0 d" ^% T+ Z6 P+ {0 D. }: e9 ~! `0 g
4 W: d$ {8 S7 W* f/ @
& g% U9 w* C' G- L  F
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-26 08:36 , Processed in 0.038772 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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