xzy610030

一起探讨,一起进步,一起分享!

zedboard--嵌入式linux系统移植

0
阅读(7407)

终究还是要面对嵌入式系统的移植的!!!本文是陆书在自己电脑上的实现。

关于zedboard的系统开发(这里不考虑zedboard裸奔的情况了)可能会遇到下面的问题:

转载:请注明来之http://blog.csdn.net/xzyiverson

<一>使用提供的Demo系统来进行应用程序和驱动程序的开发

应用程序开发:

需要安装交叉编译环境,另外要用到Opencv或者qt的话,在板子上要移植,这些都在前面的实验上已经做好了。

驱动程序开发:

这里主要是为自定义的ip核(PL)编写linux驱动的问题,包括两个问题,一是在pc下运行该驱动程序,一是在zedboard下运行该驱动程序。

        pc机下驱动编写:这个虚拟机已经试过了,不需要搭建其他的环境。

        zedboard下驱动编写:如运行在zedboard下的helloworld驱动。参见http://blog.csdn.net/xzyiverson/article/details/12783037


<二>构建自己的嵌入式Linux系统

以下需要的文件都可以在书中的光盘里面找到。

1.搭建系统环境(前面文章已经好了)

http://blog.csdn.net/xzyiverson/article/details/11264417

2编译u-boot

2.1下载和解压u-boot源码

2.2配置u-boot

进入源码目录,make zynq_zed_config

2.3编译u-boot

这里我就郁闷了,书上说要建立软链接,我没有建立也能成功,如果你需要建立的话,那么你就按书上的建立,不过书上写反了:

应该是:ln -s  arm-xilinx-linux-gnueabi-gcc  arm-linux-gcc

.........

编译:make

编译成功后可以看到生成了u-boot,我们执行mv  ./u-boot  ./u-boot.elf,这样就成功生成了u-boot。elf文件,这个文件就熟悉了,和前面的.bit和fsbl工程生成的fsbl.elf可以共同生成BOOT.BIN。

3编译内核和设备树

 3.1下载解压内核源码

 3.2配置内核源码

进入源码目录  make  ARCH=arm  digilent_zed_defconfig

3.3编译Linux内核

make  ARCH=arm

编译成功后,在arch/arm/boot下生成了zImage文件

3.4编译设备树

zedboard的默认设备树源文件digilent-zed.dts(在内核源码目录的arch/arm/boot/dts下)

修改源文件:vim  digilent-zed.dts  修改在16行的代码(书上有,不敲上去了)

然后我们进入内核目录下的scripts/dtc路径下的设备树的编译器,使用dtc工具,生成dtb文件。

./dtc   -I   dts  -O dtb  -o  ./devicetreee.dtb  /opt/zedboard/kernel/linux..arch/arm/boot/dts/digilent-zed.dts

说明  ./devicetreee.dtb 生成的文件

/opt/zedboard/kernel/linux..arch/arm/boot/dts/digilent-zed.dts   为源文件

4制作根文件系统

 4.1编译BusyBox

4.1.1下载和解压源码

4.1.2配置BusyBox(使用默认配置)

make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- defconfig

修改安装目录:这里强烈推荐和后面的Dropbear安装到同一个目录下,我第一次没有安装到同一个目录下,有一点麻烦。

make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- menuconfig

安装:make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- install

安装完成后,在/opt/zedboard/devel/_rootfs/下可以看到:

 

4.2编译Dropbear

4.2.1下载和解压源码

4.2.2配置(注意“ CFLAGS”这里一定要有一个空格,血的教训。)

进入源码目录

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. ./configure --prefix=/opt/zedboard/devel/_rootfs --host=arm-xilinx-linux-gnueabi --disable-zlib CC=arm-xilinx-linux-gnueabi-gcc LDFLAGS="-Wl,--gc-sections" CFLAGS="-ffunction-sections -fdata-sections -Os"  
4.2.3编译

make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp"MULTI=1 strip

注意书上少了dropbearconvert

4.2.4安装

make install

4.2.5建立软连接

