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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit" e7 x' Q2 W( `9 Z4 Y& x
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
: T6 y* ]+ f3 C* F+ o: f7 j这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" t! s0 r2 N9 a2 p5 W9 f. A8 a+ {4 M5 p4 c
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: H3 e& Y3 s3 n) c" O/ L( P  t: @# t0 A- ~) Y+ i- J
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:# j* d3 H9 G- g4 n; @, W
/*" p& U$ W$ m1 c% l; L
* Check memory range for valid RAM. A simple memory test determines
! a* E2 A4 s& I- T6 x; w* the actually available RAM size between addresses `base' and
' B1 k4 M0 o( @/ @3 D8 L$ q* `base + maxsize'.
" I$ B& G. Z% W' o! y8 _4 ~. f* A- F*/
) u* p9 s* }) I! I6 ]& Slong get_ram_size(long *base, long maxsize)
8 v8 T4 |& z8 c7 e' A# G{) W( a: W* `& j& c
        volatile long *addr;5 [0 V) \: `6 N+ w" ^( c
        long           save[32];) J/ W2 k; T9 ]3 q" }  |  H, p
        long           cnt;0 G9 _# i' \; [2 F( `! {
        long           val;
' j7 a2 ]# W% {9 W3 k/ o0 h        long           size;. p0 }- C$ I2 q; j, \
        int            i = 0;# M0 D' u: I: p* O% q: I
% t6 N/ Z/ @8 ^+ L! ?8 B" }7 k) l* v
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ L7 X, n+ Y& q1 u9 r( \( ^1 Q: S                addr = base + cnt;        /* pointer arith! */% ^5 z/ ]* W- _& {
                sync ();1 Z1 Q3 a2 j: ^8 F- g
                save[i++] = *addr;
/ |" o/ w5 H& r/ [# i+ X; u                sync ();7 Y& P/ k7 X4 P+ f0 H6 ?/ z+ S
                *addr = ~cnt;$ [9 _  k- \+ P( q+ @0 c6 u" W
        }
. {+ s: v7 A) x! x/ D/ r/ `
8 ?# X' ^3 B# ~' a8 X! Q        addr = base;
8 a1 l' o7 j5 U1 A0 A% J        sync ();
/ Q7 r- Q  c! _  ~: u' V- `/ {4 X9 U        save = *addr;
/ Z( p: \* c6 E' g' g        sync ();
) ?/ j1 O/ \3 \, B7 V, F5 R        *addr = 0;' H8 e' B+ j( K; J, j) p* V- A; D& z
4 u5 Y* k' y( `% K+ H1 d- E
        sync ();
& S9 \: }5 |# ]+ I7 q; L! X2 |        if ((val = *addr) != 0) {
/ m7 s* c1 B9 \( X2 o) t- W) R1 e# {                /* Restore the original data before leaving the function.4 O8 m3 g; [  ]2 a5 P( ?% g- e
                 */
6 x: B$ }  Q1 \7 H5 x                sync ();
- q0 h! M" v) s5 w                *addr = save;
( `4 E  g8 k" H3 F7 p' l                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ W  T# T! l' K6 G                        addr  = base + cnt;
; p  R# F; ]/ i" c                        sync ();
4 K) N! e1 L# n0 i                        *addr = save[--i];7 A: ^0 N( L; A: j% c: a" O! F3 e
                }
5 |# o3 P# a% Y' @                return (0);1 K; O) z6 M! d2 v* ?
        }
! N9 F% }" w' |# e! \
  ]. ~" i1 f( t! }        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  p7 C8 t% t* C
                addr = base + cnt;        /* pointer arith! */
; K* b, V: K/ I' a: W7 B# t                val = *addr;& j5 q; C  R6 ?! [# ?" U  @, k
                *addr = save[--i];
0 i' U9 A8 C0 u  N                if (val != ~cnt) {
7 [* q& ]  ^4 W" d+ p% c; x: c                        size = cnt * sizeof (long);# E# f" n3 B8 Q8 u
                        /* Restore the original data before leaving the function.
; v" c9 }3 `* m9 D                         */
+ [) o- e7 R' b                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 \$ c, [' X! `- E; M                                addr  = base + cnt;
2 `" W8 p! K% `6 I! g2 Z                                *addr = save[--i];& s% W3 o2 E8 n1 l- g
                        }
' G4 {9 ?/ x( P' w/ ~) @                        return (size);
; k% {0 c# ~% N( Q3 x" u* \                }
  q3 ], A; c+ i" o0 m        }
. i% |$ r: k/ v5 ^
$ |! l3 |+ G7 z( d8 y. f. y! e        return (maxsize);
1 r: ]: T) \. s7 N6 i! w5 p7 e}
! k2 ~0 L9 X" }9 O3 Cint dram_init(void), A( a0 M9 V& e
{8 P8 S6 @& M& L
        /* dram_init must store complete ramsize in gd->ram_size */7 F2 V* W! T* }( o- M  i9 m' x) L! C
        gd->ram_size = get_ram_size(2 q7 K5 l+ R& X, z4 B
                        (void *)CONFIG_SYS_SDRAM_BASE,
6 L- q$ ~7 E6 d  V6 h                        CONFIG_MAX_RAM_BANK_SIZE);8 l/ z8 d2 }! B
        return 0;+ Y6 f5 A, P+ e* k% p/ V7 z" ~
}3 g$ @' R. z2 x4 m. E- Y$ w
' a8 o# P3 z; \& b: [+ L' {

  L3 M, @  L8 @( N/ o7 K! G, V8 B8 _) y& m! U& q

" R, i3 }" M0 Q# n- k0 u2 i/ pFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!: }$ ?' Z  o4 T
3 z* P/ B) w0 O0 Z' v

! O1 b3 I) {% w% X
) s. g% u7 l6 ~1 N8 s; b
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-20 00:29 , Processed in 0.038285 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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