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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit+ L  H3 Z, j, u' }: A  {
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
' e/ K  W6 ?, z8 ~% R$ ]这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
  c6 p7 z* K# h! L, F
, {: ~* {! r0 o% q# ^是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 W- {7 s8 G; s& K) K" u# [, D$ \
2 o% ~) n6 z5 U* K6 A
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- \; H5 F. g* L: m' V/*8 j: ?; ?- I. v) j3 `* x# B
* Check memory range for valid RAM. A simple memory test determines
$ M, N! ^/ q/ x, B7 G% t* the actually available RAM size between addresses `base' and6 f) ^2 i/ z, L6 I
* `base + maxsize'.
' ?' r7 [0 T' Q' E*/8 Z; Y9 S+ v! `/ F# h
long get_ram_size(long *base, long maxsize)
0 p3 O5 H0 `, w{. j$ Y8 D/ k6 n
        volatile long *addr;
" |- u2 p8 V3 E, H3 g- f        long           save[32];: H; Y. e) a' c+ g
        long           cnt;
/ n; B; N' i' r' Y0 K        long           val;
8 e& H  L( O& l, {' b# k5 m! R        long           size;
. h9 h0 E0 }1 Z; F. [        int            i = 0;8 M7 v+ e$ R& N/ ^  m

: l, ]$ o, m( |* j        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 g" w- u! r/ \# H                addr = base + cnt;        /* pointer arith! */2 Q. ~6 d1 x2 t* u" v( k
                sync ();% w: K( b+ J  p  }3 P5 C, D# d/ i: O
                save[i++] = *addr;
2 M7 w3 @* _. x# X                sync ();
  @1 g3 T( u" F8 x/ I8 x                *addr = ~cnt;
& s1 i* p7 C5 c/ X7 m% I        }$ k# D1 L1 O( Y6 y( c8 \

( m+ e3 h1 ~2 c+ U6 B. z6 ^$ d$ |7 ^        addr = base;
/ I+ X- t8 q9 p        sync ();
+ V# h' G9 I* K, {9 U) B5 _        save = *addr;
1 Q. g: H7 K3 V, m        sync ();7 b& n- E0 w5 o
        *addr = 0;* g! M6 `" ^) ^( N  F# a  I# K
! _4 U/ |0 E4 H6 B& n8 O; u
        sync ();
8 I8 M4 e0 c0 c0 z        if ((val = *addr) != 0) {' {# D& ~$ u+ q+ T  Y. \
                /* Restore the original data before leaving the function.
( T. N; w) ~9 R; \6 {5 A8 O) x; T) m                 */
0 Z' z) I. a0 r3 {4 a+ e                sync ();( z! y! H! h$ B6 `" p
                *addr = save;
2 q! B9 o  t( V                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {% r- [1 z* N. F4 ]/ M/ O- `
                        addr  = base + cnt;0 }# M: H3 l: u% Y4 x% e
                        sync ();
% G& b% `" C! _$ y- U                        *addr = save[--i];, ~9 G! m* p* C- Y3 f; Z: j6 _% R
                }
. w  y- a2 n8 z/ Z2 q% \                return (0);. {: V9 q3 V6 D3 v3 t8 j
        }1 M) W  {$ w9 ]1 ^/ R

( l9 T% ]' J- N# E* Q        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, o% P$ c2 v/ P3 i- f) C; d                addr = base + cnt;        /* pointer arith! */2 \/ n% q; k/ ^* W
                val = *addr;; {* Z6 \" l- \
                *addr = save[--i];; ]( E( K6 V# Y  l2 g
                if (val != ~cnt) {
' Q1 }  m& M# r$ c% J; l! Y                        size = cnt * sizeof (long);
- l" i8 E- v( q" W7 [/ _! x                        /* Restore the original data before leaving the function.
% _3 m; E6 x+ o1 E# M                         */
5 v+ K& \2 E' N                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: E1 V7 _4 l  Y* K1 u+ G                                addr  = base + cnt;
8 t  ^: }) |+ _9 q3 M/ ]" B# n' o                                *addr = save[--i];
7 B1 o6 g# w. U                        }
* @" T5 v9 }( p4 e' i2 @" g* r                        return (size);
( \$ Z+ x6 r- f1 [) P' |) \3 d                }
1 y1 S% ]2 i3 ~1 p        }
* H9 o' r4 |6 Q0 l  T
) e, w- X& r, }4 x        return (maxsize);* ~+ Z& d1 }0 I2 s
}: J9 @; N$ a6 Q2 ]; D# K
int dram_init(void)
8 `! F2 x0 S  D* G) E0 f{
7 f2 d0 C& ~) W. q  a* ]) B        /* dram_init must store complete ramsize in gd->ram_size */
* P$ x" G9 B. V5 M        gd->ram_size = get_ram_size(8 p( R7 v9 e! D6 {" _: @+ r
                        (void *)CONFIG_SYS_SDRAM_BASE,4 b& g( l) ?/ x) N* R0 `2 h3 }
                        CONFIG_MAX_RAM_BANK_SIZE);
% t' t( }% R. `  z6 [6 [        return 0;: B( P" G2 {2 L8 U0 ?$ H" K
}1 O6 x" i- v2 ~

3 p2 d! f( o7 Z+ y* }" C7 X' T$ _  u9 h& x

- x+ Y$ G% P/ j  R# O+ k" _7 m6 T: L. j, o; Q) l
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' _+ s( @: e: \& ^2 G6 ]. Q: v" P4 c( I( Q

2 ^- E3 \! W& R! j7 M! Z

1 ^2 [# W; _6 J) d' a  F) y2 e
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-16 04:46 , Processed in 0.041901 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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