`
本帖最后由 MOPPLAYER 于 2015-11-17 23:55 编辑
前言: 要熟悉Linux系統,免不了要操作一些外設,因此本篇將介紹如何使用交叉編譯並上傳至開發板運行,使用sysfs方式來實作
實作:
1. 開啟虛擬機,我的是掛載Ubuntu 14.04 64Bit LTS,下載官方靜態的SDK,
http://pan.baidu.com/s/1hqya6H2密碼1kz6
2. 下載後解壓縮到你喜歡的目錄,之後輸入以下指令開始搭建必要的編譯環境
- cd wrtnode
- sudo apt-get install build-essential subversion libncurses5-dev zlib1g-dev gawk gcc-multilib flex git-core gettext libattr1-dev
复制代码
3. 安裝好必要的套件以後,輸入以下指令開始更新套件包
- make distclean
- ./scripts/feeds update –a
- ./scripts/feeds install –a
复制代码
4. 之後再輸入以下指令,進行基本設置
Fig. 1 設定subtarget為MT7628
5. 設定完畢後,即可以開始編譯,OpenWRT可以設定很多功能,跟引用的Lib等,但本篇沒用到,默許配置即可
編譯過程會相當久,最好晚上就寢時開始編譯
6. 編譯完成以後,這裡的鏡像檔不用燒寫至開發板上,因為採用預設,直接看toolchain,到/wrtnode/staging_dir可看到MIPS的交叉編譯gnu工具,設定必要的環境參數
- export STAGING_DIR=
/wrtnode/staging_dir
- export PATH=$PATH:
/wrtnode/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin
复制代码
7. 設置完畢後,輸入以下指令來檢測是否正常可使用MIPS的gcc
- mipsel-openwrt-linux-gcc -v
复制代码
Fig. 2 MIPS Cross-GCC
8. 接下來我們要開始查看我們要使用哪一隻腳位當作GPIO使用,從官方圖可以得知,左下P7第一隻腳位GPIO0可以使用
Fig. 3 GPIO0的位置
9. 但我們要如何知道這隻腳對應在CPU的GPIO哪隻腳位呢,就必須查看MT7688的Datasheet
Fig. 4 可得知GPIO0所在的腳位為GPIO11
10. 知道腳位後,我們還必須知道在Linux sysfs對應的關係,可以透過ssh在開發板上輸入以下指令查看
首先保持虛擬機網路連通,輸入以下指令
Fig. 5 輸入你開發板設定的root密碼
Fig. 6 登入成功
- cat /sys/kernel/debug/gpio
复制代码
輸出結果為:
Fig. 7 GPIO在Linux定義
11. 綜合以上資訊,創建blink.c,並輸入以下原始碼:
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #define GPIO_DEVICE "/sys/devices/10000000.palmbus/10000600.gpio/gpio/gpio11/value"
- #define EXPORT_PATH "/sys/class/gpio/export"
- #define DIRECT_PATH "/sys/devices/10000000.palmbus/10000600.gpio/gpio/gpio11/direction"
- #define GPIO "11"
- #define DIR "out"
- int main(int argc, char *argv[])
- {
- int ret = 0;
- int fd_gpio = 0;
- int fd_export = 0;
- int fd_dir = 0;
- fd_export = open(EXPORT_PATH,O_WRONLY);
- if(fd_export<0){
- perror("open export:");
- return -1;
- }
- write(fd_export,GPIO,strlen(GPIO));
- fd_dir = open(DIRECT_PATH,O_RDWR);
- if(fd_dir<0){
- perror("dir write:");
- return -1;
- }
- write(fd_dir,DIR,strlen(DIR));
- fd_gpio = open(GPIO_DEVICE, O_RDWR);
- if (fd_gpio < 0) {
- printf("can't open %s device
- ", GPIO_DEVICE);
- return -1;
- }
- while(1){
- write(fd_gpio, "0", 1);
- sleep(1);
- write(fd_gpio, "1", 1);
- sleep(1);
- }
- close(fd_gpio);
- close(fd_dir);
- close(fd_export);
- return ret;
- }
复制代码
其中使用到ioctl函式來讀取和寫入裝置,這是原來讀寫檔案的擴充函式,因此可以輕易呼叫此函式來對裝置來進行讀寫
12. 儲存後,輸入以下指令編譯,並查看是否有錯誤或者警告訊息
- mipsel-openwrt-linux-gcc blink.c -o blink -Wall
复制代码
Fig. 8 編譯完成應該是要0錯誤0警告
13. 編譯完畢後,我們要將檔案上傳至開發板,這裡使用USB Storage的方式,將blink二進制檔案拷貝至USB Storage,並插入開發版的USB port
14. 再次利用ssh登入開發板,並輸入以下指令安裝USB工具
15. 輸入以下指令查看USB Storage是否偵測到
Fig. 9 我的USB Storage是SONY
16. 如果輸入ls /dev 有sd*裝置的話表示可以正常使用,像我就沒有辦法使用
Fig. 10 USB Storage無法使用
17. 輸入以下指令查看問題
Fig. 11 似乎是power不足
18. 發現是power問題以後,可以利用以下指令強制啟動
- echo 1 > /sys/bus/u***/devices/1-1.4/bConfigurationValue
复制代码
其中1-1.4要看你dmesg所顯示的 u*** x-y.z決定
19. 再次輸入ls /dev指令,這次顯示了sda成功運作
Fig. 12 成功使USB Storage運作
20. 輸入以下指令掛載USB Storage
- mount -t vfat /dev/sda1 /mnt
复制代码
vfat代表FAT格式
21. 現在可以將我們的blink檔案拷貝至/root上,輸入以下指令
-f 代表強制複寫
22. 然後可以解除USB Storage掛載了,輸入以下指令
23. 最後我們將LED的長腳位透過杜邦線接到GPIO0的腳位,然後找到P8的第六隻腳,即GND腳位,和LED的短腳位連接,如下定義
- P7_1 <=> LED長腳
- P8_6 <=> LED短腳
复制代码
24. 輸入以下指令觀看LED之Blink
Fig. 13 運行blink
25. 成品實圖
`
0
|