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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit6 s! @- a8 Z' c% D
核心板2:DDR2 256M Byte   NAND FLASH 8G bit$ W" v* W; f* I- R% k* w' i& R
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& ]% O( z5 m5 W
) m5 a% R6 N3 D' U0 `, G3 s' c5 x是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
+ y7 ?2 s! W, N8 i$ M  I" }: ~
3 i' w8 T( }! }5 _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:9 \* R0 @: P; s: `2 D/ ?4 N
/*, a4 n! t' a; ~- t! L! k0 |9 `
* Check memory range for valid RAM. A simple memory test determines
1 g. y" v1 Q0 g( L- V  ^4 t9 c* the actually available RAM size between addresses `base' and& }8 Y" F6 x3 y0 s5 h, q
* `base + maxsize'.. V! M, [! E! J' x7 }" v& n
*/
; D2 f( q2 C, T2 Qlong get_ram_size(long *base, long maxsize)
1 f/ g7 e' c6 E9 T4 ~{
) S: k+ t: v: Q8 `6 T1 J        volatile long *addr;
/ a8 Y" w/ `! Q: P        long           save[32];. {$ @; P* ]6 S/ ?( N
        long           cnt;0 w1 h. l0 p3 U. F( l
        long           val;5 k5 _# X& _2 m; v  Q' T
        long           size;8 V2 z; V% R1 k. k1 \% r
        int            i = 0;3 I" ^  n. x6 g6 P( U6 Z7 W: o6 I
7 R* b2 X  d1 W* q1 F9 }
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ V5 |  }1 k  }* `* S                addr = base + cnt;        /* pointer arith! */
' c/ S  l7 q4 \% H' A( l  v/ H2 {                sync ();6 x) Q$ k% M( B2 w8 r; z# N; Z
                save[i++] = *addr;
8 s5 X" C, g! V  b7 A0 [                sync ();
! P& }# M6 U+ F7 C/ n# ~. T                *addr = ~cnt;
+ i. ]2 ?& v- l8 t+ Z        }9 Z% B) D5 K4 q7 r9 F$ X2 ~& ]

' k! i6 T8 a6 B; c        addr = base;
' \$ y+ c2 A* j2 I        sync ();
7 O" N: |6 O) s3 x. b+ Z+ U        save = *addr;( w( T) k4 R8 T& x: s
        sync ();
9 \, q9 O% X& v# L        *addr = 0;
" j7 \% R" C' \. ?$ T  i3 C, B
( O9 ~' X0 V6 c) }' {) u. ?! _, K        sync ();
) e2 a9 C" ?; f& T, V        if ((val = *addr) != 0) {
8 V' l( @; m% t  j; V1 A                /* Restore the original data before leaving the function.
1 }2 c0 Q; s; `! O) d4 U                 */
- s+ E- \4 D& I* w. v8 [; x                sync ();3 }# ?3 k* B% a/ t" u- n4 ^
                *addr = save;
' M6 |' K4 T  p# k# [; d                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {! f+ s, q" e! ?# e$ B7 e
                        addr  = base + cnt;
; H% v- t  P# }; y' g0 p3 W                        sync ();4 i# b" K: \* f0 x) x% Q
                        *addr = save[--i];
/ F8 ]7 ^, n8 c6 o                }
! F/ ]$ F( }" o! D4 L                return (0);6 g& {3 l2 R; N3 j; T1 @# i
        }
: B6 b) @9 o7 }0 y/ o
0 ?$ C# y% n- _9 \1 p        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 }" g) s! l4 F, E9 W9 h3 x1 Y                addr = base + cnt;        /* pointer arith! */
3 Q' a$ p: {3 }( v- J; b8 ~1 s3 s                val = *addr;) _) _8 e# I  ^4 E7 x! ?( c
                *addr = save[--i];
5 o& d- n) B4 T0 {                if (val != ~cnt) {1 |- P) p* u) k9 v5 S+ l+ @$ i
                        size = cnt * sizeof (long);* l" ^) V; Z9 K# @3 G2 M: k4 W
                        /* Restore the original data before leaving the function.
; x+ n9 t. h( P5 Y8 f                         */5 p. |* U" U$ H- u, [
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {4 h+ C( M: P8 N: g" \7 g1 u" h
                                addr  = base + cnt;$ ?" T5 X4 L( S
                                *addr = save[--i];
( i) |" j2 t  F8 e1 M6 z; Q5 P' q                        }
/ O. y) W0 z, s7 B                        return (size);
# N/ ^* y( t9 _* Z  K                }
1 t. T& I( n4 s        }& Z- N8 L, x# o* s5 }
2 D2 o* ^- E* |+ {- J
        return (maxsize);7 c: C3 \. t/ b; Y4 r0 Z; a/ j
}8 m6 H" C% S6 a& q
int dram_init(void)$ s8 p( @+ g& F3 \; I
{
$ p1 g7 X& Q: t- i3 a$ j( E        /* dram_init must store complete ramsize in gd->ram_size */
& T& U) s- V, J# D- Q( _        gd->ram_size = get_ram_size(1 _! e! u4 i* N
                        (void *)CONFIG_SYS_SDRAM_BASE,; c! S1 x( }! ?+ e0 P
                        CONFIG_MAX_RAM_BANK_SIZE);
$ A) z& P, A9 z# M        return 0;
# y  V: `, e( }: @4 E0 S}
. ?" P: C. R, K% J- v) Z5 i6 c4 R- Z$ w% s1 Z& p

  h5 D; }6 A& `0 T% [
8 T' ]8 A  L8 S, K9 T! U+ |$ B
2 h# p  N/ h" l: E9 C' hFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
9 ?; c1 e+ Y# ?- `* v+ |6 N$ k( w# x& M4 i: k* W* L

2 C; a! @" z& f2 A  F- j/ i$ n
6 v6 h# m, S3 q8 ^  H+ `
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-30 22:11 , Processed in 0.047564 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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