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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
, }* s4 L8 h! \  K3 m: z: m6 \核心板2:DDR2 256M Byte   NAND FLASH 8G bit) P9 q' d* {7 W2 t, m( c+ ^
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% L2 X; i' S% @9 O, g
, r( D( T  m# C& \1 V2 J3 @9 P% ~是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' F: ]( b4 ~9 @" S$ T
; i& P  U- D# T, k# e0 M
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 @$ o. |* `7 v$ l% V/*  h, F+ T& O1 b
* Check memory range for valid RAM. A simple memory test determines
( z& h& A% y: l8 y' N* the actually available RAM size between addresses `base' and
6 G; N- I5 d# C1 y& F$ k4 }* `base + maxsize'.) t; @! X2 ~3 y, V
*/4 O- B4 T2 i' c) ]/ \5 R
long get_ram_size(long *base, long maxsize)
+ E! c$ g0 }( A6 X+ S) `{- A  v, U, e' Y. X* D
        volatile long *addr;
6 G/ n' h9 i) H: }( P% L        long           save[32];5 a7 J! R( p& `& O4 W- \7 N( n
        long           cnt;
3 Z: W: z# I, {8 U# [        long           val;6 a+ a$ }+ L; e8 R
        long           size;
" g9 _1 d3 m# h- c+ V0 j        int            i = 0;. J# d6 O* ~( l( l" R" V$ c, M& l
0 p) ]. G. M& M3 q
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {' h) t  W/ w- ?
                addr = base + cnt;        /* pointer arith! */5 @$ b/ B3 z) Y
                sync ();% v+ A( e' W4 J( n7 @* R
                save[i++] = *addr;; v+ d) r/ A+ v  P* ]: f& \: k5 ^% A
                sync ();& U2 C1 }3 p* m- ?# r+ d
                *addr = ~cnt;
* g( Q% ~6 w! _. z( K. J        }
+ Y; t5 d* s6 G: G9 z; p: b" \3 K! y' D7 ?- H
        addr = base;, K# C% G, c; ]8 a
        sync ();- C8 H) j; G6 l' q# @; c) c9 M% J
        save = *addr;6 r1 v0 t4 I4 @( p3 }
        sync ();
/ i9 b, ^1 Q! ~% y- N* \8 g. p8 F8 L        *addr = 0;
* ]* K: D5 e/ f$ i' R+ q& l- y- w6 n- h& T8 k0 d# `9 H
        sync ();! m9 ^, S, x, |2 [+ o  d
        if ((val = *addr) != 0) {, J5 i# |! I5 N  x3 E8 u$ a
                /* Restore the original data before leaving the function.
3 F) k0 s: t/ U; g! i! F+ |2 n                 */. e- O- u$ H, w" |* Q4 q
                sync ();
- X1 {/ W+ l6 A# c) g! K( r7 E: t2 ?                *addr = save;& r7 e+ t) [: C5 l$ M: U
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {1 {5 |# L& |3 g
                        addr  = base + cnt;( g2 p( J" I7 a
                        sync ();
9 |8 G' c  |! m1 d2 ]2 `0 K8 ^                        *addr = save[--i];
3 f- V! {* c9 x  q" U                }
1 ?* F. S2 u# Y1 a; X                return (0);
, X$ j6 y+ {  W+ {: P! ]! [# v; m        }
! y; {/ S" e" `+ L
, p0 r5 P8 N/ Y        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  ^- W# Y- j7 _  W) T
                addr = base + cnt;        /* pointer arith! */
" n  v( R) @/ W& O- u                val = *addr;
& V3 g# `2 \' O                *addr = save[--i];
6 y# v) o6 z; [" r7 P7 z/ b3 C                if (val != ~cnt) {
- R9 C, C* c9 j2 E7 f9 L                        size = cnt * sizeof (long);
" Z0 n; m; \3 B7 S7 E                        /* Restore the original data before leaving the function.! Q; B5 R$ q$ }
                         */1 }) T2 w% I% W5 K3 e  H
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: G8 r- ^4 y0 |: u# H
                                addr  = base + cnt;  I& E$ x) a; P6 r9 i5 q6 O
                                *addr = save[--i];/ H5 g$ y2 t) T, U; o5 V! v% }3 n
                        }. w2 F2 C8 S0 y7 K- x
                        return (size);% s8 N& L+ Y3 q) g) o0 z
                }$ ]7 c: g- |+ i
        }. J. p. u8 T1 q: [3 S+ u

6 m% [8 L6 ?6 N2 o        return (maxsize);
9 O2 B; i8 ^' u, i% h2 l' i5 o}
- D4 r* \4 b6 D' T, l1 Gint dram_init(void)
2 A$ x8 j' N/ }5 L{+ I  a- Y6 n* h! F+ X6 M
        /* dram_init must store complete ramsize in gd->ram_size */  _, ?, D4 b6 Z' q% {
        gd->ram_size = get_ram_size(5 W3 g2 f' e6 @4 b( B# J
                        (void *)CONFIG_SYS_SDRAM_BASE,8 u( w6 M# \! I/ \
                        CONFIG_MAX_RAM_BANK_SIZE);
8 X7 Q( _  o2 y* U! M0 w        return 0;! l' `, C$ ?5 ?1 a* U$ |9 D8 Y1 u
}
1 b, P" L, j2 N7 E5 i7 N3 w* C5 v4 C- U; Y# R1 \
! F0 U8 b  ]8 o/ K3 L$ n8 D& r% f' x

4 ~8 a# V$ y  \; L/ ~) [6 P. C. ~4 Q  Q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' `8 h2 ^1 D1 T7 F' {: g
( c( B  O& v) _
( W4 L, \3 b; b7 a
- B; q" p) p7 F+ a
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-20 18:54 , Processed in 0.045978 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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