娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

飛凌開發板:S3C6410 之裸機程序燒寫

發布者:sigma28最新更新時間:2024-09-06 來源: cnblogs關鍵字:S3C6410 手機看文章 掃描二維碼
隨時隨地手機看文章

學習ARM時,看到三星ARM11 的官方手冊上寫道:S3C6410具備一個內部SRAM的緩沖器,叫做“STEPPINGSTONE”,支持NAND FLASH的系統引導。當系統啟動時,NAND FLASH存儲器的前4KB將自動被載入到“SETPPINGSTONE”中,然后系統自動執行這些載入的引導代碼。(默認的話該存儲區應該被映射到地址空間0處)。


于是一直就想寫個裸機程序,長度不超過4KB,存放在NAND FLASH的最開始,這樣每次系統上電從NAND FLASH啟動時,都會把這段代碼拷貝到被映射到地址0x0 處的“STEPPINGSTONE”處。這個應該是bootloader 的雛形吧,一上電就執行的程序??墒窃诼銠C環境下一直找不到燒寫NAND FLASH的方法。買了個JLink,貌似在Windows 下據說不能燒寫NAND FLASH,尚未驗證。網上大部分方法都是針對Uboot 燒寫內存,通過USB或者串口,網絡。沒有看到寫道NAND FLASH的方法。沒辦法,只能湊活著寫道內存中,先看看自己的程序是不是寫對了。突然有一天,翻翻韋東山老師的書:《嵌入式Linux應用開發完全手冊》上一張,降到Uboot中怎么從內存燒寫東西到NAND FLASH中去。突然靈機一動,可以將程序先燒到內存中,在從內存中燒到NAND FLASH中去。最后,NAND FLASH中的Bootloader (Uboot)會被覆蓋掉,上電就會自動運行自己的裸機程序,而非Bootloader。


想法有了,就去實現下:為此寫了個小程序,來驗證下。改程序的思路是:四個按鍵對應四個LED,按鍵按下,LED亮;松開LED滅。


三個程序如下:


 1 #define KEYCON  (*(volatile unsigned long *)0x7F008830)

 2 #define KEYDAT  (*(volatile unsigned long *)0x7F008834)

 3 

 4 /* 設置Key0 - Key4 為輸入狀態*/

 5 void KeyConfigure()

 6 {

 7         KEYCON = 0x0;

 8 }

 9 

10 /*只是最簡單的查詢按鍵狀態,沒有消抖功能,畢竟只是驗證用*/

11 int KeyStatus()

12 {

13         return KEYDAT;

14 }


extern int KeyStatus();

extern void KeyConfigure();


#define LEDCON  (*(unsigned long int *)0x7F008820)

#define LEDDAT  (*(unsigned long int *)0x7F008824)


int main(void)

{

        LEDCON = 0x1111; //GPM低四位全部輸出

        KeyConfigure();


        while (1)

        {

                LEDDAT = KeyStatus() & 0xf; //

        }

}


 1 .global _start

 2 

 3 _start:

 4 

 5         /*設置協處理器*/

 6         ldr r0, =0x70000000

 7         orr r0, r0, #0x13

 8         mcr p15, 0, r0, c15, c2, 4

 9 

10         /* 關閉看門狗定時器 */

11         ldr             r0, =0x7E004000

12         ldr             r1, =0x0

13         str             r1, [r0]

14 

15         ldr             sp, = 8*1024

16         bl main

17 

18 halt:

19         b halt


 1 CC = arm-linux-gcc

 2 LD = arm-linux-ld

 3 OBJDUMP = arm-linux-objdump

 4 OBJCOPY = arm-linux-objcopy

 5 

 6 OBJ     = start.o key.o led.o

 7 

 8 led.bin : led.elf

 9         $(OBJCOPY) -O binary led.elf led.bin

10         $(OBJDUMP) -d led.elf > led.dis

11         cp led.bin ~/nfs_root/ 

12 ##### cp 命令的意思是我把 NFS 文件系統放在了家目錄下的nfs_root 里面

13 

14 led.elf : $(OBJ)

15         $(LD) -o led.elf -Ttext 0x0 $(OBJ)

16 

17 led.o : led.c

18         $(CC) -fno-stack-protector -c -o $@ $<

19 

20 key.o : key.c

21         $(CC) -fno-stack-protector -c -o $@ $<

22 

23 start.o : start.s

24         $(CC) -fno-stack-protector -c -o $@ $<

25 

26 

27 clean :

28         rm $(OBJ) led.elf led.bin led.dis


根據上述四個文件,make 即可生成索要燒寫的純二進制文件 led.bin


啰嗦下,之所以使用NFS文件系統通過Uboot和網絡燒寫二進制文件到內存,而非通過傳統的USB燒寫,是應為我xxx在64bit的win7 中裝不上DNW的USB驅動,穿不了文件。不要問我為什么不用兼容性更好的XP。我是4G的內存,XP只能3G左右的內存,32bit的Win7估計也就3.5G的內存,老子總不能讓浪費4G的內存不用吧?再說了,微軟不是要放棄XP嗎?懶得折騰換到XP了,所以只好用網絡燒寫了(PS:懶得吐槽windows了)。


