见另一篇博客《Linux安装交叉编译工具链》
imxdownload :注意需要将imxdownload工具拷贝到工程根目录下,否则会烧写失败
插上 SD 卡以后,SD设备卡会出现在“/dev”里面,其中存储设备都是以“/dev/sd”开头的。
见另一篇博客《Linux搭建NFS服务器》
见另一篇博客《Linux搭建TFTP服务器》
makefile中递归嵌套调用makefile。参数-C指定子目录。
export VARIABLE …… //导出变量给子 make 。
unexport VARIABLE…… //不导出变量给子 make。
备注:
有两个特殊的变量:“SHELL”和“MAKEFLAGS”,这两个变量除非使用“unexport”声明,否则的话在整个make的执行过程中,它们的值始终自动的传递给子make。
+=”来给变量 MAKEFLAGS 追加了一些值
“-rR”表示禁止使用内置的隐含规则和变量定义
“–include-dir”指明搜索路径
“$(CURDIR)”表示当前目录
函数origin,表示获取变量V的来源
ifeq ("$(origin V)", "command line")
KBUILD_VERBOSE = $(V)
endif
ifndef KBUILD_VERBOSE
KBUILD_VERBOSE = 0
endif
函数origin,表示变量V的来源,此句话表示变量V是否来自command line。
前面命令行输入的编译命令有V=1,所以这里KBUILD_VERBOSE = 1,如果命令行没有V=1,则KBUILD_VERBOSE = 0
make在执行的时候默认会在终端输出命令,但是在命令前面加上“@”就不会在终端输出命令了。
filter 函数表示以 pattern 模式过滤 text 字符串中的单词,仅保留符合模式 pattern 的单词
O 表示指定的make工具输出目录
C 表示检查代码,C=1表示检查需要重新编译的文件,C=2表示检查所有源码文件
make M=dir或make SUBDIRS=dir进行模块编译
sed -e 表示替换命令
每次编译uboot的时候都要在make命令后面设置ARCH和CROS_COMPILE,使用起来很麻烦,可以直接修改顶层Makefile,在里面加入ARCH和CROSS_COMPILE的定义。
cd configs
cp xxxx_defconfig dest_defconfig
修改里面内容为自己板卡的名字
cd include/configs/
cp xxxx.h dest.h
修改里面#ifdef后面的名字为自己板卡的名字
cd board/freescale/
cp xxx/ dest_board_dir_name -rf
修改原板卡.c文件为目标板卡.c文件
cd dest_board_dir_name
mv xxx.c dest_board_name.c
当make menuconfig时配置选项中的可选项
部分芯片内部有个mac外设,mac外设单独无法工作,需要外接PHY芯片。即:内部mac+外部PHY。(通信速度快)
部分芯片内不没有mac外设,会采用DM9000网络连接。DM9000芯片相当于:外部MAC+外部PHY。(通信速度慢)
imx6ul芯片手册 22章ENET章节,讲解MAC具体细节
看电路图,查询PHY芯片地址:0x0/0x1等
看电路图,查询PHY芯片复位引脚接的ARM哪个GPIO引脚
打开u-boot中上面步骤复制的对应板卡的.h文件,找到NET相关的宏配置,主要修改两个宏:
CONFIG_FEC_ENET_DEV 表示使用哪一个LAN口设备
CONFIG_FEC_MXC_PHYADDR 表示PHY芯片的地址
打开u-boot中上面步骤复制的对应板卡的.c文件,删除原有网络芯片(74LV595 )的驱动代码。并且添加对应板卡的控制代码,包括:define宏定义RESET复位引脚对应GPIO口、引脚配置代码等。
仍旧是.c文件,找到结构体数组fec1_pads、fec2_pads为两个网口的IO配置参数,在数组末尾添加拉你个网口的复位IO配置参数
仍旧是.c文件,添加网络复位IO初始化代码
添加LAN芯片软复位代码,文件:drivers/net/phy/phy.c 中的函数genphy_update_link
bootcmd 保存着 uboot 默认命令, uboot 倒计时结束以后就会执行 bootcmd 中的命令。这些命令一般都是用来启动 Linux 内核的,比如读取 EMMC 或者 NAND Flash 中的 Linux 内核镜像文件和设备树文件到 DRAM 中,然后启动 Linux 内核。
可以在 uboot 启动以后进入命令行设置 bootcmd 环境变量的值 ,命令如下:
setenv bootcmd 'mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ullalientek-emmc.dtb; bootz 80800000 - 83000000;'
bootargs 保存着 uboot 传递给 Linux 内核的参数。
bootargs 就是设置了很多的参数的值,这些参数 Linux 内核会使用到,常用的参数有:
1. console
console 用来设置 linux 终端(或者叫控制台),也就是通过什么设备来和 Linux 进行交互,是串口还是 LCD 屏幕。
2. root
root 用来设置根文件系统的位置, root=/dev/mmcblk1p2 用于指明根文件系统存放在mmcblk1 设备的分区 2 中。
3. rootfstype
此选项一般配置 root 一起使用, rootfstype 用于指定根文件系统类型
下载Linux内核镜像
顶层目录Makefile中配置交叉编译工具链,或者直接编写编译sh脚本在命令中附上交叉编译工具链。
make disclean 清理工程,如果有修改配置文件,慎用该命令
make xxx_defconfig 配置工程
make menuconfig 打开图形界面,配置Linux(如果不需要配置linux,可以删掉该命令)
make 编译Linux源码
arch/arm/boot 目录下 zImage为Linux镜像文件
arch/arm/boo/dts 目录下 .dtb文件为设备树文件
基本和 uboot 的顶层 Makefile 一样,重点在于vmlinux 的生成。最后将 vmlinux 压缩成我们最常用的 zImage 或 uImage 等文件。
Linux内核链接脚本文件:arch/arm/kernel/vmlinux.lds ,该文件可以找到Linux内核第一行程序从哪里执行。
脚本文件中493行ENTRY(stext) 代码指定内核入口为stext,stext 定义在文件arch/arm/kernel/head.S 中 。
函数__lookup_processor_type 检查当前系统是否支持此 CPU ,其中一个结构体proc_info_list 保存支持的CPU信息。proc_info_list 在文件 arch/arm/include/asm/procinfo.h 中
Linux 内核最终是需要和根文件系统打交道的,需要挂载根文件系统,并且执行根文件系统中的 init 程序,以此来进去用户态
ps -A:列出当前所有运行的进程
顶层Makefile修改交叉编译工具链
配置内核、编译内核,生成zImage 、.dtb(设备树) 文件。
zImage路径:arch/arm/boot
.dtb 路径:arch/arm/boot/dts
将上述两个文件拷贝到tftp服务器目录下,后面u-boot下载要用
从tftp服务器下载镜像emmc中
tftp 80800000 zImage
tftp 83000000 xxx.dtb
启动内核
bootz 80800000 - 83000000
拷贝类似平台配置文件为自己开发板的配置文件
cd arch/arm/configs
cp xxx_defconfig 自己开发板名字_defconfig
拷贝开发板对应设备树文件
cd arch/arm/boot/dts
cp xxx_dts 自己的开发板名字.dts
修改makefile
vim arch/arm/boot/dts/Makefile
在dtb-$(CONFIG_SOC_IMX6ULL) 配置项中加入自己的开发板对应的设备树名称
顶层目录下创建编译脚本
#!/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 -j16
赋予可执行权限
chmod 777 imx6ull_alientek_emmc.sh
编译
./imx6ull_alientek_emmc.sh
拷贝zImage 、.dtb(设备树) 文件到tftp服务器目录中,使用tftp工具下载zImage和dtb设备树文件
tftp 80800000 zImage
tftp 83000000 imx6ull-alientek-emmc.dtb
bootz 80800000 – 83000000