导图社区 BSP-ARM裸机开发
包含BSP-Linux内核移植、BSP-rootfs、BSP-Uboot系统移植等,https://www.yuque.com/laotulv-vkote/cas4kg/zkggacehag8dbrku?singleDoc# 《1-2 ARM裸机开发》
编辑于2024-11-30 16:27:11BSP-ARM裸机开发
BSP-Linux内核移植
一、 NXP官方开发板Linux内核编译
在编译Linux内核之前需要先配置Linux内核,每个板子都有其对应的默认配置文件,这些默认配置文件保存在arch/arm/configs/目录中。编译完后会在arch/arm/boot/目录下生成zImage镜像文件,在arch/arm/boot/dts/目录下生成开发板对应设备树如imx6ull-14x14-evk-emmc.dtb。 #上传 从windows 把linux内核文件(linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2)上传到ubuntu #解压 tar -xvjf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 #重命名 mv linux-imx-rel_imx_4.1.15_2.1.0_ga/ linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek/ # 新建shell脚本 vim imx6ull_14x14_evk.sh #写入 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_mfg_defconfig make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12 #赋予权限 chmod 777 imx6ull_14x14_evk.sh #执行编译,注意编译需要很长时间(可以修改虚拟机CPU内核数量) ./imx6ull_14x14_evk.sh
二、 bootcmd和bootargs环境变量
bootcmd和bootargs是uboot中两个非常重要的环境变量,是采用类似shell脚本语言编写的,这些变量其实都是环境变量,很多是NXP自己定义的。其中NXP_uboot/include/configs/目录下的mx6ull_alientek_emmc.h中的宏CONFIG_EXTRA_ENV_SETTINGS保存着这些环境变量的默认值。关于宏定义的条件编译可见NXP_uboot/include/目录下env_default.h文件。
三、 Linux内核启动
# 拷贝镜像 cp arch/arm/boot/zImage ~/linux/tftpboot/ # 拷贝设备树文件 cp arch/arm/boot/dts/imx6ull-14x14-evk-emmc.dtb ~/linux/tftpboot/ # 赋权 chmod -R 777 ~/linux/tftpboot/ # 从uboot ping 下ubuntu,下面要改成你自己的ubuntu地址 ping 192.168.10.100 # 保存环境变量,注意:目前根文件系统还不能用 setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.10.100:/home/自己的家目录/linux/nfs/rootfs,proto=tcp rw ip=192.168.10.50:192.168.10.100:192.168.10.1:255.255.255.0::eth0:off' #保存 saveenv # 切换设备 mmc dev 0 # 上传镜像 # 从tpf服务器下载zImage tftp 80800000 zImage #从tftp服务器下载设备树 tftp 83000000 imx6ull-14x14-evk-emmc.dtb #启动linux内核 bootz 0x80800000 - 0x83000000
1. bootz命令
网络启动
EMMC启动
2. bootm命令
3. boot命令
四、 添加自己的开发板
1. 添加开发板配置文件
cd arch/arm/configs cp imx_v7_mfg_defconfig imx_alientek_emmc_defconfig vim imx_alientek_emmc_defconfig #屏蔽第20行 # CONFIG_ARCH_MULTI_V6=y
2. 添加开发板对应的设备树文件
cd arch/arm/boot/dts cp imx6ull-14x14-evk-emmc.dts imx6ull-alientek-emmc.dts vim arch/arm/boot/dts/Makefile #在422行加入以下代码 imx6ull-elientek-emmc.dtb \ #根目录新建脚本 vim imx6ull_alientek_emmc.sh #写入 #!/bin/bash make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_alientek_emmc_defconfig make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig(可不加图形配置界面) make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j12 #赋权 chmod 777 imx6ull_alientek_emmc.sh #编译测试可不做,等修改完驱动文件
五、 修改网络驱动
1. 修改SR8201F复位及网络时钟引脚驱动
cd arch/arm/boot/dts vim imx6ull-14x14-evk.dts #删除 pinctrl_spi4:spi4grp{ 中第3,4行代码,为原文件588、589行 #删除第129、133行代码 #添加以下代码至577行左右 pinctrl_enet1_reset: enet1resetgrp { fsl,pins = < MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0 >; }; pinctrl_enet2_reset: enet2resetgrp { fsl,pins = < MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0 >; };
2. 修改SR8201F的PHY地址
#170行左右 &fec1 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_enet1 &pinctrl_enet1_reset>; phy-mode = "rmii"; phy-handle = <ðphy0>; phy-reset-gpios=<&gpio5 7 GPIO_ACTIVE_LOW>; phy-reset-duration=<200>; status = "okay"; }; &fec2 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_enet2 &pinctrl_enet2_reset>; phy-mode = "rmii"; phy-handle = <ðphy1>; phy-reset-gpios=<&gpio5 8 GPIO_ACTIVE_LOW>; phy-reset-duration=<200>; status = "okay";
3. 修改fec_main.c文件
#根目录下打开 vim drivers/net/ethernet/freescale/fec_main.c #3356行添加 msleep(200);
4. 网络驱动测试
5. 设置静态IP地址
BSP-rootfs
1. 根文件系统简介
2. 下载构建工具BusyBox
#创建目录 mkdir ~/linux/busybox # 进入目录 cd ~/linux/busybox #下载busybox 的源码 wget https://busybox.net/downloads/busybox-1.29.0.tar.bz2 #解压 tar -vxjf busybox-1.29.0.tar.bz2
3. 编译BusyBox构建根文件系统
#进入目录 cd busybox-1.29.0/ #创建目录 mkdir ~/linux/nfs/rootfs
修改Makefile,添加编译器
#164行改为 CROSS_COMPILE ?= /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- #191行改为 ARCH ?= arm
BusyBox中文字符支持
#打开文件 vim libbb/printable_string.c #修改printable_string函数,注释下面两行代码,31、32行 if (c >= 0x7f) break; #继续45行改为 if (c < ' ' ) #打开文件 vim libbb/unicode.c #第1022行左右,修改为 *d++ = (c >= ' ' ) ? c : '?'; #继续1031行左右,修改为 if (c < ' ' )
配置BusyBox
BusyBox中文字符支持跟代码修改以后,还需要配置BusyBox来使能unicode码。 make defconfig用于生成一个基本的配置文件.config,这个文件包含了BusyBox的默认配置选项。它是通过复制一个预定义的配置文件(如xxx_defconfig)到.config来实现的。这个配置是最小的配置项,适合大多数用户的基本需求。 make menuconfig则是一个交互式的配置工具,允许用户通过图形界面来选择和配置BusyBox的各种选项。它基于.config文件进行配置,用户可以在图形界面中选择或取消选择特定的功能,从而定制BusyBox的功能集。这种方式更加灵活,适合需要详细定制功能的用户。 #根目录下编译 make defconfig #配置图形界面,按照文档P26~28页图形界面选择 make menuconfig
编译BusyBox
#根目录下编译 make make install CONFIG_PREFIX=~/linux/nfs/rootfs
4. 向根文件系统添加lib库
向rootfs的/lib/目录添加库文件
#在rootfs目录下添加lib目录 mkdir lib #进入交叉编译目录的lib目录中 cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib # copy 库文件 cp *so* *.a ~/linux/nfs/rootfs/lib/ -d # 进入rootfs目录 cd ~/linux/nfs/rootfs/lib/ #查看文件留意文件大小 ll ld-linux-armhf.so.3 #删除符号链接 rm ld-linux-armhf.so.3 #重新copy cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib cp ld-linux-armhf.so.3 ~/linux/nfs/rootfs/lib/ #再次查看文件大小 ll ld-linux-armhf.so.3 #进入目录 cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib # 继续copy lib cp *so* *.a ~/linux/nfs/rootfs/lib/ -d
向rootfs的/usr/lib/目录添加库文件
#向 rootfs 的“usr/lib”目录添加库文件 cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib # 创建目录 mkdir ~/linux/nfs/rootfs/usr/lib/ #copy 库文件 cp *so* *.a ~/linux/nfs/rootfs/usr/lib/ -d #查看目录大小, 正常为57MB和67MB cd ~/linux/nfs/rootfs/ du ./lib ./usr/lib -sh
创建其他文件夹
#创建其他目录 cd ~/linux/nfs/rootfs/ mkdir dev proc mnt sys tmp root
5. 根文件系统初步测试
#连接网线,进入uboot界面设置环境变量 setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.10.100:/home/自己的家目录/linux/nfs/rootfs,proto=tcp rw ip=192.168.10.50:192.168.10.100:192.168.10.1:255.255.255.0::eth0:off' #设置bootcmd setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000' #启动 boot
6. 完善根文件系统
rcS文件
# rootfs目录下创建目录 mkdir -p etc/init.d/ #rootfs目录下创建文件 vim etc/init.d/rcS #写入 #!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib export PATH LD_LIBRARY_PATH mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s #授权 chmod 777 rcS
fstab文件
#创建etc/fstab 文件 vim etc/fstab #写入 #<file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 sysfs /sys sysfs defaults 0 0
inittab文件
#创建etc/inittab 文件 vim etc/inittab #写入 #etc/inittab ::sysinit:/etc/init.d/rcS console::askfirst:-/bin/sh ::restart:/sbin/init ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r ::shutdown:/sbin/swapoff -a
7. 启动测试
#创建目录 mkdir /etc/drivers #赋权 cd etc/ sudo chmod 777 drivers/ #新建源文件 cd drivers vim hello.c #写入 #include <stdio.h> int main() { printf("hello world!\n"); return 0; } # 编译 arm-linux-gnueabihf-gcc hello.c -o hello # 查看文件类型 file hello #启动开发板,连接串口,进入系统目录测试,注意是开发板的系统目录,不是ubutun cd etc/drivers ./hello
BSP-Uboot系统移植
一、 U-boot使用实验
1. U-boot简介
2. U-boot初次编译
#创建目录并进入: mkdir -p ~/linux/IMAX6ULL/uboot 上传文件: uboot-imx-2016.03-2.1.0-g0ae7e33-v1.7.tar.bz2 #解压: tar -vxjf uboot-imx-2016.03-2.1.0-g0ae7e33-v1.7.tar.bz2 #使用shell脚本编译 vim mx-6ull_emmc.sh #写入 #!/bin/bash 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 #授予脚本可执行权限 chmod u+x mx-6ull_emmc.sh # 执行脚本 ./mx-6ull_emmc.sh
3. U-boot烧写与启动
#查看磁盘确认 ls /dev/sd* #烧写 imxdownload u-boot.bin /dev/sdb
二、 U-boot命令使用
三、 U-boot移植
1. 查找NXP官方的开发板默认配置文件
I.MX6ULL开发板参考的是NXP官方的I.MX6ULL EVK开发板做的硬件,因此我们在移植uboot的时候可以以NXP官方的I.MX6ULL EVK开发板作为蓝本。这里我们使用的是EMMC版本的移植,所以使用NXP根目录下的 configs/mx6ull_14x14_evk_emmc_defconfig 作为默认配置文件。 # 创建目录:在~/linux/IMAX6ULL目录下创建目录并进入 mkdir NXP_uboot 上传NXP的uboot ( uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2)到新创建的目录 # 解压: tar -vxjf uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
2. 编译NXP官方开发板对应的uboot
#创建shell脚本编译 vim mx6ull_14x14_emmc.sh #写入 #!/bin/bash make ARCH = arm CROSS_COMPILE = arm-linux-gnueabihf- distclean make ARCH = arm CROSS_COMPILE = arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig make V=1 ARCH = arm CROSS_COMPILE = arm-linux-gnueabihf- -j16 #赋权限并执行 chmod 777 mx6ull_14x14_emmc.sh ./mx6ull_14x14_emmc.sh
3. 烧写验证与驱动测试
#烧写入SD卡 imxdownload u-boot.bin /dev/sdb 将SD卡插入开发板,详细驱动检查指令见1-3 P15~16 总结NXP官方I.MX6ULL EVK 开发板的uboot在EMMC版本的开发板上的运行情况: uboot启动正常,DRAM识别正确,SD卡和EMMC驱动正常。 uboot里的LCD驱动默认为4.3寸 480*272 分辨率的,使用其他需修改驱动。 网络不能工作,识别不出来网络信息,需修改驱动。
四、 添加自己的开发板
1. 添加自己开发板的配置文件
#先在 configs 目录下创建默认配置文件 cd configs cp mx6ull_14x14_evk_emmc_defconfig mx6ull_alientek_emmc_defconfig #修改自己开发板的配置文件 vim mx6ull_alientek_emmc_defconfig #写入 CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ull_alientek_emmc/imximage.cfg,MX6ULL_EVK_EMMC_REWORK" CONFIG_ARM=y CONFIG_ARCH_MX6=y CONFIG_TARGET_MX6ULL_ALIENTEK_EMMC=y CONFIG_CMD_GPIO=y
2. 添加开发板对应的头文件
#在 目 录 include/configs 下 添 加 I.MX6ULL-ALPHA 开 发 板 对 应 的 头 文 件 , 复 制include/configs/mx6ullevk.h,并重命名为 mx6ull_alientek_emmc.h cp include/configs/mx6ullevk.h include/configs/mx6ull_alientek_emmc.h #修改头文件 vim include/configs/mx6ull_alientek_emmc.h #替换8~9行 #ifndef __MX6ULL_ALIENTEK_EMMC_CONFIG_H #define __MX6ULL_ALIENTEK_EMMC_CONFIG_H
宏定义配置项目介绍
3. 添加开发板对应的板级文件
uboot 中每个板子都有一个对应的文件夹来存放板级文件,比如开发板上外设驱动文件等等。 NXP 的 I.MX 系列芯片的所有板级文件夹都存放在 board/freescale 目录下,在这个目录下有个名为 mx6ullevk 的文件夹,这个文件夹就是 NXP 官方 I.MX6ULL EVK 开发板的板级文件夹。 #复制 mx6ullevk,将其重命名为 mx6ull_alientek_emmc cd board/freescale/ cp -r mx6ullevk/ mx6ull_alientek_emmc/ #然后 cd mx6ull_alientek_emmc mv mx6ullevk.c mx6ull_alientek_emmc.c
修改board/freescale/mx6ull_alientek_emmc/目录下文件
Makefile
#打开Makefile vim Makefile #修改第6行内容 obj-y := mx6ull_alientek_emmc.o
imximage.cfg
#打开imximage.cfg vim imximage.cfg #修改34行 PLUGIN board/freescale/mx6ull_alientek_emmc/plugin.bin 0x00907000
Kconfig
#打开Kconfig vim Kconfig #修改为 if TARGET_MX6ULL_ALIENTEK_EMMC|| TARGET_MX6ULL_9X9_EVK config SYS_BOARD default "mx6ull_alientek_emmc" config SYS_VENDOR default "freescale" config SYS_SOC default "mx6" config SYS_CONFIG_NAME default "mx6ull_alientek_emmc" endif
MAINTAINERS
#打开MAINTAINERS vim MAINTAINERS #修改为 MX6ULL_ALIENTEK_EMMC BOARD M: Peng Fan <peng.fan@nxp.com> S: Maintained F: board/freescale/mx6ull_alientek_emmc/ F: include/configs/mx6ull_alientek_emmc.h F: configs/mx6ull_alientek_emmc_defconfig
4. 修改uboot图形界面配置文件
#打开文件 vim arch/arm/cpu/armv7/mx6/Kconfig #第195 行加入如下内容 config TARGET_MX6ULL_ALIENTEK_EMMC bool "Support mx6ull_alientek_emmc" select MX6ULL select DM select DM_THERMAL #在最后一行的 endif 的前一行添加如下内容 source "board/freescale/mx6ull_alientek_emmc/Kconfig"
5. 使用新添加的板子配置编译uboot
#根目录创建脚本 vim mx6ull_alientek_emmc.sh #写入 #!/bin/bash #注意:disclean前面有一个空格 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-(加空格)mx6ull_alientek_emmc_defconfig # 注意-j16 前面有个空格 make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16 #赋权 chmod u+x mx6ull_alientek_emmc.sh #运行脚本完成编译 ./mx6ull_alientek_emmc.sh #查看头文件是否被引用 grep -nR "mx6ull_alientek_emmc.h" #先重新格式化一下SD卡 #烧写 imxdownload u-boot.bin /dev/sdb
五、 修改网络驱动
1. 开发板网络简介
NXP官方的I.MX6ULL EVK开发板使用KSZ8081这颗PHY芯片,而I.MX6ULL-ALPHA开发板使用SR8201F这颗PHY芯片 修改网络驱动三点注意事项: ENET1: ENET1复位引脚ENET1_RST接到了SNVS_TAMPER7这个引脚。 ENET1所使用的PHY芯片器件为0X2。 ENET1使用的是SR8201F驱动。 ENET2: ENET2复位引脚ENET2_RST接到了SNVS_TAMPER8这个引脚。 ENET2所使用的PHY芯片器件为0X1。 ENET2使用的是SR8201F驱动。
2. 网络PHY地址修改
#打开文件 vim include/configs/mx6ull_alientek_emmc.h #替换第344行 #define CONFIG_PHY_REALTEK
3. 修改uboot中74LV595的驱动代码
#打开文件 vim board/freescale/mx6ull_alientek_emmc/mx6ull_alientek_emmc.c #修改为 #define IOX_SDI IMX_GPIO_NR(5, 10) #define ENET1_RESET IMX_GPIO_NR(5, 7) #define IOX_SHCP IMX_GPIO_NR(5, 11) #define ENET2_RESET IMX_GPIO_NR(5, 8) #删除函数 static iomux_v3_cfg_t const iox_pads[] static void iox74lv_init(void) void iox74lv_set(int index) #修改board_init函数,删除下面两行 imx_iomux_v3_setup_multiple_pads(iox_pads, ARRAY_SIZE(iox_pads)); iox74lv_init();
4. 添加开发板网路复位引脚驱动
#打开文件 vim board/freescale/mx6ull_alientek_emmc/mx6ull_alientek_emmc.c #修改553行左右 #fec1_pads中加入 MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL), #fec2_pads中加入 MX6_PAD_SNVS_TAMPER8__GPIO5_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL), #修改函数static void setup_iomux_fec函数为: static void setup_iomux_fec(int fec_id) { if (fec_id == 0){ imx_iomux_v3_setup_multiple_pads(fec1_pads, ARRAY_SIZE(fec1_pads)); gpio_direction_output(ENET1_RESET,1); gpio_set_value(ENET1_RESET,0); mdelay(20); gpio_set_value(ENET1_RESET,1); }else{ imx_iomux_v3_setup_multiple_pads(fec2_pads, ARRAY_SIZE(fec2_pads)); gpio_direction_output(ENET2_RESET,1); gpio_set_value(ENET2_RESET,0); mdelay(20); gpio_set_value(ENET2_RESET,1); } mdelay(150); } #修改开发板名字,找到checkboard函数 int checkboard(void) { if (is_mx6ull_9x9_evk()) puts("Board: MX6ULL 9x9 EVK\n"); else puts("Board: MX6ULL ALIENTEK EMMC\n"); return 0; }
5. 再次编译、下载
./mx6ull_alientek_emmc.sh #查看头文件是否被引用 grep -nR "mx6ull_alientek_emmc.h" #烧写 imxdownload u-boot.bin /dev/sdb
6. windows、ubutun网络环境设置
7. 启动uboot并ping测试
#在uboot中设置以下环境变量 #设置开发板IP地址 setenv ipaddr 192.168.10.50 #设置开发板网卡1 MAC地址 setenv ethaddr b8:ae:1d:01:00:00 #设置开发板网卡2 MAC地址 setenv eth1addr 32:34:46:78:9A:DD #设置开发板默认网关 setenv gatewayip 192.168.10.1 #设置开发板子网掩码 setenv netmask 255.255.255.0 #设置服务器地址,一般是windows或Ubuntu地址 # 下面是ubuntu的地址 setenv serverip 192.168.10.100 #保存 saveenv #插上网线(ping不通查看并关闭windows和ubutu防火墙) ping 192.168.10.100
六、 网络操作命令
1. nfs命令
#创建目录 mkdir ~/linux/nfs #授权 chmod 777 nfs # nfs权限 sudo vim /etc/exports #写入 /home/自己的家目录/linux/nfs *(rw,sync,no_root_squash) #重启nfs服务器: sudo /etc/init.d/nfs-kernel-server restart #查看nfs服务进程 ps -ef| grep nfs #可以拷贝一份zImage文件测试,注意开zImage文件权限 nfs 80800000 192.168.10.100:/home/自己的家目录/linux/nfs/zImage
2. tftp命令
#创建目录 mkdir ~/linux/tftpboot #授权 chmod -R 777 tftpboot/ # 创建文件 sudo touch /etc/xinetd.d/tftp #修改文件 sudo vim /etc/xinetd.d/tftp #写入 server tftp { socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /home/自己的家目录/linux/tftpboot/ disable = no per_source = 11 cps = 100 2 flags = IPv4 } #编辑文件 sudo vim /etc/default/tftpd-hpa #写入 # /etc/default/tftpd-hpa TFTP_USERNAME="tftp" TFTP_DIRECTORY="/home/自己的家目录/linux/tftpboot/" TFTP_ADDRESS=":69" TFTP_OPTIONS="-l -c -s --secure" #重启服务器 sudo service tftpd-hpa start #可以拷贝一份zImage文件测试,注意开zImage文件权限 tftp 80800000 zImage
3. EMMC和SD卡操作
操作文件时注意所在目录
每次imxdownload查sdb
注意文件或目录权限,否则会报错
注意修改自己的家目录
注意防火墙,不关会报错
待读,可勾选作标记
安装TFTP服务
sudo apt-get install tftp-hpa tftpd-hpa sudo apt-get install xinetd
安装NFS服务
sudo apt-get install nfs-kernel-server rpcbind
安装32位的C++标准库
#安装依赖。提供32位的C++标准库的支持 sudo apt-get install lsb-core lib32stdc++6
安装lzop
lzop是Linux系统中的一个快速压缩程序,能以非常快的速度对文件进行压缩和解压缩,而且占用的系统资源也比较少。 lzop与gzip和bzip2的比较:lzop相对于gzip和bzip2来说,压缩速度更快,但压缩比例可能会稍差。因此,如果你对文件压缩的速度要求较高,lzop是一个不错的选择。而如果你更关注压缩比例,那么gzip或bzip2可能更适合你的需求。 sudo apt-get install lzop
安装ncurses库
#安装ncurses库,避免报错 sudo apt-get install libncurses5-dev
下载过程出现问题
如出现以下情况: Loading: *** ERROR :Cannot mount T T T T T Loading: T T T T 确保网络联通前提下: 关闭防火墙 修改主机/etc/hosts文件,加入以下代码 开发板ip/home/自己的家目录/linux/nfs/zImage
防火墙
#查看防火墙状态,安装ubutun后,默认是没开启ufw的。 sudo ufw status #启用防火墙 sudo ufw enable #查看防火墙详细情况 sudo ufw status verbose #关闭防火墙 sudo ufw disable #更详细的学习 https://www.cnblogs.com/wusanga/p/18417005
imxdownload
imxdownload是一个用于在i.MX6ULL等嵌入式设备上烧写文件和初始化外设的工具。 它主要负责在烧写文件前添加一段启动头文件,这段启动头文件包含了设备启动所需的各种地址信息和配置数据。注意最终烧写到SD卡中的文件为*.imx,见1-2 P15页。 上传烧写工具imxdownload #赋予权限 chmod 777 imxdownload 添加该工具路径至环境变量PATH
交叉编译器
Ubuntu自带的gcc编译器是针对X86架构的,而我们现在要编译的是ARM架构的代码,所以我们需要一个在X86架构的PC上运行,又可以编译ARM的GCC编译器,这个编译器叫做交叉编译器。 #创建目录,家目录下创建目录 mkdir -p ~/linux/tool #上传文件 wget --no-check-certificate https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabihf/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz #创建目录 sudo mkdir /usr/local/arm #copy 文件 sudo cp -f gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz /usr/local/arm/ #解压文件 sudo tar -xvf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz # 修改环境变量 sudo vim /etc/profile #最后面加入: export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin #刷新环境文件 source /etc/profile