一只鱼 さんのプロフィールEE小站フォトブログリストその他 ツール ヘルプ

ブログ


1月21日

AT91SAM9263内部ROM时钟初始化代码反汇编

AT91SAM9263是个不错的CPU,我这段时间在上面跑起了U-Boot、Linux。过程就没有什么好写的了,都一样,就是U-Boot的移植有些麻烦,但我的设计的板子和9263ek相差太大,写出来没有什么参考价值,就都不写了。我拿到的CPU样品是Rev A的,而现在的手册是Rev B的,需要注意的是Rev A不支持NAND和SD卡启动。为了从NAND启动,需要自己写启动代码了。我的板子上有EPROM,并且把它放在nCS0上,我移植了AT的Bootstrap到ADS下面,然后做添加了上电初始化代码。但是我修改过的代码不能公开,抱歉了。刚开始我修改的代码总是Boot不成功,似乎时钟不稳定,也没有好的样例,无奈之下,我只好把AT的Boot ROM关于时钟部分给反汇编了,照着反汇编的结果写了一个,好使了。这个代码在0x400000能看到,我应该不算破解吧,写出来给其他写启动代码的人一些参考。

 

行标号        原始指令                           更易阅读的指令         注释

---------------+---------------------------------------+-------------------------+----------

                b        0x20                           b reset                   ; 复位向量

                b        0x4

                b        0x124

                b        0xc

                b        0x10

                b        0x14

                b        0x18

                b        0x1c

reset           mov      r13,#0x314000                  mov sp, #0x31400          ; 初始化堆栈

                ldr      r1,0x00000160 ; = #0xfffffc00  ldr r1, =AT91C_BASE_PMC

                mov      r0,#2                          mov r0, #OCSBYPASS

                str      r0,[r1,#0x20]                  str r0, [r1, #PMC_MOR]    ; 设置主振荡器为旁路模式

                mov      r4,#0x10000                    mov r4, #MAINRDY

                mov      r0,#0x20                       mov r0, #TIMEOUT          ; 设置超时时间(注意:现在运行于慢时钟)

loop1           ldr      r3,[r1,#0x24]                  ldr r3, [r1, #PMC_MCFR]

                and      r3,r4,r3

                cmp      r3,#0x10000

                beq      0x50                           beq exclkdetected        ; 查看PMC_MCFR,外部时钟输入是否稳定

                subs     r0,r0,#1

                bne      0x38                           bne loop1

exclkdetected  ldr      r4,0x00000164 ; = #0x0000ffff  ldr r4, #MANIFMASK

                ldr      r3,[r1,#0x24]                  ldr r3, [r1, #PMC_MCFR]   ; 读出外部时钟频率

                and      r3,r4,r3

                cmp      r3,#0x10

                bgt      0x8c                           bgt clkdetected           ; 如果外部时钟频率小于32.768KHz,则

                mov      r0,#0                          mov r0, #MORCLEAR         ; 复位主时钟控制器

                str      r0,[r1,#0x20]                  str r0, [r1, #PMC_MOR]

                ldr      r1,0x00000160 ; = #0xfffffc00

                ldr      r0,0x00000168 ; = #0x00004001

                str      r0,[r1,#0x20]                  str r0, [r1, #PMC_MOR]    ; 设置主时钟振荡器使能

                mov      r4,#1                          mov r4, #MOSCS

loop2           ldr      r3,[r1,#0x68]                  ldr r3, [r1, #PMC_SR]     ; 读取PMC状态

                and      r3,r4,r3

                cmp      r3,#1

                bne      0x7c                           bne loop2                 ; 循环等待主时钟振荡器稳定

clkdetected     mov      r0,#1                          mov r0, #AT91C_PMC_CSS_MAIN_CLK

                str      r0,[r1,#0x30]                  str r0, [r1, #PMC_MCKR]   ; 切换芯片时钟到主时钟

                mov      r4,#8                          mov r4, #MCKRDY

loop3           ldr      r3,[r1,#0x68]                  ldr r3, [r1, #PMC_SR]     ; 读取PMC状态

                and      r3,r4,r3

                cmp      r3,#8

                bne      0x98                           bne loop3                 ; 等待芯片时钟稳定

                add      r2,pc,#0x2c ; #0xdc                                      ; 开始别的代码

                ldmia    r2,{r0,r1,r3,r4}

                ……

BGA封装手工焊接攻略改进版

又是好长时间没有更新了,最近工作的事情比较忙,也比较挫折。最近的那块板子出现了多年以来没有的第一次制板就因严重设计错误嗝屁的现象……
后来经过痛苦的BGA飞线,终于好使了;随后也发现其他部分没有任何错误,唉……
看看我飞的板子,我的口号是,没有不能飞线的板子和器件,呵呵。
 
 
 
飞线的过程中,我发现,之前焊接BGA的方法对于较大较厚的电路板是不行的。因为电路板背面一般有较大面积的铺铜,散热很快,导致板子上下受热不均而翘曲。我焊的第一块板子就因为这个,BGA下的过孔断了,废掉了。经过冥思苦想和长时间的搜索,对之前的焊接方法进行一些修改,电路板底面加热不使用风机,而用加热面积较大的预热台。而价格为广大劳苦EE工程师们可以接受的预热台,好像也只有傲月的853A,只要500大洋。下面是853A的图片,这个东东在中发都不太好买到,估计国内的二线城市就有些困难了。
 
 
 
这个东东中间那个网里面是加热盘,两边是两条滑轨,上面有两个用于固定电路板的滑块。把要焊接的电路板放上去,关于芯片的对正什么的还是一样,一般常用的BGA都有0.8mm以上的球间距,而且锡球溶化以后有表面张力,只要大致放上,锡球溶化就能自动拉正芯片。助焊剂什么的和过去一样,我就不说了。看下面这张图。
 
 
 
电路板放在预热台发热盘正上方,尽量让有BGA的区域在发热盘的中心,然后打开预热台电源,我开的温度是300度,等上一会儿,用红外测温仪测量电路板温度,等温度到150度左右,打开风机,温度设定到300度左右,吹个1、2分钟就差不多了。如果不放心,可以参照我过去的方法,用摄像头来看。红外测温仪看下面这张图。
 
 
 
这个东西是东莞造的三无产品,220大洋就能买下,不过个体差异非常大,我买的时候用我太阳穴的35.x度的标准温度对比了好几个才挑出个准的……
这篇就到这里。