記錄1,安裝yocto,編譯kernel等
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install sed wget cvssubversion git-core coreutils unzip texi2html texinfo libsdl1.2-devdocbook-utils gawk python-pysqlite2 diffstat help2man make gcc build-essentialg++ desktop-file-utils chrpath libgl1-mesa-dev libglu1-mesa-dev mercurialautoconf automake groff libtool xterm
$ sudo apt-get install uboot-mkimage
// Within directory where linux-socfpga-13.02-RC10-src.bsxresides, run the following command to install the package to /opt/altera-linux directory.
//如果執行下面的命令失敗,請檢查文件是否可執行,或直接使用$chmod 777 filename 修改文件屬性
$ sudo ./linux-socfpga-13.02-RC10-src.bsx
//Now run this command (NOT as root) to install Yocto. Yocto will be installeda user’s root directory. For instance, in /home/harvey.
$/opt/altera-linux/bin/install_altera_socfpga_src.sh ~/yocto
// A new build directory has been createdwith a conf subdirectory. This contains the default configuration for buildingfor altera hardware. You can modify the conf/local.conf file to adjust varioussettings, such as building with an initramfs.Not as root
注意,需要在/home/harvey/yocto/目錄下運行下面的命令,每次重啟linux後都需要運行一次下面的命令************
$ source /home/harvey/yocto/altera-init /home/harvey/yocto/build
運行上面的命令後,linux 相關代碼尚未有展開到build的子目錄中
// we could use the following command tobuild kernel, ramdisk, and so on.
bitbakevirtual/kernel //In order to build linux
bitbakevirtual/bootloader //In order to build u-boot
bitbakealtera-image //In order to build the root filesystem
// 編譯所有鏡像的命令
$ bitbake virtual/kernel virtual/bootloaderaltera-image
記錄2,可以在yocto/build/tmp/deploy/images目錄下直接執行下面的命令來生成燒寫SD卡的鏡像文件。***************
Linux啟動需要的文件包括preloader、uboot、根文件系統、linuxkernel和dtb文件。
$ cd ~/yocto/build/tmp/deploy/images
$ sudo/opt/altera-linux/bin/make_sdimage.sh -kuImage,socfpga_cyclone5.dtb -p u-boot-spl-socfpga_cyclone5.img -b u-boot-socfpga_cyclone5.img -r~/yocto/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/altera-image-1.0-r0/rootfs -o sd_image.bin
注意,直接生成的sd卡鏡像有問題,在把鏡像燒寫到sd卡後使用下面的命令將yocto/build/tmp/deploy/images 中的ext3 格式的rootfs 覆蓋到sd卡中。
:dd if=altera-image-socfpga_cyclone5-20130806020207.rootfs.ext3of=/dev/sdb2
注意2,需要修改fat32分區中的socfpga_cyclone5.dtb 為socfpga.dtb
注意3,如果sd卡啟動後沒有任何列印信息。請檢查在生成sd卡鏡像時,請檢查preloader,即u-boot-spl*.*文件是否為bin文件,如果是,則需要使用mkpimage為該文件增加頭信息。可以簡單判斷,增加了頭的該文件為256KB或64KB。
記錄3,編譯preloader和uboot
可以在windows下,使用bsp-editor進行編譯preloader和uboot。
其中software文件夾是quartus工程頂層目錄下的文件夾,使用bsp-editor 編譯配置和編譯preloader過程中自動產生的文件夾。
記錄4,編譯設備樹dtb文件
不推薦使用altera的工具軟體生成dts,因為不同版本的linux內核對dts格式的要求不同。當然,版本差異小的話,可能會使用相同的dts文件。
linux內核源碼目錄中有dts文件。建議直接手動修改該dts文件,並使用下面的命令編譯成dtb。
在linux將dts 編譯為dtb文件,在在目錄
/home/harvey/yocto/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/linux-altera-3.7-r1/linux-altera-3.7中執行下面的命令可以將dts 編譯為dtb。
/home/harvey/yocto/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/linux-altera-3.7-r1/linux-altera-3.7/scripts/dtc/dtc-O dtb -o arch/arm/boot/socfpga_cyclone5.dtb -b 0 -d arch/arm/boot/.socfpga_cyclone5.dtb.darch/arm/boot/dts/socfpga_cyclone5.dts
注意:在linux代碼document 中有各個設備dts數據結構的說明手冊,如下圖。
記錄5:編譯minimal jffs2 文件系統 rootfs
在安裝13.02和13.1 安裝包後,需要運行命令bitbake altera-image-minimal 之後才會產生下面的目錄~/yocto/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/altera-image-minimal-1.0-r0/rootfs/
使用下面的命令編譯出了minimal的文件系統,不包括ssh,即無法在ds5下同網絡進行調試
cd~/yocto131/
sourcealtera-init build
bitbake altera-image-minimal
註:使用bitbake altera-image 可以生成normal文件夾,使用bitbake altera-image-minimal可以生成minimal文件夾
*********************因默認編譯的minimal的jffs2 不支持ssh,導致無法使用ds5 調試linux 應用程式*************************************
記錄6:向jffs2 添加ssh ,可以比較minimal和normal的下面文件,並根據normal的文件修改minimal對應的文件,增加ssh的支持。
參考altera-image.bb修改下面的文檔
./meta-altera/recipes-core/images/altera-image-minimal.bb
記錄7, linux下的重要路徑
在linux開發平臺下,uboot代碼路徑
/home/harvey/yocto/build/tmp/work/armv7ahf-vfp-neon-poky-linux-gnueabi/u-boot-altera-2012.10-r0.0/u-boot-altera-2012.10
在window 平臺下,對應的目錄是
D:\work_dir\demos\SOC\helio\software\spl_bsp\uboot-socfpga
文件系統路徑
/home/harvey/yocto/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/altera-image-1.0-r0/rootfs
linux內核代碼的路徑
/home/harvey/yocto/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/linux-altera-3.7-r1/linux-altera-3.7
Gnu工具鏈所在目錄
/opt/altera-linux/linaro/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux/bin/
編譯出的所有文件都在目錄/home/harvey/yocto/build/tmp/deploy/images下
altera-image-socfpga_cyclone5.cpio
altera-image-socfpga_cyclone5.ext3
altera-image-socfpga_cyclone5.jffs2
altera-image-socfpga_cyclone5.tar.gz
socfpga_cyclone5.dtb
socfpga_vt.dtb
u-boot-socfpga_cyclone5.bin
u-boot-spl-socfpga_cyclone5.bin
uImage
vmlinux
記錄8:在yocto下編譯.ko ************************
編譯內核模塊:
步驟1,設置yocto環境變量
source /home/harvey/yocto/altera-init /home/harvey/yocto/build
步驟2,設置PATH 變量,增加socfpga的工具鏈目錄
export PATH=$PATH:/opt/altera-linux/linaro/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux/bin
步驟3,使用make編譯模塊
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
步驟4,加載和卸載模塊
加載執行:insmod hello.ko
卸載命令:rmmod hello.ko
makefile文件內容如下
# Makefile 2.6
obj-m +=test_module.o
KDIR:=/home/harvey/yocto/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/linux-altera-3.7-r1/linux-altera-3.7
PWD=$(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
make -C $(KDIR) M=$(PWD) clean
注意:上面的KDIR目錄是內核代碼根目錄。儘管module.h是在linux-altera-3.7-r1/linux-altera-3.7/include/linux/下。
注意:如果在編譯kernel 模塊是遇到下面的錯誤,請檢查makefile 中make -C $(KDIR) M=$(PWD) modules 前面的tab 鍵是否被多個空格代替了。
harvey@ubuntu:~/workplace/kernel_module$make all
make: Nothing to be done for `all'.
代碼文件harvey@ubuntu:~/yocto/build/tmp/test_dir$ cat test_module.c
#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>
MODULE_LICENSE("DualBSD/GPL");
static int hello_init(void)
{
printk("Hello moduleinit.\n");
return 0;
}
static void hello_exit(void)
{
printk("Goodbye moduleexit.\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("harvey");
MODULE_DESCRIPTION("a simplemodule");
MODULE_ALIAS("test_module");
遇到的錯誤記錄
錯誤1,編譯模塊是遇到error: void value not ignored as it ought tobe
linux/fs.h頭文件,裡面定義了unregister_chrdev()函數為void 類型,刪除下面語句中的「ret =」。 ret = unregister_chrdev ( Major, DEVICE_NAME );
錯誤2,加載模塊是出現下面的提示,是主設備號衝突,使用命令cat /proc/devices 查看已分配的設備號。
# insmod char_dev_harvey.ko
globalvar registerfailureError: could not insert module char_dev_harvey.ko: Device or resourcebusy
可以用命令創建設備文件:
mknod /dev/設備文件名字符設備(c是字符設備,b是塊設備) 主設備號次設備號
例如:mknod /dev/testChar c 100 0
刪除設備入口:
rm /dev/testChar
記錄9,配置linux內核************************
// configuratelinux kernel, after the following command there'll come up a configure window. Not as root
$bitbake -cmenuconfig linux-altera
記錄10,將鏡像燒寫到sd卡
在linux下可以使用下面的命令經sd卡鏡像燒寫到卡中。
$ sudo dd if=linux-socfpga-12.12-sdimageof=/dev/sdx bs=512
$ sudo sync
注意,在linux下需要使用usb接口的sd卡讀卡器。Linux不能直接識別出sd卡(將大的sd卡插入筆記本的sd卡槽中)。
在windows下使用Win32DiskImager 將sd卡image燒寫到sd卡中
記錄11,使用git工具軟體下載linux內核代碼
Linux4.x使用第二個連結,帶github字樣
https://github.com/altera-opensource/linux-socfpga/
https://github.com/altera-opensource/linux-socfpga/branches
git clonegit://git.rocketboards.org/linux-socfpga.git
git clonegit://git.rocketboards.org/linux-socfpga.git
git clone git://git.rocketboards.org/poky-socfpga.git
git clone git://git.rocketboards.org/u-boot-socfpga.git
git clone git://git.rocketboards.org/linux-refdesigns.git
cd u-boot-socfpga
查看本地分支:$ git branch
查看遠程分支:$ git branch -r
git branch
git checkout -t -b socfpga-3.10 origin/socfpga-3.10
git checkout -t -b socfpga-3.10-ltsi origin/socfpga-3.10-ltsi
git checkout -t -b socfpga-3.11 origin/socfpga-3.11
git checkout -t -b socfpga-3.12 origin/socfpga-3.12
git checkout -t -b socfpga-3.9 origin/socfpga-3.9
切換本地分支
git checkout socfpga-3.10-ltsi
使用遠端版本強制覆蓋本地修改,即放棄本地修改。
git fetch --all
git reset --hardorigin/master
git fetch 只是下載遠程的庫的內容,不做任何的合併 git reset 把HEAD指向剛剛下載的最新的版本
記錄12:編譯git下來的linux內核代碼
需要先設置編譯工具鏈路徑:
exportPATH=$PATH:/opt/altera-linux/linaro/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux/bin
設置:make ARCH=armCROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x8000 socfpga _defconfig
如需要配置linux內核:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x8000 menuconfig
編譯linux 內核:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x8000 uImage
重要記錄:Qspi flash 燒寫
打開命令窗口:E:\altera\14.0\embedded\Embedded_Command_Shell,在本命令窗口中使用下面的命令燒寫代碼到指定的地址處。
quartus_hps -c 1-o PV -a 0x0000 preloader-mkpimage.bin
quartus_hps -c 1-o PV -a 0x60000 u-boot-img.bin
quartus_hps -c 1-o PV -a 0x50000 socfpga-dtb.bin
quartus_hps -c 1-o PV -a 0xa0000 zImage.bin
quartus_hps -c 1-o PV -a 0x800000 minimal-rootfs-jffs2.bin
dts文件中包括jffs2文件系統的位置,參考下圖
/home/harvey/yocto131/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/linux-altera-dist-1.0-r1/linux-socfpga/arch/arm/boot/dts
註:版權歸「FPGA那點事兒」運營團隊,轉載請註明出處。
歡迎掃描以下二維碼,關注「FPGA那點事兒」!