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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
+ x' A/ f2 G/ Q$ l+ O% I核心板2:DDR2 256M Byte   NAND FLASH 8G bit2 ?' A, }' D1 U, H- u6 Q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?; {7 ~3 L4 C0 }3 ^7 y3 k

5 W) v6 H' O3 s是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 J( S5 ^' }) V$ |. j+ w5 m* \% B
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:- j  a  \* B' T) J
/*7 u1 @9 |1 V. p  ?
* Check memory range for valid RAM. A simple memory test determines: m/ O9 L0 y; h- }* D$ b  H! U/ L" E
* the actually available RAM size between addresses `base' and) x8 B# |' W/ ~$ n9 g3 w: }- Y
* `base + maxsize'.
/ L9 m* ~5 n. m; `, f' {" W* x( B*/! d+ H: I  j/ U& W: o9 ]7 Q
long get_ram_size(long *base, long maxsize)5 ?, j: n9 o8 s
{
1 i/ H: A2 s. X% D% W        volatile long *addr;; O7 f: B( l& o. z5 Y5 R( y) ~, V, \
        long           save[32];" |/ W0 p2 C# P4 p' g( Y
        long           cnt;7 x7 [" W! ?8 P1 U9 @5 r
        long           val;
! P4 L# ~$ V# M" ]& f2 s* d        long           size;
" Z, x9 k0 ?- ]7 d" z/ m        int            i = 0;  \" ]! N2 `, m3 S

9 d4 S, k8 w0 g0 x# p        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {# g( _+ _( |& d* O8 M2 Q, S
                addr = base + cnt;        /* pointer arith! */7 P* P0 J( s& R+ i4 O: [- n
                sync ();# A1 {3 I4 k7 u7 b& I4 C! [
                save[i++] = *addr;
/ f# I9 c* s7 y; W  B                sync ();& @, d! u, k0 L  e; Y
                *addr = ~cnt;/ Y3 H9 w* k( _# {' g
        }
$ w* ~% U# X; d- L! {
9 `, t& ^5 E% F0 m1 `        addr = base;( J8 Z& K0 Q  T( x
        sync ();4 G4 W% Q# Q, Y/ Z: h
        save = *addr;5 T- A  h' a' C, E8 U
        sync ();% c# t; T' M+ K( A- x
        *addr = 0;8 m4 C  D6 S, k1 Y) @5 @
( d' x. O: R% B# X  S# D
        sync ();1 S% F9 X+ R9 h' i$ |
        if ((val = *addr) != 0) {+ Z4 e; ^; e- a2 x  Q
                /* Restore the original data before leaving the function.
: R- a% E9 @4 Q% D- C! P: X                 */
2 Z8 ~; p/ |6 e; B                sync ();  p& }/ ^( {; s, u- j6 W  m8 V  M
                *addr = save;9 u# w) n5 C2 B/ [0 K6 N5 f) k' j
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! J9 k) \. Z' ]8 h3 \                        addr  = base + cnt;+ w& g- J8 |. _) f; Q9 j
                        sync ();
$ _% T  i/ Y5 G8 E                        *addr = save[--i];
8 [( d& @' n8 W# f/ W( W; S                }$ m( u, I: Q5 s
                return (0);; Z# ^0 u- g1 C/ u
        }0 }' m; q% D' I3 J1 V6 v5 \
$ ?& @4 Y# w* Z, a
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; A0 J6 d9 [. R4 S, X8 s
                addr = base + cnt;        /* pointer arith! */
6 B& j: q) X. C                val = *addr;
! C' r2 v/ ?  r& X                *addr = save[--i];
, y1 B2 M7 `+ X; O                if (val != ~cnt) {
5 G* {$ Q% B  o# k                        size = cnt * sizeof (long);
! T, P5 K$ Y- @8 [, U                        /* Restore the original data before leaving the function.
1 c3 C' o3 W4 U$ k$ g' a, _                         */6 ~  T( i* Y( X/ j4 E
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 U! T1 D6 o/ I! i" j) G# K2 u& I                                addr  = base + cnt;4 v! x7 U" _* m4 {& c
                                *addr = save[--i];+ L( y1 r" P  U9 f2 N
                        }$ n! ?" `* F; K* Q) k# P
                        return (size);6 a" H- b1 X2 b5 q: o  A
                }
7 z8 }- I, j- S4 ^/ e' _        }) C6 S$ u  X7 P3 k$ Y! \
* a: v7 Y/ n  N
        return (maxsize);/ }# X3 G) J- s# C+ z+ }% W
}4 I  _; K1 W  |4 r
int dram_init(void)
2 ?; s. q# O0 @% N& G; ~5 }{8 O6 f- u# v' ^# X! D% Q
        /* dram_init must store complete ramsize in gd->ram_size */2 M: b- b& {; j, Z% [- w
        gd->ram_size = get_ram_size(7 Y. Q8 f0 Z- I! F2 e0 y, S* v
                        (void *)CONFIG_SYS_SDRAM_BASE,8 A6 r6 s7 D& O. S( n# d
                        CONFIG_MAX_RAM_BANK_SIZE);
$ P! A3 X6 F% Z, W$ n) Y        return 0;
- ~# r$ ]! `- m& E$ {( N5 m" m, s}, |' g, \' {+ o

# p7 }/ @+ }, S- h- S5 i' |& P4 Z$ r/ s( s$ p' n
' z# {) _# o6 g
+ g  S9 y1 L6 O+ v  N; q: [: M# x
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!3 q: d8 t& ?6 ~: L) y
8 h6 C: n  M8 H: k6 _% L

6 J9 ?; l, y9 _9 J9 B3 X: ]1 K

( j* Y( Y9 P: B
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-25 20:54 , Processed in 0.039291 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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