開發板下載程序

原創作品:http://write.blog.csdn.net/postedit/7956383    

歡迎大家一起交流學習,知識在與分享。

希望結交一些志同道和之士 

QQ: 474530676

[email protected]


開發板下載程序



啓動uboot  撥碼開關往上(SD卡啓動)


程序下載到nand flash 裏 啓動 撥碼開關往下(nand啓動) 


將程序通過u-boot燒寫到硬盤nand-flash,然後通過nand-flash(撥碼開關往下)啓動,直接運行程序




程序編寫步驟如下:


第一步:
    告訴cpu外部設備的起始地址。


    因爲是在硬盤啓動,cpu並不知道,所給的地址對應的是什麼設備,所以一開始,必須要告訴cpu所給地址對應的究竟是什麼設備。
    一開始上電時,ARM11內核裏的cpu(smdk6410,並不能說成是純意義上的cpu,
    因爲它裏面還包括了,ARM11的內核,而ARM11裏面仍然包括了很多的寄存器,和協處理器,
    所以ARM11也仍然不能說成是純意義的cpu,只有ARM11裏的中心處理器,才能說是純意義的cpu)
    會自動的到nand-flash硬盤裏的0地址開始,讀前8k的程序到RAM11裏的SRAM內存(不是芯片外部的內存)執行,
    所以在這8k的程序裏必須要初始化外部內存和設備
    
    又因爲cpu訪問內存和訪問外部設備的方式時不一樣的,所以在這裏要告訴cpu外部設備的起始地址:
    0x70000000 - 0x800000000


    ARM11裏面有一個專門的寄存器p15裏的c15,就是用來確定寄存器地址的。
    查看內核手冊arm1176jzfs.pdf ,第三章3.2.49    342頁
    c15寄存器的高20位,是用來確定起始地址的,
    低4位是用來確定範圍的,取值在343頁有詳細的介紹。設置格式如下:


    ldr r0, =0x70000013
    mcr p15,0,r0,c15,c2,4  //設置格式是確定的,在344有說明


第二步:
    關閉看門狗


    芯片上電時,看門狗,和cpu一樣,是同時開始同步運行的。看門狗的作用就是,當芯片崩潰時,重新初始化芯片。
    當芯片上電時看門狗對一個確定的變量自動減1,當該變量減到0時,就會重新初始化芯片。
    所以cpu正常運行時會定時的給改變量賦值,防止看門狗初始化芯片,這個過程就叫作“喂狗”。
    在這裏爲了簡單,爲了避免看門狗復位芯片,所以需要將看門狗關閉。
    
    查看芯片手冊S3C6410X.pdf 第34章,1137頁


    找到看門狗控制寄存器WTCON             1138頁
    將寄存器的所有位設置爲0,就可以關閉看門狗了


ldr r0, =WTCON
mov r1, #0
str r1, [r0]








下面是一個硬盤啓動時,不通過u-boot直接運行的蜂鳴器的程序例子:


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//buzzer.S(蜂鳴器)
#define WTCON 0x7E004000
#define GPFCON 0x7F0080A0
#define GPFDAT 0x7F0080A4


.text
.align 2
.global _start   @因爲直接在裸板上運行的,所以不需要保存環境
_start:
bl set_port     @設置寄存器
bl close_wtd    @關閉看門狗


ldr r0, =GPFCON  @這是初始話蜂鳴器控制器的
ldr r1, [r0]
ldr r2, =(3 << 30)
bic r1, r1, r2
mov r2, #0x40000000
orr r1, r1, r2
str r1, [r0]

mov r4, #10
loop:
ldr r0, =GPFDAT
ldr r1, [r0]
mov r2, #(1<<15)
orr r1, r1, r2
str r1, [r0]


ldr r0, =100000
bl delay


ldr r0, =GPFDAT
ldr r1, [r0]
mov r2, #(1<<15)
bic r1, r1, r2
str r1, [r0]

ldr r0, =100000
bl delay


subs r4, #1
bne loop


l:
b l


.align 2
delay:
subs r0, #1 @s --> cpsr Z beq
bne delay
mov pc, lr


.align 2
set_port:
ldr r0, =0x70000013      @設置寄存起器地址
mcr p15, 0, r0, c15, c2, 4
mov pc, lr


.align 2
close_wtd:                  @關閉看門狗
ldr r0, =WTCON
mov r1, #0
str r1, [r0]
mov pc, lr
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


第三步:
    程序編譯步驟:(在虛擬機下)
    
