个人学习笔记,仅供参考。 硬件是正点原子的imx6ull的开发板。
1.用NXP提供的MfgTool工具烧写,通过 USB OTG 口来烧写系统。 2.烧写需要准备四个文件: 2.1 uboot 可执行文件:u-boot-imx6ull14x14evk_emmc.imx 2.2 zImage 镜像文件:zImage(LINUX系统镜像) 2.3 开发板对应的.dtb(设备树):zImage-imx6ull-14x14-evk-emmc.dtb 2.4 根文件系统 rootfs:rootfs_nogpu.tar.bz2(压缩文件)
Linux 系统要启动就必须需要一个 bootloader 启动程序,其中有 U-Boot、vivi、RedBoot 等,其中以 U-Boot 使用最为广泛。
uboot有三种下载方式:
uboot 官网下载 http://www.denx.de/wiki/U-Boot/ 一般不会直接用 uboot 官方的 U-Boot 源码的,uboot 官方的 uboot 源码是给半导体厂商准备的。半导体厂商维护的 uboot(imx6ull是NXP) http://git.freescale.com/git/cgit.cgi/imx/uboot-imx.git/tag/?h=imx_v2016.03_4.1.15_2.0.0_ga&id=rel_imx_4.1.15_2.1.0_ga开发板厂家提供 (如正点原子)用NXP官方的 uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
Ubuntu 中安装 ncurses 库,否则编译会报错。
sudo apt-get install libncurses5-dev249-250行插入这个,省的每次编译 uboot 的时候都要在 make 命令后面设置ARCH 和 CROS_COMPILE
ARCH ?= arm CROSS_COMPILE ?=arm-linux-gnueabihf-新建名为 mx6ull_alientek_emmc.sh 的 shell 脚本文件。
#!/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_alientek_emmc.sh ./mx6ull_alientek_nand.sh然后可以烧到SD卡中看看,附录一 1.2 有几个检测指令(boot)可以试试。
复制 mx6ull_14x14_evk_emmc_defconfig,然后重命名为 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复 制include/configs/mx6ullevk.h,并重命名为 mx6ull_alientek_emmc.h 将: #ifndef __MX6ULLEVK_CONFIG_H #define __MX6ULLEVK_CONFIG_H 改为: #ifndef __MX6ULL_ALIENTEK_EMMC_CONFIG_H #define __MX6ULL_ALIENTEK_EMMC_CONFIG_H
复制 mx6ullevk,将其重命名为 mx6ull_alientek_emmc 将 其 中 的 mx6ullevk.c 文 件 重 命 名 为mx6ull_alientek_emmc.c 将 mx6ull_alientek_emmc 下的 Makefile 文件:
obj-y := mx6ull_alientek_emmc.o//第六行改一下imximage.cfg 文件:
PLUGIN board/freescale/mx6ull_alientek_emmc /plugin.bin 0x00907000Kconfig 文件:
if TARGET_MX6ULL_ALIENTEK_EMMC 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" endifMAINTAINERS 文件:
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.harch/arm/cpu/armv7/mx6/Kconfig
//在 207 行加入如下内容: 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"grep -nR “mx6ull_alientek_emmc.h” 如果编译后执行这个指令会出现很多mx6ull_alientek_emmc.h,那就算是添加成功了
我买的屏是原子的4.3寸屏,以此举例:
打开board/freescale/mx6ull_alientek_emmc/mx6ull_alientek_emmc.c struct display_info_t const displays[] = {{ .bus = MX6UL_LCDIF1_BASE_ADDR, .addr = 0, .pixfmt = 24, .detect = NULL, .enable = do_enable_parallel_lcd, .mode = { .name = "TFT4342", .xres = 480, .yres = 272, .pixclock = 108695,//这个我没改,但是显示屏能用。。。 .left_margin = 40, //HBPD .right_margin = 5, //HFPD .upper_margin = 8, //VBPD .lower_margin = 8, //VFBD .hsync_len = 1, //HSPW .vsync_len = 1, //VSPW .sync = 0, .vmode = FB_VMODE_NONINTERLACED } } };参照着改吧。 顺便把板子名字改一下
int checkboard(void) { if (is_mx6ull_9x9_evk()) puts("Board: MX6ULL 9x9 EVK\n"); else puts("Board: MX6ULL ALIENTEK EMMC\n"); return 0; } 打开include/configs/mx6ull_alientek_emmc.h panel=TFT43AB //将其改为: panel=TFT7016 //有两行 修改uboot 烧到内存卡卡,启动uboot setenv panel TFT7016 saveenv然后重启,OK。
呵,没网线,下次一定。
需要 ncurses 库支持
sudo apt-get install build-essential sudo apt-get install libncurses5-dev.config 文件保存着 uboot 的配置项。Kconfig文件是图形界面的描述文件。
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_alientek_emmc_defconfig//清一下工程 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig//打开图像配置界面注意!!! 图形化配置的话不要使用./mx6ull_alientek_emmc.sh,会删掉.config 文件! 用这个: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16
启动 Linux 内核的方法,一种是直接从 EMMC 启动,一种是从网络启动。 网络没配,下次一定。 用emmc吧,先查一下emmc里有没有zImage 文件和设备树文件。
ls mmc 1:1有的话可以尝试启动,没有就去移植一个。
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-14x14-evk.dtb; bootz 80800000 - 83000000;'//我的是imx6ull-14x14-evk.dtb,看着改 saveenv//记得保存参数 boot//启动ubuntu安装库: sudo apt-get install lzop
Linux 官网为 https://www.kernel.org NXP从linux官网下载内核后移植版本也有,要自己去找,我用的就是NXP移植版linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2。
1.先清一下内核:make clean 2.再配置一下内核:make imx_v7_mfg_defconfig 3.编译一下内核:make -j16 zImage 镜像文件:arch/arm/boot/zImage .dtb(设备树)文件:arch/arm/boot/dts/mx6ull-14x14-evk.dtb
是把系统烧到板子上,在终端配置,不会烧往下看,再回来配置。
BusyBox官网地址为:https://busybox.net/ 自用1.29.0 版本的 BusyBox,busybox-1.29.0.tar.bz2
建个文件夹 解压。
顶层 Makefile:
CROSS_COMPILE ?= /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- ARCH ?= armbusybox中的 shell 命令对中文输入即显示做了限制,修改 busybox 源码,取消限制。
libbb/printable_string.c 第 31 和 32 行,当字符大于 0X7F 以后就跳出去了。 第 45 和 46 行,如果支持 UNICODE 码的话,当字符大于 0X7F 就直接输出‘?’。 /* 注释掉下面这个两行代码 */ /* if (c >= 0x7f) break; */ ... /* 修改下面代码 */ /* if (c < ' ' || c >= 0x7f) */ if( c < ' ') *d = '?'; libbb/unicode.c 第 1022 行,当字符大于 0X7F 以后,*d++就为‘?’。 第 1030 和 1031 行,当字符大于 0X7F 以后,*d 也为‘?’。 /* 修改下面一行代码 */ /**d++ = (c >= ' ' && c < 0x7f) ? c : '?';*/ *d++ = (c >= ' ') ? c : '?'; ... /* 修改下面一行代码 */ /*if (c < ' ' || c >= 0x7f)*/ if(c < ' ') *d = '?';主目录下新建文件夹rootfs 执行命令 make install CONFIG_PREFIX=/home/weser/Desktop/linux/rootfs_linux/busybox-1.29.0/rootfs 如果有问题,反思一下是不是路径错了
效果图: 2. rootfs/usr/lib
cd /home/weser/Desktop/linux/rootfs_linux/busybox-1.29.0/rootfs/usr/ //在这个文件夹里 mkdir lib //新建文件夹 cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib //打开文件夹 cp *so* *.a /home/weser/Desktop/linux/rootfs_linux/busybox-1.29.0/rootfs/usr/lib/ -d //复制 //进入rootfs根目录 du ./lib ./usr/lib/ -sh //查看 lib 和 usr/lib 这两个目录的大小rootfs/usr/lib文件夹: 目录大小:
rootfs/其它文件夹 mkdir dev proc mnt sys tmp root etc /etc/init.d/rcS 在 rootfs 中创建/etc/init.d/rcS 文件 rcS 是个 shell 脚本, Linux 内核启动以后需要启动一些服务,而 rcS 就是规定启动哪些文件的脚本文件。 #!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib runlevel=S umask 022 export PATH LD_LIBRARY_PATH runlevel mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s #开机自启动 cd /weser ./hello & cd / 赋予执行权限:chmod 777 rcS /etc/fstab rootfs 中创建/etc/fstab 文件 fstab 在 Linux 开机以后自动配置哪些需要自动挂载的分区 #<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 /etc/inittab rootfs 中创建/etc/inittab 文件 启动进程的控制 tty #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 hello.c 在rootfs 中创建weser文件夹,自己程序可以放这里 rootfs 中创建/weser/hello.c 文件 #include <stdio.h> int main(void) { while(1){ printf("hello word!!\r\n"); sleep(2); } return 0; }编译:arm-linux-gnueabihf-gcc hello.c -o hello
打包文件系统 cd rootfs/ tar -vcjf rootfs.tar.bz2 *到这来就可以了。
MfgTool 工具是 NXP 提供的专门用于给 I.MX 系列 CPU 烧写系统的软件,可以在 NXP 官网下载到。 解压L4.1.15_2.0.0-ga_mfg-tools.tar.gz 解压后打开 L4.1.15_2.0.0-ga_mfg-tools。 解压: mfgtools-with-rootfs.tar.gz(不带 rootfs) 常用的VBS就这几个,其他可以删了。 把前面配置好的四个文件拷到windows环境下,并改名 firmware,files目录原本有的全部删掉,然后:
zImage、u-boot-imx6ull14x14evk_emmc.imx 和 zImage-imx6ull-14x14-evk-emmc.dtb 这三个文件拷贝到 mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware/firmware 目录中。上面四个文件都拷贝到mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware/files目录中。我用的是emmc,所以点击mfgtool2-yocto-mx-evk-emmc.vbs 开发板是usb模式,读到设备后烧写。 然后开发板切换到emmc模式。 打开串口:
到这就移植完了。下面是MfgTool 优化。 对了,想要停止hello word任务的话,输入ps 然后看看是哪个进程 然后: kill -9 61(我的进程是61)
看了一下发现没什么必要,算了,回头找个网线再把网络配置补上吧。。
1.1.1 ? 查询指令 1.1.2 bdinfo 查看板子信息 1.1.3 printenv 输出环境变量信息 1.1.4 version 查看 uboot 的版本号 1.1.5 setenv 用于设置或者修改环境变量的值 1.1.6 saveenv 用于保存修改后的环境变量 将环境变量 bootdelay 改为 5
//boot切换linux的时间延时: setenv bootdelay 5 saveenv //环境变量值有空格: setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw' saveenv //新建环境变量 setenv author zuozhongkai saveenv //删除环境变量 setenv author saveenv1.1.7 内存操作命令 直接对 DRAM 进行读写操作的: md、nm、mm、mw、cp 和 cmp。 1.1.8 网络操作命令
setenv ipaddr 192.168.1.50 setenv ethaddr 00:04:9f:04:d2:35 setenv gatewayip 192.168.1.1 setenv netmask 255.255.255.0 setenv serverip 192.168.1.250 saveenv1.1.9 EMMC 和 和 SD 卡操作命令 MMC 设备的命令为“mmc” 1.1.10 FAT 格式文件系统操作命令 fatinfo、fatls、fstype、fatload 和 fatwrite 只支持 FAT 格式的文件系统! ! 1.1.11 EXT 格式文件系统操作命令 uboot 有 ext2 和 ext4 这两种格式的文件系统的操作命令,常用的就四个命令,分别为:ext2load、ext2ls、ext4load、ext4ls 和 ext4write。 1.1.12 NAND 操作命令 ? nand 自己去看 1.1.13 BOOT 操作命令 bootz、bootm 和 boot 其他,比如 reset、go、run 和 mtest 等。
检查一下 SD 卡和 EMMC 驱动是否正常:mmc list //检查设备0 设备1 mmc dev 0 mmc info mmc dev 1 mmc info