LINUX的内核移植主要是参考的官方的EVK开发板
首先建立VSCODE工程,复制.vscode/settings.json到工程。
建立编译脚本imx6ull_14×14_evk.sh
#!/bin/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- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j12
编译 ./imx6ull_14×14_evk.sh,默认配置文件存放路径arch/arm/configs。
最终编译出:zImage,和 imx6ull-14x14-evk-emmc.dtb,imx6ull-14x14-evk.dtb。
将zImage,和 imx6ull-14x14-evk-emmc.dtb拷贝到tftp目录下,然后再uboot中通过tftp启动,-f替换已有文件
cp arch/arm/boot/zImage /home/lyl/linux/tftpboot/ -f
cp arch/arm/boot/dts/imx6ull-14x14-evk-emmc.dtb /home/lyl/linux/tftpboot/ -f
启动Uboot,利用Uboot烧录linux:
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-evk-emmc.dtb
bootz 80800000 - 83000000
最后Uboot报错:
因为没有根文件系统
1.imx6_alientek_emmc_defconfig添加默认配置文件
复制arch/arm/configs/imx_v7_mfg_defconfig文件为imx_alientek_emmc_defconfig
cp imx_v7_mfg_defconfig imx6ull_alientek_emmc_defconfig
2.imx6ull-alientek-emmc.dts添加设备树文件
目录 arch/arm/boot/dts,cp imx6ull-14x14-evk.dts imx6ull-alientek-emmc.dts
3.修改arch/arm/boot/dts/Makefile,添加imx6ull-alientek-emmc.dtb
4.编写编译脚本imx6ull_alientek_emmc.sh
cp imx6ull_14x14_evk.sh imx6ull_alientek_emmc.sh
#!/bin/sh
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
如果不用编译脚本,可以在Makefile顶层写死ARCH与AROSS_COMPILE,直接使用make命令就可以编译了
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-gnueabihf-
完成后可以将zImage与设备树dtb通过tftp启动,添加成功。
修改驱动之前,要先保证板子能够正常启动。可以设置bootcmd变量让uboot自动启动linux。
bootcmd和bootargs是两个比较重要的变量,bootcmd保存了uboot的默认启动命令,bootargs保存了uboot要传输给linux的变量值,主要包括控制台选择,根文件系统的信息。
所以在uboot里设置默认通过从网络启动,通过TFTP:
setenv bootcmd ‘tftp 80800000 zImage;tftp 83000000 imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000;’
Bootargs设置,根文件系统存放在EMMC的分区2里面,命令如下:
Setenv bootargs ‘console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw’
接着修改imx6ull-alientek-emmc.dts中找到usdhc2节点,该节点描述着EMMC设备信息。
&usdhc2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc2>;
non-removable;
status = "okay";
};
编译dtb:make dtbs,接下来就可以启动成功。
linux可以运行在多个主频下,cd /sys/bus/cpu/devices/cpu0/cpufreq 记录了linuxCPU的各项信息,
cpuinfo_cur_freq:当前 cpu 工作频率,从 CPU 寄存器读取到的工作频率。
cpuinfo_max_freq:处理器所能运行的最高工作频率(单位: KHz)。
cpuinfo_min_freq :处理器所能运行的最低工作频率(单位: KHz)。
cpuinfo_transition_latency:处理器切换频率所需要的时间(单位:ns)。
scaling_available_frequencies:处理器支持的主频率列表(单位: KHz)。
scaling_available_governors:当前内核中支持的所有 governor(调频)类型。
scaling_cur_freq:保存着 cpufreq 模块缓存的当前 CPU 频率,不会对 CPU 硬件寄存器进行检查。
scaling_driver: 该文件保存当前 CPU 所使用的调频驱动。
scaling_governor: governor(调频)策略, Linux 内核一共有 5 中调频策略,
①、 Performance,最高性能,直接用最高频率,不考虑耗电。
②、 Interactive,一开始直接用最高频率,然后根据 CPU 负载慢慢降低。
③、 Powersave,省电模式,通常以最低频率运行,系统性能会受影响,一般不会用这个!
④、 Userspace,可以在用户空间手动调节频率。
⑤、 Ondemand,定时检查负载,然后根据负载来调节频率。负载低的时候降低 CPU 频率,这样省电,负载高的时候提高 CPU 频率,增加性能。
scaling_max_freq: governor(调频)可以调节的最高频率。
cpuinfo_min_freq: governor(调频)可以调节的最低频率。
通过cat命令可以对每个文件进行查看。
主频可以使用linux内核图形化界面修改:make menuconfig
路径CPU Power Management
-> CPU Frequency scaling
-> Default CPUFreq governor。
1.修改复位引脚
2.修改PHY地址
单独编译设备树文件:make dtbs
3.修改 fec_main.c 文件
4.配置 Linux 内核,使能 LAN8720 驱动
5.修改 smsc.c 文件