[root@longguopeng 蜂鳴器]# arm-linux-gcc -c buzzer.S
[root@longguopeng 蜂鳴器]# arm-linux-ld buzzer.o -o buzzer
[root@longguopeng 蜂鳴器]# arm-linux-objcopy -O binary buzzer buzzer.bin
[root@longguopeng 蜂鳴器]# arm-linux-objdump -d buzzer > buzzer.dis
[root@longguopeng 蜂鳴器]# rm -rf buzzer.o buzzer 
[root@longguopeng 蜂鳴器]# mv buzzer.bin /tftpboot


第四步:
    通過u-boot燒寫程序(在uboot下)
     1:進到u-boot界面
     
     2:清空從0地址開始,8kb的空間,清空的大小是4kb對齊的
        [uplooking]# nand erase 0 0x2000
        
     3:下載程序到開發板的內存的0x50000000
   [uplooking]# tftp 0x50000000 buzzer.bin
   
     4:將程序寫到nand-flash
   [uplooking]# nand write 0x50000000 0 0x2000
   
5:把撥碼開關往下(nand flash啓動) 按下復位鍵 
(注:程序運行時,效果是不對的,在u-boot下運行時,是響一下,停一下,
                          在nand-boot下運行時,一直響着,所以還需要進行下面的設置)  


      每次都要打這3個命令,顯的很麻煩,可以用u-boot的run命令,直接完成這三個步驟
         1):查看u-boot是否有run 這個命令,可以用help run
         若能找出來,則,證明當前u-boot下已經有了這個命令了
         2):若沒有則需要重新編譯u-boot將run命令打開
               vim up6410/src/u-boot-1.1.6/include/configs/smdk6410.h


                到(大概)170行  找到 CFG_CMD_RUN 變量
                將該變量移到& ~(CFG_CMD_AUTOSCRIPT  | \  的上面


                然後重新編譯u-boot下就行了
         3):確定有run命令後,設置環境變量,加一行:
            setenv wstart nand erase 0 0x2000 \; tftp 0x50000000 start.bin \;
            nand write 0x50000000 0 0x2000


         4):保存環境變量
         5):輸出 run wstart 命令就可以把程序自動燒寫到硬盤了






===================================================================================






顯示如下:    
/////////////////////////////////////////////////////////////////////////


[root@longguopeng /]# cd home
[root@longguopeng home]# ls
[root@longguopeng home]# cd 蜂鳴器
[root@longguopeng 蜂鳴器]# arm-linux-gcc -c buzzer.S
[root@longguopeng 蜂鳴器]# arm-linux-ld buzzer.o -o buzzer
[root@longguopeng 蜂鳴器]# arm-linux-objcopy -O binary buzzer buzzer.bin
[root@longguopeng 蜂鳴器]# arm-linux-objdump -d buzzer > buzzer.dis
[root@longguopeng 蜂鳴器]# rm -rf buzzer.o buzzer 
[root@longguopeng 蜂鳴器]# mv buzzer.bin /tftpboot






=========================================================================
U-Boot 1.1.6 (Jun  8 2012 - 21:54:34) for SMDK6410                              
                                                                                
****************************************                                        
**    UT-S3C6410 Nand boot v0.18      **                                        
**    ShenZhen Urbetter Technology    **                                        
**    Http://www.urbetter.com         **                                        
****************************************                                        
                                                                                
CPU:     S3C6410@532MHz                                                         
         Fclk = 532MHz, Hclk = 133MHz, Pclk = 66MHz, Serial = CLKUART (SYNC Mod 
Board:   SMDK6410                                                               
DRAM:    128 MB                                                                 
Flash:   0 kB                                                                   
NAND:    256 MB                                                                 
SD/MMC:  1880 MB                                                                
In:      serial                                                                 
Out:     serial                                                                 
Err:     serial                                                                 
dm9000 i/o: 0x18000300, id: 0x90000a46                                          
MAC: 11:22:33:44:55:66                                                          
operating at unknown: 15 mode                                                   
Hit any key to stop autoboot:  0                                                
[uplooking]# nand erase 0 0x2000                                                
                                                                                
NAND erase: device 0 offset 0x0, size 0x2000                                    
Erasing at 0x0 -- 1600% complete.                                               
OK                                                                              
[uplooking]# tftp 0x50000000 buzzer.bin                                         
dm9000 i/o: 0x18000300, id: 0x90000a46                                          
MAC: 11:22:33:44:55:66                                                          
operating at 100M full duplex mode                                              
TFTP from server 192.168.1.254; our IP address is 192.168.1.253                 
Filename 'buzzer.bin'.                                                          
Load address: 0x50000000                                                        
Loading: #                                                                      
done                                                                            
Bytes transferred = 168 (a8 hex)                                                
[uplooking]# nand write 0x50000000 0 0x2000                                     
                                                                                
NAND write: device 0 offset 0x0, size 0x2000                                    
 8192 bytes written: OK                                                         
[uplooking]# 
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\   
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章