cd  /opt/zedboard/devel/_rootfs/usr/bin/

ln -s ../../sbin/dropbear  ./scp

4.3工具链动态库与应用的设置

4.3.1建立目录  

cd  /opt/zedboard/devel/_rootfs/

mkdir   lib

4.3.2拷贝文件

将交叉编译环境库拷贝到这个目录下

cp /root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/ arm-xilinx-linux-gnueabi/libc/lib/* lib -r
同样,将工具链拷贝到sbin/和usr/bin/下

cp /root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/ arm-xilinx-linux-gnueabi/libc/sbin/* sbin/ -r
cp/root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/ arm-xilinx-linux-gnueabi/libc/usr/bin/* usr/bin/ -r

4.4目录的创建与配置

首先:创建目录结构:在_rootfs目录下:

mkdir dev etc etc/dropbear etc/init.d mnt opt proc root sys tmp var var/log var/www

然后进入etc目录,创建许多的配置文件

vim   fstab

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. LABEL=/     /           tmpfs   defaults        0 0  
  2. none        /dev/pts    devpts  gid=5,mode=620  0 0  
  3. none        /proc       proc    defaults        0 0  
  4. none        /sys        sysfs   defaults        0 0  
  5. none        /tmp        tmpfs   defaults        0 0  

vim  inittab 
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. ::sysinit:/etc/init.d/rcS  
  2. # /bin/ash  
  3. #   
  4. # Start an askfirst shell on the serial ports  
  5. ttyPS0::respawn:-/bin/ash  
  6. # What to do when restarting the init process  
  7. ::restart:/sbin/init  
  8. # What to do before rebooting  
  9. ::shutdown:/bin/umount -a -r  

vim  passwd
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. root:$1$qC.CEbjC$SVJyqm.IG.gkElhaeM.FD0:0:0:root:/root:/bin/sh  

vim init.d/rcS
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #!/bin/sh  
  2.   
  3. echo "Starting rcS..."  
  4.   
  5. echo "++ Mounting filesystem"  
  6. mount -t proc none /proc  
  7. mount -t sysfs none /sys  
  8. mount -t tmpfs none /tmp  
  9.   
  10. echo "++ Setting up mdev"  
  11.   
  12. echo /sbin/mdev > /proc/sys/kernel/hotplug  
  13. mdev -s  
  14.   
  15. mkdir -p /dev/pts  
  16. mkdir -p /dev/i2c  
  17. mount -t devpts devpts /dev/pts  
  18.   
  19. echo "++ Starting telnet daemon"  
  20. telnetd -l /bin/sh  
  21.   
  22. echo "++ Starting http daemon"  
  23. httpd -h /var/www  
  24.   
  25. echo "++ Starting ftp daemon"  
  26. tcpsvd 0:21 ftpd ftpd -w /&  
  27.   
  28. echo "++ Starting dropbear (ssh) daemon"  
  29. dropbear  
  30. echo "rcS Complete"  

设置用户权限:chmod 755 etc/init.d/rcS
        chown root:root etc/init.d/rcS

4.5制作ramdisk镜像文件

制作镜像文件

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. cd ~  
  2. dd if=/dev/zero of=ramdisk8M.image bs=1024 count=8192  
  3. mke2fs -F ramdisk8M.image -L "ramdisk" -b 1024 -m 0  
  4. tune2fs ramdisk8M.image -i 0  
  5. chmod 777 ramdisk8M.image  

挂载,将_rootfs的所有内容复制到该镜像中
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. mkdir ramdisk  
  2. mount -o loop ramdisk8M.image ramdisk/  
  3. cp -R /home/devel/_rootfs/* ramdisk  
  4. umount ramdisk/  
  5. gzip -9 ramdisk8M.image  

最后一步;将zImage,BOOT.BIN(暂时用别的先替一下,因为这次我们生成的是elf文件),devicetree.dtb必须改名为devicetree_ramdisk.dtb,ramdisk8M.image.gz拷贝到sd卡中,可以看到启动信息:和之前的系统有一些差别。