1、linux开发环境搭建
#1、为了ubuntu与windows文件互传ls,安装ftp
#开启Ubuntu下的FTP服务
sudo apt-get install vsftpd #安装ftp
sudo vi /etc/vsftpd.conf #打开配置文件进行修改
#找到local_enable = YES和write_enable=YES
sudo /etc/init.d/vsftpd restart #重启FTP
#2、之后运行Linux驱动开发的时候需要NFS启动,故安装NFS
sudo apt-get install nfs-kernel-server rpcbind
sudo vi /etc/exports
#在最后一行加上nfs文件夹路径
/home/hujinsong/linux/nfs *(rw,sync,no_root_squash)
sudo /etc/init.d/nfs-kernel-server restart #重启nfs
#查看NFS共享目录,如果是上一步设置的说明配置成功
showmount -e
#在开发板根文件系统中进行以下操作,仅为验证nfs挂载成功,没有烧录根文件可跳过
mkdir get
mount -t nfs -o nolock,nfsvers=3 192.168.10.100:/home/hujinsong/linux/IMX6UL/nfs get/ #将ubuntu(192.168.10.100)NFS共享目录挂载到开发板get目录中;
df #查看挂载的nfs目录
umount get #卸载NFS目录
#3、安装SSH服务,以便在windows下使用终端软件登录到Ubuntu,比如使用SecureCRT
sudo apt-get install openssh-server
#4、安装交叉编译器
sudo cp gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz /usr/local/arm/ -f
sudo tar -vxf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
sudo vi /etc/profile
export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin #在配置文件最后一行说明编译器位置
arm-linux-gnueabihf-gcc -v #交叉编译器验证
#5、安装相关库
sudo apt-get install lsb-core lib32stdc++6 #c标准库
sudo apt-get install libncurses5-dev #编译uboot时用到
sudo apt-get install lzop #编译Linux源码时用到
error1:使用apt工具时,显示:could not get lock /var/lib/dpkg/lock,说明apt工具被其他线程占用;解决方法如下:
sudo lsof /var/lib/dpkg/lock
sudo kill -9 2217
sudo rm /var/dpkg/lock
sudo dpkg --configure -a
sudo apt-get install nfs-kernel-server restart
2、移植uboot、linux、根文件系统
2.1 编译UBoot并烧录
Ubuntu所有的设备文件都在目录“/dev”里,插上SD卡后也在“/dev”里;查看SD卡:ls /dev/sd*,看插上SD卡之后多了那个目录就是你SD的挂在目录。
#1、首先安装ncurses库
sudo apt-get install libncurses5-dev
#将正点原子提供的uboot文件传到ubuntu对应目录,解压uboot
tar -vxjf uboot-imx-2016.03-2.1.0-g8b546e4.tar.bz2
#编译uboot
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
#uboot烧写与启动
sudo cp imxdownload /home/hujinsong/linux/file -f #复制下载工具到u-boot.bin所在文件目录下
chmod 777 imxdownload #修改imxdownload权限
./imxdownload u-boot.bin /dev/sdd #烧写到sd,确认你的sd卡分区
将SD卡插入开发板,将拨码开关拨至从SD卡启动,按下复位键即可;之后开始挂载Linux内核,包括zImage和.dtb设备树两个文件,我这里选择通过网络挂载,所以需要先设置网络配置,保证Ubuntu可以和开发板互ping。然后安装并设置tftp或nfs,通过tftp或nfs完成Linux内核挂载。
2.2 网络环境搭建
2.2.1 配置Windows和VMware软件及Ubuntu网络设置
我的使用场景:电脑wifi上网,开发板和电脑直连
①首先设置ubuntu虚拟机:打开 “VMWare->虚拟机->设置” 并建立两个网络适配器,网络适配器1:桥接模式;网络适配器2:NAT模式;添加VMnet0,将其桥接到电脑网卡上;
②之后设置windows网卡:找到控制面板-网络和Internet-网络连接,设置以太网的IPV4地址;ip地址与前面设置的Vnet0保持同一网段,网关相同;
2.2.1 配置开发板uboot环境变量
设置uboot命令行:使用SD卡烧入uboot后,使用MobaXterm软件通过串口连接开发板,在窗口输入以下命令;测试后输出" host 192.168.10.100 is alive "表示设置成功;
setenv ipaddr 192.168.10.50 #设置ip地址,与ubuntu的桥接地址保持同一网段
setenv ethaddr 00:04:9f:04:d2:35
setenv gatewayip 192.168.10.1 #设置网段
setenv netmask 255.255.255.0
setenv serverip 192.168.10.100 #上文设置的ubuntu桥接IP地址
saveenv
ping 192.168.10.100 #ping测试,ubuntu地址为192.168.10.100
1.2.3 配置TFTP和nfs服务
保证开发板能ping通Ubuntu后,开始搭建tftp和nfs,之后开发过程中使用tftp挂载zImage和dtb、使用nfs挂载根文件系统。
#搭建TFTP
sudo apt-get install xinetd
ls /etc/xinetd.conf #查看是否有xinetd.cof文件,没有的话自己创建一个
mkdir -p /home/linux/IMX6UL/file/tftp
sudo chmod 777 /home/linux/IMX6UL/file/tftp/
sudo apt-get install tftp-hpa tftpd-hpa #安装tftp-hpa和tftpd-hpa服务程序
sudo vi /etc/default/tftpd-hpa
#修改TFTP_DIRECTORY=“自定义tftp工作目录”
sudo vi /etc/xinetd.d/tftp
sudo service tftpd-hpa restart #重启tftpd-hpa服务
sudo service xinetd restart #重启xinetd服务
#配置NFS,如果已经配置则跳过
sudo apt-get install nfs-kernel-server rpcbind
sudo vi /etc/exports
#在最后一行加上nfs文件夹路径(没有exports文件就自己创建一个)
/home/hujinsong/linux/nfs *(rw,sync,no_root_squash)
sudo /etc/init.d/nfs-kernel-server restart #重启nfs
#查看NFS共享目录,如果是上一步设置的说明配置成功
showmount -e
2.3 编译Linux源码,从网络启动内核
2.3.1 编译Linux源码,生成zImage和dtb
Linux驱动环境配置:编写linux驱动时,用到linux内核源码;将linux内核源码发送到ubuntu,解压linux内核源码,编译linux内核源码,得到zImage和.dtb。zImage文件存放在编译目录下./arch/arm/boot/zImage;.dtb文件存放在./arch/arm/boot/dts/imx6ull-14x14.dtb
将内核文件压缩包发送到ubuntu对应目录下,解压文件后编译linux内核
#编译前首先安装lzop
sudo apt-get install lzop
#获取内核源码
sudo rm linux-boot.tar.bz2 ./hujinsong/linux/linuxCode -f
tar -vxjf linux-boot.tar.bz2
#编译内核源码:创建shell脚本muname.sh,在该文件下写入以下内容:
#!/bin/sh
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j12
#成功的标志:kernel:arch/arm/boot/zImage is ready
#修改顶层Makefile:进入linux源码起始目录,vi Makefile,找到ARCH和CROSS_COMPILE
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-gnueabihf-
#手动编译设备树
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf ./arch/arm/boot/dts/imx6ull-14x14-emmc-7-1024x600-c.dtb
make dtbs #之后修改设备数后只需要编译设备树,无需编译整个Linux内核源码
2.3.2 通过tftp网络挂载zImage和dtb设备树
#首先将zImage和dtb文件复制到ubuntu的tftp目录下;zImage在Linux编译目录下的arch/arm/boot/zImage,dtb设备树文件在Linus编译目录下的arch/arm/boot/dts/imx6ull-14x14-evk.dtb
cp /home/linux/arch/arm/boot/zImage /home/hjs/linux/IMX6UL/tftp/ -f
cp /home/linux/arch/arm/boot/dts/imx6ull-14x14-evk.dtb /home/hjs/linux/tftp/ -f #将zImage和dtb设备树文件复制到tftp目录下
tftp 80800000 zImage #挂载zImage
tftp 83000000 imx6ull-14x14-evk.dtb #挂载dtb
bootz 80800000 - 83000000 #启动,注意‘-’左右都有空格
在挂载时出现错误:IP-Config:Failed to open eth0,原因是变量bootargs设置错误,根据下文设置即可。
2.3.3 设置bootcmd和bootargs
进行这步前需要完成:编译并烧入uboot;编译Linux源码生成zImage和dtb;根文件系统
如果通过nfs挂载根文件系统,需要先将根文件系统复制到上文设置的根文件目录(如上文设置的:/home/hujinsong/linux/IMX6UL/nfs/rootfs);如果是从emmc启动根文件系统,需要先使用mfgTool将出场系统烧入开发板。
#如果从EMMMC启动内核、从emmc启动根文件系统
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
setenv bootcmd 'mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000;'s
saveenv
#如果从网络启动内核、从emmc启动根文件系统
setenv bootargs 'console==ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000;'
saveenv
#如果从通过nfs网络挂载根文件系统
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.10.100:/home/hujinsong/linux/IMX6UL/nfs/rootfs,prpto=tcp rw ip=192.168.10.50:192.168.10.100:192.168.10.1:255.255.255.0::eth0:off'
saveenv
boot #使用网络挂载
#!出现No Soundcard found、IPconfig failed eth1..等错误,都因为是bootargs设置错误,检查是否输入错误