LINUX-I.MX6U從零開始之2.0--移植Linux操作系統

個人學習筆記,僅供參考。
硬件是正點原子的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(壓縮文件)

二,uboot製作

Linux 系統要啓動就必須需要一個 bootloader 啓動程序,其中有 U-Boot、vivi、RedBoot 等,其中以 U-Boot 使用最爲廣泛。

2.1 uboot下載

uboot有三種下載方式:

  1. uboot 官網下載
    http://www.denx.de/wiki/U-Boot/
    一般不會直接用 uboot 官方的 U-Boot 源碼的,uboot 官方的 uboot 源碼是給半導體廠商準備的。
  2. 半導體廠商維護的 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
  3. 開發板廠家提供 (如正點原子)
2.2 uboot測試

用NXP官方的 uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2

2.2.1 安裝 ncurses 庫

Ubuntu 中安裝 ncurses 庫,否則編譯會報錯。

sudo apt-get install libncurses5-dev
2.2.2 改頂層Makefile(和2.2.3二選一即可)

249-250行插入這個,省的每次編譯 uboot 的時候都要在 make 命令後面設置ARCH 和 CROS_COMPILE

ARCH ?= arm
CROSS_COMPILE ?=arm-linux-gnueabihf-
2.2.3 創建shell 腳本(和2.2.2二選一即可)

新建名爲 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)可以試試。

2.3 uboot中添加自己的開發板
2.3.1 configs 目錄下

複製 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
2.3.2. include/configs 目錄下

復 制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

2.3.3 board/freescale 目錄下

複製 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 0x00907000

Kconfig 文件:

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"

endif

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
2.4 U-Boot 圖形界面

arch/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,那就算是添加成功了

2.4.1 配置LCD屏

我買的屏是原子的4.3寸屏,以此舉例:

  1. 打開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;
}
  1. 打開include/configs/mx6ull_alientek_emmc.h
panel=TFT43AB
//將其改爲:
panel=TFT7016  //有兩行
  1. 修改uboot
    燒到內存卡卡,啓動uboot
setenv panel TFT7016
saveenv

然後重啓,OK。

2.4.2 配置網絡驅動

呵,沒網線,下次一定。

2.4.3 U-Boot 圖形化配置

需要 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系統

啓動 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

3.1 Linux 內核獲取

Linux 官網爲 https://www.kernel.org
NXP從linux官網下載內核後移植版本也有,要自己去找,我用的就是NXP移植版linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2。

3.2 Linux 修改
3.2.1 編譯內核

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

3.2.2 添加開發板
  1. 配置內核
    arch/arm/configs 目錄:imx_v7_mfg_defconfig複製重命名爲imx_alientek_emmc_defconfig
    以後配置內核就:
    make imx_alientek_emmc_defconfig
  2. 添加設備樹
    arch/arm/boot/dts目錄:
    imx6ull-14x14-evk.dts複製重命名imx6ull-alientek-emmc.dts
  3. makefile
    arch/arm/boot/dts目錄:
    打開makefile
    “ dtb-$(CONFIG_SOC_IMX6ULL)”配置項,在此配置項中加入“imx6ull-alientek-emmc.dtb”
  4. mx6ull_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 V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16
3.2.3 開發板配置

是把系統燒到板子上,在終端配置,不會燒往下看,再回來配置。

四,根文件系統構建

BusyBox官網地址爲:https://busybox.net/
自用1.29.0 版本的 BusyBox,busybox-1.29.0.tar.bz2

4.1 修改

建個文件夾 解壓。

4.1.1 配置makefile

頂層 Makefile:

CROSS_COMPILE ?= /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
ARCH ?= arm
4.1.2 中文字符支持

busybox中的 shell 命令對中文輸入即顯示做了限制,修改 busybox 源碼,取消限制。

  1. libbb/printable_string.c
    第 31 和 32 行,當字符大於 0X7F 以後就跳出去了。
    第 45 和 46 行,如果支持 UNICODE 碼的話,當字符大於 0X7F 就直接輸出‘?’。
				/* 註釋掉下面這個兩行代碼 */
				/* if (c >= 0x7f)
					break; */
				...
				/* 修改下面代碼 */
				/* if (c < ' ' || c >= 0x7f) */
				if( c < ' ')
 					*d = '?';
  1. 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 = '?';