至于怎么在Linux主機上開啟NFS系統,詳見上述韋東山老師的書。(PS:大家不要被我的開發環境給搞暈了,一會Win7一會兒linux的。我主要是在ubuntu上用ARM-linux* 那一套開發的,用的Ubuntu開發環境是在Win7上 用ssh  遠程登錄操控的,這樣一個Ubuntu 主機可以多用戶操作,是在是很方便。只是用了下Win7的串口跟開發板相連,應為Ubuntu主機離我很遠。所以只能通過交換機 + Ubuntu 主機 + Win7 主機 + 開發板架構了。之所以不用虛擬機,感覺速度太慢,受不了。)


閑話少說:開發板燒寫過Uboot 后,上電停留在Uboot狀態,退出到命令行輸入方式,設置Uboot的網絡參數,來和Ubuntu主機通過NFS文件系統燒寫程序。


 1 printenv : 

 2    bootdelay=1

 3    baudrate=115200

 4    ethaddr=00:40:5c:26:0a:5b

 5    ipaddr=192.168.2.111

 6   serverip=192.168.2.100

 7   gatewayip=192.168.2.1

 8   netmask=255.255.255.0

 9   stdin=serial

10   stdout=serial

11   stderr=serial

12 

13 上述打印的網絡參數中,只有 ipaddr , serverip, gatewayip, netmask 需要設置。我的Ubuntu 主機IP地址為 10.11.52.249, 子網掩碼為 255。255.0.0,網關為10.11.52.1

14 所以可以設置開發板的IP地址為 10.11.52.248, 子網掩碼和網關筒主機即可。

15 用 setenv name value 命令即可

16 setenv ipaddr 10.11.52.248

17 setenv serverip 10.11.52.249

18 setenv gateway 10.11.52.1

19 setenv netmask 255.255.0.0

20 然后保存:saveenv 即可


然后即可將上面生成的led.bin 燒寫到內存中去。


nfs 0x50000000 10.11.52.249:/home/cat/nfs_root/led.bin

@用法解析

nfs 內存地址 nfs網絡文件地址

燒寫完后,即可通過uboot 的nand 命令將0x50000000的內存內容燒寫到Nand FLASH中去


 1 @ 擦除NANDFLASH

 2 nand erase   0x0      0x200000

 3 命令   擦除   nand偏移   擦除長度

 4 

 5 @ 寫NANDFLASH 

 6 nand write     0x50000000 0x0            0x20000000

 7 命令   寫          內存地址     nand 偏移       寫長度

 8 

 9 @ 讀NANDFLASH 到終端,可以跟反匯編文件對比是否正確

10 nand   dump        0x0

11 命令       讀       從該offset的一個扇區的內容   


然后上電,設置開發板從Nand FLASH啟動,即可看到上電不會執行Uboot(被裸機程序覆蓋掉了),而是直接執行裸機程序了。


注:


 1 (1)start.s 中設置協處理器的原因是ARM11的采用的架構是arm1136jzf-s把memory和Peripheral接口分開了,你需要在初始化時告訴cpu,

    哪些地址范圍是屬于Peripheral的,否則它就當memory訪問,當然就訪問不到屬于Peripheral 區間的IO口寄存器。

    可以通過ARM11的協處理器cp15來告訴CPU外設寄存器的地址,在ARM11芯片架構手冊上可以看到怎樣實現該操作:

 2 

 3   CRn Op1 CRm Op2

 4 

 5    c15    0    c2     0 Data Memory Remap R/W 0x01C97CC8 page 3-162

 6                         1 Instruction Memory Remap R/W 0x01C97CC8 page 3-162

 7                         2 DMA Memory Remap R/W 0x01C97CC8 page 3-162

 8                         4 Peripheral Port Memory Remap R/W 0x00000000 page 3-162

 9 

10       如果不設置的話,在Uboot下燒寫到內存中運行沒問題,因為Uboot已經替你設置好了,但是燒寫到NAND FLASH中去的話會出現問題,因為沒有Uboot替你設置這些東西。

11 (2)  燒寫NAND FLASH時一定要先擦除再燒寫,因為nand由于結構的特殊性,只能先充電,再放電,不能直接對每一位置高置低。


因此規定,進行nand寫入操作前,必須對nand進行擦除操作。擦除就是充電,對每一位置高,寫入0xFF,而寫入動作就是對特定位進行放電的操作了,這樣才能得到正確的數據。


 


關鍵字:S3C6410 引用地址:飛凌開發板:S3C6410 之裸機程序燒寫

上一篇:s3c6410_時鐘初始化
下一篇:在嵌入式Linux系統(OK6410)中移植Boa 服務器

小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 华坪县| 武山县| 保康县| 莱州市| 石泉县| 虹口区| 封开县| 呼玛县| 海丰县| 兴国县| 泸溪县| 通海县| 额济纳旗| 卢氏县| 台山市| 枝江市| 崇州市| 军事| 玉田县| 磴口县| 松阳县| 徐汇区| 右玉县| 河北区| 黄骅市| 平南县| 齐河县| 绥芬河市| 伊宁市| 萨嘎县| 渝中区| 凤凰县| 清徐县| 高平市| 汉源县| 巨野县| 普洱| 广元市| 葫芦岛市| 本溪| 新津县|