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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
! r. R8 P4 h/ U, G核心板2:DDR2 256M Byte   NAND FLASH 8G bit: D3 w2 u" D; K* N+ L
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?" U6 I0 j2 [1 _) u- u! Y

. L9 J. e# ^$ p# V1 q- s2 j% m是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
, \1 o8 }7 \8 q+ V. U' Z4 b6 r* ?( m1 G% s- e  h# B
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* C, E0 b4 `4 X' O5 Z/*# u: |# w/ m  Y' l2 a" z
* Check memory range for valid RAM. A simple memory test determines
3 e  x/ b5 o6 K' ~* the actually available RAM size between addresses `base' and
7 _* j6 s3 `' p& A. Q* `base + maxsize'.) P) O+ {# N' i* V
*/
, W0 {4 \" p3 z" j. blong get_ram_size(long *base, long maxsize)
' l. [( Y% q) N{1 b3 E' P0 P+ z+ [3 i& J& }
        volatile long *addr;
9 X  t! ^; @6 E( H9 e# p& W        long           save[32];6 f% e, }) e* v
        long           cnt;
% Y2 S2 C3 L( A( W+ w8 g        long           val;
8 e/ s5 D2 `% r& q7 w3 e        long           size;
  ]' D( f! _: u$ r% |0 T4 j        int            i = 0;
9 U& @' p+ [  E0 |
) C5 V0 O( T( c  F        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {1 k0 E' H7 }" E7 |' t
                addr = base + cnt;        /* pointer arith! */& o( ]; Y& Z6 y4 ]+ u) h; A
                sync ();
& Z2 s/ A1 X  Q& _+ y                save[i++] = *addr;4 d% p% k1 j2 c* q: z( n
                sync ();$ c8 L7 K( n6 Y0 c, u& J
                *addr = ~cnt;7 a- B+ q9 C% Y/ k8 J$ b
        }
7 p: O+ a/ K5 W' Z1 L1 c8 H7 [/ A2 h, o4 T- g& i$ H% p# o
        addr = base;$ I& \% U* T3 S" H( M
        sync ();7 A) K* |4 M4 u
        save = *addr;7 E, }  q' ~- e! g9 @  ?
        sync ();
- }* \3 `: o3 w- u# x+ a4 I        *addr = 0;
* _0 [- f) s/ w" t# c. ?4 v& R' v1 X' \& F
" s5 s# J8 G4 ^- ^4 r' C, ^% c        sync ();
& C$ a  M* s  Y+ L/ z" j        if ((val = *addr) != 0) {
# x1 ?! j: u: @. p8 M                /* Restore the original data before leaving the function.
2 J% Q; o' Q1 y. e! h# \3 O                 */
; s- y6 l4 c* V' H* e/ s& l: l                sync ();: k  o" Q0 s8 a0 q7 I% m4 G
                *addr = save;
' X# D$ B' y: d6 H, p4 q                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" }5 |5 G6 s$ ?2 Z& Z' s
                        addr  = base + cnt;
% b  o2 W2 T) Q! G3 d; Y: \; Q                        sync ();
( u6 z( I2 H! F: h) Y! z' \- ]8 ~                        *addr = save[--i];
+ b. R" t' \+ w" {                }
7 m, K: s6 |& b& Q                return (0);/ W2 i" o8 O3 S1 o: g0 h4 Y& C
        }
( \9 E8 K1 e- O- V" E, V
! U, a" [! {. Y  C  h8 J$ ]9 x. A3 R        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. I) j) D3 W1 p, M, C* R4 L7 k
                addr = base + cnt;        /* pointer arith! */
0 H0 O0 i( d! l7 d( Y- {                val = *addr;  P% I5 _1 C" N/ y8 U3 B
                *addr = save[--i];" Y9 ]9 T8 G  F1 l6 L' w1 ]
                if (val != ~cnt) {
, L! d6 Z" D- d' {5 Y                        size = cnt * sizeof (long);/ Y1 `6 j3 o# A+ R6 v
                        /* Restore the original data before leaving the function.
# ?' v! K% A2 y0 j                         */: \8 i) z' U. r5 h
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 @2 C* Q* s; L- b                                addr  = base + cnt;6 I3 y0 R  E3 E9 b  L
                                *addr = save[--i];0 z) H) ?. L0 T4 w- \
                        }
) `: y4 H) ]4 N& _6 D& B, O, u                        return (size);) F, B; f6 [) G1 Y; _& ]
                }. q8 [+ h% j5 l
        }
0 W" D" M# U2 D1 _0 ?# [0 x
: O7 y) x/ L  M' p        return (maxsize);
+ \2 F2 P8 v! A7 H}
/ M  R  {0 n3 pint dram_init(void)4 Y* J" s: d# r: j, I/ n3 d8 s
{
( G" k- d' _" i5 ^3 }) E        /* dram_init must store complete ramsize in gd->ram_size */; [" u0 D' C# O, X
        gd->ram_size = get_ram_size(
5 u5 f0 U6 T/ _* l                        (void *)CONFIG_SYS_SDRAM_BASE,
  d6 b6 }& a% M3 V! |/ P                        CONFIG_MAX_RAM_BANK_SIZE);/ Z8 H7 e) R8 W
        return 0;
7 ^5 @/ @4 S9 Z: M. ]- X4 {+ `% P}9 Q# z5 Y* ~" h" {- d
) Y. [! t# k: F& i  u& ^
4 T  q" k1 L% F9 J  h* K
% \$ c6 ~. I% a- u" I- B9 t& z

: K2 y; e' W  |+ W3 m& iFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" i& f$ L4 z% M8 H7 p7 y6 Q$ {4 _0 N( q$ s9 q4 z5 ]% q
& V: r& @- P' Y/ s! S) r! I8 T3 D7 _
0 C3 ]0 ?/ @8 I. Y4 B
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-26 06:00 , Processed in 0.038267 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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