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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
$ j! f! s1 w. p4 m核心板2:DDR2 256M Byte   NAND FLASH 8G bit
% G* V1 x' I# V这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?2 T: M. W% b: k
$ F3 t/ i( ^% I1 X% @$ @' O
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ m  C# p0 m9 R& J: R! [
0 E6 R& _4 b$ Y- X" l, e1 j4 H/ n7 M
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* _- O( `4 U- p8 Z/*8 y( P: H0 ?: d8 P6 R
* Check memory range for valid RAM. A simple memory test determines/ n) Z' C0 b$ ?6 z1 X
* the actually available RAM size between addresses `base' and( I( ]9 L" M, A  X' Z; d. m
* `base + maxsize'.
. f4 }1 d2 Z' e* ]/ D. T8 q( G*/
' r1 H! X" f5 ^, D% ?5 |+ [5 h$ Klong get_ram_size(long *base, long maxsize)' X- m6 z# ?( O: v! S
{
& {6 e. U/ j& V' U" X6 I6 ?        volatile long *addr;  |5 X1 b7 r: Z  U" O9 ^
        long           save[32];
* q/ u6 i( F% A: T        long           cnt;
/ R9 v. z; f1 G4 I- H        long           val;
- U( l6 r3 z& i/ W* A; o        long           size;# r  G8 j& W  `
        int            i = 0;; y. @4 I. @6 C0 ?

( ~3 P8 r* _/ W6 {7 F) c        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {2 R# W* G9 G/ z% H' A: ?
                addr = base + cnt;        /* pointer arith! */* z# F, I5 R# P5 U* `
                sync ();
8 c' T! ~7 p$ n                save[i++] = *addr;4 h+ Q4 p; ]) p9 s
                sync ();
% D! E- g- g6 j; f                *addr = ~cnt;% B4 \) R& l0 y4 T
        }+ T# m6 z$ v( f2 x, p
5 T$ l/ c: X- W* P- F) k
        addr = base;8 L/ m! y' m* n
        sync ();7 h6 o8 I2 T# c5 i& L: j3 ?
        save = *addr;
! L7 }1 b- O! S" h3 j% C( ^) j        sync ();
: e# t6 O* i# j1 B+ R# ^        *addr = 0;
7 |" @  m/ {! R* Y, Z- a# ]
* ?! A; g' k) i# i( e& V& |        sync ();0 K1 G* Q) |. D7 ?: {  V
        if ((val = *addr) != 0) {
9 f1 O4 Z( m2 F) }+ |5 _                /* Restore the original data before leaving the function.
7 Z9 d* T9 e2 k: k1 t2 n* v* K! ^                 */
7 O6 z) Q0 @# r8 u# F+ ^                sync ();  t+ O* N! Q! e: L, G
                *addr = save;
6 W6 e# S8 p" a8 [; M                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* D/ K& r; U! N' _. A                        addr  = base + cnt;: f! F& ~# `* p0 L# a
                        sync ();3 S. |7 Z* _- I; J- I* d
                        *addr = save[--i];# D* n' M' z# C9 w& a/ ?6 D% V
                }. ]% m# U! K/ v2 j1 E
                return (0);! h2 {7 t. N& E
        }
! u4 o+ d  M- M+ |1 a( V0 J7 C1 W1 }' w2 ~- h' S; C1 Z/ N
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 ?" ~9 R9 z4 Q/ \                addr = base + cnt;        /* pointer arith! */. F5 v/ }1 Q/ `) M& m7 I
                val = *addr;
# x  q* ?/ S: F                *addr = save[--i];" K: U. p) E* ]: B! X
                if (val != ~cnt) {- L, C0 U  a2 T: e
                        size = cnt * sizeof (long);% g% T% O9 ?* [/ u) I
                        /* Restore the original data before leaving the function." i" @  i$ O* B8 S: W% E: {
                         */
4 j9 D. S# P8 M3 |" G2 W8 N/ d- N                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 T3 ?+ y5 v8 w; O- b1 t( K- ^                                addr  = base + cnt;
1 Y+ d5 P. f1 u% F                                *addr = save[--i];" m5 _+ x; [: E9 {( L  g( \
                        }
4 E+ D$ S) o* C/ ^% ~" w  J! u                        return (size);  l, T* T  a0 r; q" ~
                }$ z8 F5 Z  m* s( P
        }
: c- }, H  s1 E& l
0 w4 x( r" j4 Y5 Z1 q        return (maxsize);
. x: M/ S1 r! @% @% g}3 K* t% b. \, E% G+ w
int dram_init(void)
9 D& a- }4 Y9 H3 U9 W7 w7 X3 ]{" d$ N# f& R, E1 ?9 x; J0 t
        /* dram_init must store complete ramsize in gd->ram_size */, E3 Z- t: d& J! [, b4 B4 J0 l
        gd->ram_size = get_ram_size(
; k! L8 R3 B& j$ s+ n                        (void *)CONFIG_SYS_SDRAM_BASE,5 }% k& ~/ f% R  i
                        CONFIG_MAX_RAM_BANK_SIZE);
6 h: A% Y! B( O0 m+ E4 v$ z        return 0;5 W. e* l: {0 X3 D# D% z  @
}
5 }0 K3 P+ [9 ], o
- B- A" h$ o5 E$ x  d# b
9 N) U/ u4 E) D9 Y
! H  l: j2 g& o5 z3 D, c2 X& u) b  L1 Z, r( ^9 o8 T. f1 p
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!% c1 a  d) }0 }% g

& o$ V- \# U6 z5 h( p/ o
$ u, N9 A3 x% L- g; j
8 R: A" a/ E8 t1 h7 o
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-9 15:04 , Processed in 0.050240 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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