关键词:
关注+星标公众号,不错过精彩内容
转自 | Mculover666
本文描述移植NXP官方 linux 5.4 内核到i.MX6ULL开发板。
一、NXP官方linux内核
1. 下载
NXP官方linux仓库地址为:https://github.com/Freescale/linux-fslc/tree/5.4-2.1.x-imx。
选择该分支下载zip包即可,不要整个仓库下载,太大了:
2. 编译
安装库:
sudo apt-get install lzop
sudo apt-get install libncurses5-dev
设置临时环境变量(编译器版本为7.5.0):
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
清理构建:
make distclean
查看arch/arm/configs目录下imx6ull相关的单板:配置:
make imx_v7_defconfig
配置好之后编译:
make -j32
编译成功后,进入arch/arm/boot
目录可以看到编译出的linux镜像,在dts目录下是编译出的设备树文件,找找evk的设备树:
3. 下载到开发板
将内核镜像和设备树文件拷贝到tftp根目录中:
cp zImage ~/tftp_root/
cp dts/imx6ull-14x14-evk-emmc.dtb ~/tftp_root/
接下来在开发板上进入uboot,确保bootargs环境变量的值如下:
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
saveenv
加载这两个文件:
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-evk-emmc.dtb
启动内核:
bootz 80800000 - 83000000
4. 启动结果分析
因为EMMC中有出厂烧写的文件系统,所以Linux内核成功挂载了根文件系统,启动成功,但是也有一些问题:
LCD屏幕无显示;
网卡eth0报错,但是可以获取到ip,可以ping通主机;
接下来,我们就基于NXP官方提供的linux,针对正点原子imx6ull开发板进行一些配置参数的修改,修复LCD和网络问题。
二、移植linux内核
1. 新建单板
(1)新建单板配置文件 进入 arch/arm/configs 目录,复制一份新的单板文件:
cp arch/arm/configs/imx_v7_defconfig arch/arm/configs/imx_v7_atk_emmc_defconfig
(2)新建设备树文件 进入 arch/arm/boot/dts 目录,复制一份新的设备树文件:
cp arch/arm/boot/dts/imx6ull-14x14-evk-emmc.dts arch/arm/boot/dts/imx6ull-14x14-atk-emmc.dts
查看该文件,依赖于evk板子的设备树,需要将该文件也复制一份出来:
cp arch/arm/boot/dts/imx6ull-14x14-evk.dts arch/arm/boot/dts/imx6ull-14x14-atk.dts
再查看有没有依赖,竟然还有一级:修改依赖:将该文件也复制一份出来:
cp arch/arm/boot/dts/imx6ul-14x14-evk.dtsi arch/arm/boot/dts/imx6ul-14x14-atk.dtsi
接着修改同级目录下的Makefile,添加新建的文件:
(3)编译测试
make distclean
make imx_v7_atk_emmc_defconfig
make
使用新的内核和设备树启动,方便起见,设个环境变量,下次直接用命令启动:
setenv boot_tftp 'tftp 80800000 zImage;tftp 83000000 imx6ull-14x14-atk-emmc.dtb;bootz 80800000 - 83000000'
saveenv
启动:
run boot_tftp
内核启动没啥问题。
2. 修改网络驱动
(1)修改LAN8720A的复位引脚驱动
修改设备树文件arch/arm/boot/dts/imx6ul-14x14-atk.dtsi
,搜索 GPIO5_IO07、GPIO5_IO08,发现已被spi4使用,删除这两行后,代码如下:
pinctrl_spi4: spi4grp
fsl,pins = <
MX6ULL_PAD_BOOT_MODE0__GPIO5_IO10 0x70a1
MX6ULL_PAD_BOOT_MODE1__GPIO5_IO11 0x70a1
>;
;
接着再找到spi4,删除与这两个GPIO相关的代码,删除后如下:
spi4
compatible = "spi-gpio";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_spi4>;
status = "okay";
gpio-sck = <&gpio5 11 0>;
gpio-mosi = <&gpio5 10 0>;
num-chipselects = <1>;
#address-cells = <1>;
#size-cells = <0>;
gpio_spi: gpio_spi@0
compatible = "fairchild,74hc595";
gpio-controller;
#gpio-cells = <2>;
reg = <0>;
registers-number = <1>;
registers-default = /bits/ 8 <0x57>;
spi-max-frequency = <100000>;
;
;
接着将复位引脚加入到 pinctrl_enet1 节点的描述中:
MX6UL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10b0
接着将复位引脚加入到 pinctrl_enet2 的代码中:
MX6UL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10b0
接着搜索fec1和fec2节点,添加网络驱动复位引脚使用,添加的代码如下:
phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
phy-reset-duration = <200>;
phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
phy-reset-duration = <200>;
(2)修改LAN8720的PHY地址
修改mdio节点中的地址:至此,设备树修改完成。
(3)修改fec_main.c文件
修改drivers/net/ethernet/freescale/fec_main.c
文件,找到函数fec_probe,在函数开头添加如下代码:
void __iomem *IMX6U_ENET1_TX_CLK;
void __iomem *IMX6U_ENET2_TX_CLK;
IMX6U_ENET1_TX_CLK = ioremap(0X020E00DC, 4);
writel(0X14, IMX6U_ENET1_TX_CLK);
IMX6U_ENET2_TX_CLK = ioremap(0X020E00FC, 4);
writel(0X14, IMX6U_ENET2_TX_CLK);
fec_enet_get_queue_num(pdev, &num_tx_qs, &num_rx_qs);
(4)修改PHY驱动源码
修改drivers/net/phy/smsc.c
文件,添加两个头文件:
#include <linux/of_gpio.h>
#include <linux/io.h>
然后找到smsc_phy_reset
函数,修改之后如下:
tatic int smsc_phy_reset(struct phy_device *phydev)
int err, phy_reset;
int msec = 1;
struct device_node *np;
int timeout = 50000;
int rc;
if (phydev->mdio.addr == 0)
np = of_find_node_by_path("/soc/aips-bus@02100000/ethernet@02188000");
else if (phydev->mdio.addr == 1)
np = of_find_node_by_path("/soc/aips-bus@02000000/ethernet@020b4000");
if (!np)
return -1;
/* A sane reset duration should not be longer than 1s */
err = of_property_read_u32(np, "phy-reset-duration", &msec);
if (!err && msec > 1000)
msec = 1;
phy_reset = of_get_named_gpio(np, "phy-reset-gpios", 0);
if (!gpio_is_valid(phy_reset))
return -1;
gpio_direction_output(phy_reset, 0);
gpio_set_value(phy_reset, 0);
msleep(msec);
gpio_set_value(phy_reset, 1);
rc = phy_read(phydev, MII_LAN83C185_SPECIAL_MODES);
if (rc < 0)
return rc;
/* If the SMSC PHY is in power down mode, then set it
* in all capable mode before using it.
*/
if ((rc & MII_LAN83C185_MODE_MASK) == MII_LAN83C185_MODE_POWERDOWN)
/* set "all capable" mode */
rc |= MII_LAN83C185_MODE_ALL;
phy_write(phydev, MII_LAN83C185_SPECIAL_MODES, rc);
phy_write(phydev, MII_BMCR, BMCR_RESET);
/* wait end of reset (max 500 ms) */
do
udelay(10);
if (timeout-- == 0)
return -1;
rc = phy_read(phydev, MII_BMCR);
while (rc & BMCR_RESET);
/* reset the phy */
return genphy_soft_reset(phydev);
此时编译内核可以通过。
(5)配置Linux内核,使能LAN8720驱动
make menuconfig
使能Device Drivers\\Network device support\\ PHY Device support and infrastructure\\Drivers for SMSC PHYs
:保存到.config,然后退出。
(6)编译测试
重新编译内核,使用新的内核和设备树启动,测试网络是否正常。ping主机测试:至此,网络驱动修改成功。
3. 修改LCD驱动
本文用的是正点原子 7' RGB屏幕,分辨率1024*600,设备树中找到lcdif节点的补充描述,改一下屏幕参数和时序即可:重新编译设备树,启动,可以看到LCD左上角显示企鹅logo:在uboot的bootargs参数中加入console=tty1
,即可新注册一个终端到LCD:
本文移植的内核仓库地址(点击阅读原文即可访问):
https://git.code.tencent.com/mculover666/linux-imx6ull。
------------ END ------------
关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。
点击“阅读原文”查看更多分享。
i.mx6ull系统移植|移植linux原生5.4.32内核
...内核初试1.下载2.编译3.下载到开发板4.启动结果分析二、移植linux内核1.新建单板1.1.新建单板配置文件1.2.新建设备树文件2.测试三、适配新的开发板1.修改model2.添加心跳灯3.修改LCD驱动4.修改网络驱动(网卡1正常,网卡2未解决)... 查看详情
i.mx6ull系统移植|命令行更新emmc的内核和设备树固件(代码片段)
一、更新原理Linux内核在运行的时候被加载到内存中,所以在内核运行的时候,完全可以做到更新emmc中存放的固件,然后重新启动即可。二、更新方法1.查看emmc分区使用mfgtool烧录之后,emmc会有两个分区,第一... 查看详情
i.mx6ull系统移植|命令行更新emmc的内核和设备树固件(代码片段)
一、更新原理Linux内核在运行的时候被加载到内存中,所以在内核运行的时候,完全可以做到更新emmc中存放的固件,然后重新启动即可。二、更新方法1.查看emmc分区使用mfgtool烧录之后,emmc会有两个分区,第一... 查看详情
i.mx6ull系统移植|命令行更新emmc的内核和设备树固件(代码片段)
一、更新原理Linux内核在运行的时候被加载到内存中,所以在内核运行的时候,完全可以做到更新emmc中存放的固件,然后重新启动即可。二、更新方法1.查看emmc分区使用mfgtool烧录之后,emmc会有两个分区,第一... 查看详情
i.mx6ull应用移植|移植wirelesstools到linux开发板(29version)(代码片段)
一、wireless官网:https://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html。wirelesstools是操作WIFI的工具集合,包括以下工具:iwconfig:设置无线网络相关参数iwlist:扫描当前无线网络信息,获取WIFI热点iw 查看详情
i.mx6ull应用移植|移植tslib到linux开发板(1.22)(代码片段)
一、tslib二、移植到imx6ull开发板1.下载源码tslib的github仓库为:https://github.com/libts/tslib。下载最新发布的tag,为1.22版本:2.移植(1)解压源码:xz-dtslib-1.22.tar.xztar-xftslib-1.22.tar解压后的文件如图 查看详情
i.mx6ull应用移植|移植wpa_supplicant到linux开发板(2.7版本)(代码片段)
一、wpa_supplicantwpa_supplicant是跨平台的WPA请求者程序(supplicant),支持WEP、WPA和WPA2(IEEE802.11i).。可以在桌面、笔记本、嵌入式系统中使用。wpa_supplicant是在客户端使用的IEEE802.1X/WPA组件,支持与WPAAuthenticator的交互... 查看详情
正点原子i.mx6u-miniu-boot过程移植详解(代码片段)
...发板参考的是NXP官方的I.MX6ULLEVK开发板做的硬件。Linux的移植要复杂的多,在移植Linux之前我们需要先移植一个bootloader代码,这个bootloader代码用于启动Linux内核,bootloader有很多,常用的就是U-Boot。移植好U-Boot以后... 查看详情
i.mx6ull官方sdk移植(代码片段)
I.MX6ULL官方SDK移植NXP针对I.MX6ULL编写了一个SDK包,这个SDK包就类似于STM32的STD库或者HAL库,这个SDK包提供了Windows和Linux两种版本,分别针对主机系统是Windows和Linux。将正点原子修改后的fsl_common.h、fsl_iomuxc.h和MCIMX6Y2.h这... 查看详情
i.mx6ull官方sdk移植(代码片段)
I.MX6ULL官方SDK移植NXP针对I.MX6ULL编写了一个SDK包,这个SDK包就类似于STM32的STD库或者HAL库,这个SDK包提供了Windows和Linux两种版本,分别针对主机系统是Windows和Linux。将正点原子修改后的fsl_common.h、fsl_iomuxc.h和MCIMX6Y2.h这... 查看详情
i.mx6ull应用移植|移植lvgl到imx6ull(基于framebuffer)(代码片段)
移植完成的仓库(使用USB鼠标):https://gitee.com/mculover666/lv_port_linux_frame_buffer。一、下载源码1.下载主仓库gitclonehttps://github.com/lvgl/lv_port_linux_frame_buffer.git2.下载子仓库修改子模块路径。(1)修改.gitmodules文件[submodule"lv_exam 查看详情
i.mx6ull应用移植|移植lvgl到imx6ull(基于framebuffer)(代码片段)
移植完成的仓库(使用USB鼠标):https://gitee.com/mculover666/lv_port_linux_frame_buffer。一、下载源码1.下载主仓库gitclonehttps://github.com/lvgl/lv_port_linux_frame_buffer.git2.下载子仓库修改子模块路径。(1 查看详情
i.mx6ull驱动开发|26-linux内核的rtc驱动(代码片段)
一、RTC时间查看与设置1.内核启动日志查看Linux内核启动时与RTC相关的日志:dmesg|greprtc2.查看与设置当前系统时间(1)查看当前时间:date(2)设置当前时间date-s"2022-07-0213:47:00"3.设置当前时间到RTC外... 查看详情
i.mx6ull驱动开发|26-linux内核的rtc驱动(代码片段)
一、RTC时间查看与设置1.内核启动日志查看Linux内核启动时与RTC相关的日志:dmesg|greprtc2.查看与设置当前系统时间(1)查看当前时间:date(2)设置当前时间date-s"2022-07-0213:47:00"3.设置当前时间到RTC外... 查看详情
i.mx6ull应用移植|移植tslib到linux开发板(1.22)(代码片段)
一、tslib二、移植到imx6ull开发板1.下载源码tslib的github仓库为:https://github.com/libts/tslib。下载最新发布的tag,为1.22版本:2.移植(1)解压源码:xz-dtslib-1.22.tar.xztar-xftslib-1.22.tar解压后的文件如图:(2... 查看详情
i.mx6ull应用移植|移植wirelesstools到linux开发板(29version)(代码片段)
...sions特定驱动ifrename:基于各种静态标准命名接口二、移植wireless1.下载源码wgethttps://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/wireless_tools.29.tar.gz--no-check-certificate解压:tar-zxfwireless_tools.29.tar.gz2.交叉编译修改Makeifle:编译... 查看详情
i.mx6ull驱动开发|30-使用ec204g网卡(移植移远gobinet驱动)(代码片段)
一、EC20EC20在Linux下的驱动架构:二、Linux内核中USB驱动的修改与配置1.EC20USB驱动修改默认插上之后没有出来ttyUSB设备,需要在内核中添加EC20的USB设备信息。1.1.添加USB设备信息修改文件drivers/usb/serial/option.c。(1)o... 查看详情
正点原子i.mx6u-mini移植篇u-boot移植过程详解(代码片段)
...发板参考的是NXP官方的I.MX6ULLEVK开发板做的硬件。Linux的移植要复杂的多,在移植Linux之前我们需要先移植一个bootloader代码,这个bootloader代码用于启动Linux内核,bootloader有很多,常用的就是U-Boot。移植好U-Boot以后... 查看详情