4.1.3 配置 busybox
//執行
make defconfig
make menuconfig
  1. Build static binary (no shared libs)(不要勾選)
    Location:-> Settings-> Build static binary (no shared libs)
    在這裏插入圖片描述
  2. vi-style line editing commands(勾選)
    Location:-> Settings-> vi-style line editing commands
    在這裏插入圖片描述
  3. Simplified modutils(不要勾選)
    Location:-> Linux Module Utilities-> Simplified modutils
    在這裏插入圖片描述
  4. mdev (16 kb)(勾選)
    Location:-> Linux System Utilities-> mdev (16 kb) //確保下面的全部選中,默認都是選中的
    在這裏插入圖片描述
  5. Check $LC_ALL, $LC_CTYPE and $LANG environment variables(勾選)
    Location:-> Settings-> Support Unicode //選中-> Check $LC_ALL, $LC_CTYPE and $LANG environment variables //選中
    在這裏插入圖片描述

主目錄下新建文件夾rootfs
執行命令 make install CONFIG_PREFIX=/home/weser/Desktop/linux/rootfs_linux/busybox-1.29.0/rootfs
在這裏插入圖片描述
如果有問題,反思一下是不是路徑錯了

4.1.4 向 rootfs 添加庫文件
  1. rootfs/lib
mkdir lib //新建文件夾
//然後複製交叉編譯器庫文件
//要看你安裝的在哪
cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib //進入文件夾
//*so*(*是通配符)和.a 文件,這些就是庫文件
cp *so* *.a /home/weser/Desktop/linux/rootfs_linux/busybox-1.29.0/rootfs/lib/ -d //複製到新建的文件夾lib下
cd /home/weser/Desktop/linux/rootfs_linux/busybox-1.29.0/rootfs/lib/ //進入文件夾
ls ld-linux-armhf.so.3 -l //查看ld-linux-armhf.so.3的信息
//ld-linux-armhf.so.3有個->標識,代表這個東西是個快捷鍵
rm ld-linux-armhf.so.3 //刪了
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 /home/weser/Desktop/linux/rootfs_linux/busybox-1.29.0/rootfs/lib/ //把ld-linux-armhf.so.3複製過去
//有興趣可以回去看看,->標識沒了,大小724392B,這裏就不寫了
cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib  //換個文件夾繼續複製
cp *so* *.a /home/weser/Desktop/linux/rootfs_linux/busybox-1.29.0/rootfs/lib/ -d //繼續複製*so*和.a
//複製完了

效果圖:
在這裏插入圖片描述
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文件夾:
在這裏插入圖片描述目錄大小:
在這裏插入圖片描述

  1. rootfs/其它文件夾
mkdir dev proc mnt sys tmp root etc
  1. /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
  1. /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
  1. /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
  1. 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

  1. 打包文件系統
cd rootfs/
tar -vcjf rootfs.tar.bz2 *

到這來就可以了。

4.2 燒錄
4.2.1 MfgTool 工具燒錄

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目錄原本有的全部刪掉,然後:

  1. zImage、u-boot-imx6ull14x14evk_emmc.imx 和 zImage-imx6ull-14x14-evk-emmc.dtb 這三個文件拷貝到 mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware/firmware 目錄中。
  2. 上面四個文件都拷貝到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)

4.2.2 MfgTool 改造

看了一下發現沒什麼必要,算了,回頭找個網線再把網絡配置補上吧。。

附錄一

1.1 uboot指令

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
saveenv

1.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
saveenv

1.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 等。

1.2 檢查

檢查一下 SD 卡和 EMMC 驅動是否正常:mmc list在這裏插入圖片描述
//檢查設備0 設備1
mmc dev 0
mmc info
mmc dev 1
mmc info

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章