關於ok6410的裸機開發資料,大多都是windows下的,使用rvds編寫裸機程式,並編譯燒錄到開發板上執行,但是我整了很久也沒在windows10上將環境裝好,又懶得裝乙個xp的虛擬機器,所以就摸索在linux下進行裸機程式的開發。具體內容分為以下幾個部分:
一.前期準備
二.裸機程式的編寫(驅動led)
三.裸機程式編譯鏈結
四.裸機程式的燒錄
一.前期準備
1.交叉編譯工具鏈
交叉編譯工具鏈用來編譯、鏈結裸機程式,生成開發板可執行的二進位制檔案,只需要將ok6410光碟中的交叉編譯工具解壓到linux下,並新增環境變數指明路徑即可,如下圖:
2.tftp伺服器
tftp伺服器用來將二進位制檔案傳送到開發板上
1.安裝xinetd:
zoro@ubuntu:~$ sudo apt-get install xinetd
2.安裝tftp客戶端和伺服器
zoro@ubuntu:~$ sudo apt-get install tftp tftpd
3.建立配置檔案:
建立/etc/xinetd.h/tftp 並寫入如下內容,其中var/tftpboot/是伺服器的目錄,需要將其許可權設為777
3.sd卡
由於之後裸機程式需要通過uboot上的tftp燒錄到開發板中,所以需要製作sd卡將uboot燒錄到nandflash
二、裸機程式的編寫
之前的準備工作做好之後,就可以編寫裸機程式了,按照國際慣例先驅動led(比較簡單……),首先看ok6410的原理圖
由原理圖可知,4個led對應著晶元的gpm0~gpm3,接下來看晶元手冊
由晶元手冊可知,gpm0~gpm3的配置是gpmcon的0~15位,分別將其設定為0001,即輸出模式,然後給gpmdat暫存器賦值即可確定輸出高電平或者低電平,由原理圖可知,在ok6410開發板輸出低電平,led發光。知道這些即可編寫裸機程式:
1 #define rgpmcon (*(volatile unsigned *)(0x7f008820))
2 #define rgpmdat (*(volatile unsigned *)(0x7f008824))
3 #define rgpmpud (*(volatile unsigned *)(0x7f008828))
4 5
6 void msdelay(int time)
7 {8 volatile unsigned int i,j;
9 for(i = 0; i < 2000000; i++)
10 for(j=0; j
到這裡裸機程式已經寫完了,接下來需要做的就是編譯了。
三、 裸機程式編譯鏈結
說白了,使用rvds只是把編譯鏈結的過程集合到一塊了,現在我們需要自己做這些工作,通過makefile組織檔案:
1 ll: led.bin
2 3 led.bin: start.o led.o
4 arm-linux-ld -ttext 0 -o led.elf start.o led.o
5 arm-linux-objcopy -o binary led.elf led.bin
6 arm-linux-objdump -d led.elf > led.dis
7 8 start.o : start.s
9 arm-linux-gcc -g -o start.o start.s -c
10 11 led.o : led.c
12 arm-linux-gcc -g -o led.o led.c -c
13 14 clean:
15 rm *.o led.elf led.bin led.dis
arm-linux-gcc -g 為了除錯 -o 控制輸出檔案 -c 只編譯不鏈結
arm-linux-ld 鏈結器
arm-linux-objcopy 輸出可執行二進位制檔案
arm-linux-objdump 將led.elf反彙編到led.dis中
然後執行make命令,就會生成二進位制檔案 len.bin
四.裸機程式的燒錄
進行到這裡,只需要將可執行檔案燒錄到開發板執行就ok了
1.將led.bin檔案複製到tftp伺服器的目錄下(和我的配置的一樣的話,即/var/tftpboot目錄)
2.向開發板燒錄uboot,然後切換到nandflash啟動,出現輸出資訊是按空格,出現如下畫面就成功了
然後選擇6,進入uboot,給開發板連線網線,確保主機和開發板處於同一區域網,關閉主機的防火牆,然後配置ip
由上向下依次是 開發板ip, 主機ip, 閘道器, 最後儲存
注意這裡的位址必須在0x50000000~0x6fffffff範圍內,因為其他記憶體位址不是dram
此時使用go命令, go 【位址】,即可執行你的裸機程式了,可以看到led被點亮了
4.到這裡可以說整個流程都走完了,但是裸機程式掉電以後就沒了,如果想讓程式掉電以後還在開發
板上,可以將裸機程式寫到nandflash,具體做法如下:
nand erase 【偏移量】【擦除長度】
擦除一塊nand,我這裡從0x30000000開始 擦除了1m
nand write 【記憶體位址】【偏移量】【寫長度】
將記憶體裡的資料寫到nand,這裡將0x60000000的裸機程式寫到0x30000000處
然後重啟以後,再將這片nand內容讀入記憶體,使用go命令執行讀到檔案的位址。
這裡需要注意的是,如果nand擦除的位址太低的話,有可能覆蓋uboot,導致uboot不能正常啟動,當然寫入的位址如果為0的話,
開發板啟動以後會直接執行你寫的裸機程式,不執行uboot了。
OK6410裸機程式 hello world
上面已經解決 了幾個問題。現在我們的狀態 可以在pc ok6410 之間進行tftp傳輸,確定了一下可用的位址 空間,下面我們來說一下printf除錯 因為沒有jlink,只能用printf除錯,你也許會問,我們自己實現printf麼?答曰 不是,我們只是弄個hello world,何必那麼認真呢?...
OK6410裸機程式 點亮LED
globl start start 硬體相關的設定 peri port setup ldr r0,0x70000000 orr r0,r0,0x13 mcr p15,0,r0,c15,c2,4 256m 0x70000000 0x7fffffff 關看門狗 往wtcon 0x7e004000 寫0 ...
ok6410 sd卡啟動 裸機程式
我的思路本來是從sd卡啟動。完成初始化,然後實現了uart串列埠列印,接下來,用c寫裸機 的事 都應該比較容易了吧。注意事項 就是在程式鏈結位址是 0x0c000000,進入c語言之前設定sp的時候也要設定 為0x0c0002000。sdcopy.sh是將寫好的程式燒入sd卡,檔案路徑filepat...