原創作品:http://write.blog.csdn.net/postedit/7956383
歡迎大家一起交流學習,知識在與分享。
希望結交一些志同道和之士
QQ: 474530676
開發板下載程序
啓動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]#
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\