[ARM9、LPC] 移植NXP官方 linux 5.4 内核到i.MX6ULL开发板

[复制链接]
995|5
 楼主| 黑心单片机 发表于 2022-4-23 15:41 | 显示全部楼层 |阅读模式
一、NXP官方linux内核
1. 下载

NXP官方linux仓库地址为:https://github.com/Freescale/linux-fslc/tree/5.4-2.1.x-imx。

选择该分支下载zip包即可,不要整个仓库下载,太大了:




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 黑心单片机 发表于 2022-4-23 15:43 | 显示全部楼层
2.编译
安装库:

  1. sudo apt-get install lzop
  2. sudo apt-get install libncurses5-dev
设置临时环境变量(编译器版本为7.5.0):
  1. export ARCH=arm
  2. export CROSS_COMPILE=arm-linux-gnueabihf-
清理构建:
  1. make distclean
查看arch/arm/configs目录下imx6ull相关的单板:

配置:
  1. make imx_v7_defconfig
配置好之后编译:
  1. make -j32
编译成功后,进入arch/arm/boot目录可以看到编译出的linux镜像,在dts目录下是编译出的设备树文件,找找evk的设备树:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 黑心单片机 发表于 2022-4-23 15:46 | 显示全部楼层
3. 下载到开发板

将内核镜像和设备树文件拷贝到tftp根目录中:
  1. cp zImage ~/tftp_root/
  2. cp dts/imx6ull-14x14-evk-emmc.dtb ~/tftp_root/
接下来在开发板上进入uboot,确保bootargs环境变量的值如下:
  1. setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
  2. saveenv
加载这两个文件:
  1. tftp 80800000 zImage
  2. tftp 83000000 imx6ull-14x14-evk-emmc.dtb
启动内核:
  1. bootz 80800000 - 83000000



 楼主| 黑心单片机 发表于 2022-4-23 15:49 | 显示全部楼层
4. 启动结果分析

因为EMMC中有出厂烧写的文件系统,所以Linux内核成功挂载了根文件系统,启动成功,但是也有一些问题:

  • LCD屏幕无显示;
  • 网卡eth0报错,但是可以获取到ip,可以ping通主机;

接下来,我们就基于NXP官方提供的linux,针对正点原子imx6ull开发板进行一些配置参数的修改,修复LCD和网络问题



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 黑心单片机 发表于 2022-4-23 15:52 | 显示全部楼层
二、移植linux内核1. 新建单板


(1)新建单板配置文件 进入 arch/arm/configs 目录,复制一份新的单板文件:

  1. cp arch/arm/configs/imx_v7_defconfig arch/arm/configs/imx_v7_atk_emmc_defconfig
(2)新建设备树文件 进入 arch/arm/boot/dts 目录,复制一份新的设备树文件:
  1. cp arch/arm/boot/dts/imx6ull-14x14-evk-emmc.dts arch/arm/boot/dts/imx6ull-14x14-atk-emmc.dts
查看该文件,依赖于evk板子的设备树,需要将该文件也复制一份出来:

  1. cp arch/arm/boot/dts/imx6ull-14x14-evk.dts arch/arm/boot/dts/imx6ull-14x14-atk.dts
再查看有没有依赖,竟然还有一级:

修改依赖:

接着修改同级目录下的Makefile,添加新建的文件:

(3)编译测试
  1. make distclean
  2. make imx_v7_atk_emmc_defconfig
  3. make
使用新的内核和设备树启动,方便起见,设个环境变量,下次直接用命令启动:
  1. setenv boot_tftp 'tftp 80800000 zImage;tftp 83000000 imx6ull-14x14-atk-emmc.dtb;bootz 80800000 - 83000000'
  2. saveenv
启动:
  1. run boot_tftp
内核启动没啥问题。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 黑心单片机 发表于 2022-4-23 15:55 | 显示全部楼层
2. 修改网络驱动

(1)修改LAN8720A的复位引脚驱动

修改设备树文件arch/arm/boot/dts/imx6ul-14x14-atk.dtsi,搜索 GPIO5_IO07、GPIO5_IO08,发现已被spi4使用,删除这两行后,代码如下:

  1. pinctrl_spi4: spi4grp {
  2.                      fsl,pins = <
  3.                              MX6ULL_PAD_BOOT_MODE0__GPIO5_IO10        0x70a1
  4.                              MX6ULL_PAD_BOOT_MODE1__GPIO5_IO11        0x70a1
  5.                      >;
  6.              };

接着再找到spi4,删除与这两个GPIO相关的代码,删除后如下:

  1. spi4 {
  2.   compatible = "spi-gpio";
  3.   pinctrl-names = "default";
  4.   pinctrl-0 = <&pinctrl_spi4>;
  5.   status = "okay";
  6.   gpio-sck = <&gpio5 11 0>;
  7.   gpio-mosi = <&gpio5 10 0>;
  8.   num-chipselects = <1>;
  9.   #address-cells = <1>;
  10.   #size-cells = <0>;

  11.   gpio_spi: gpio_spi[url=home.php?mod=space&uid=2514928]@0[/url] {
  12.    compatible = "fairchild,74hc595";
  13.    gpio-controller;
  14.    #gpio-cells = <2>;
  15.    reg = <0>;
  16.    registers-number = <1>;
  17.    registers-default = /bits/ 8 <0x57>;
  18.    spi-max-frequency = <100000>;
  19.   };
  20. };

接着将复位引脚加入到 pinctrl_enet1 节点的描述中:

  1. MX6UL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10b0


接着将复位引脚加入到 pinctrl_enet2 的代码中:
  1. MX6UL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10b0



接着搜索fec1和fec2节点,添加网络驱动复位引脚使用,添加的代码如下:

  1. phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
  2. phy-reset-duration = <200>;
  1. phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
  2. phy-reset-duration = <200>;

(2)修改LAN8720的PHY地址

修改mdio节点中的地址:


至此,设备树修改完成。

(3)修改fec_main.c文件

修改drivers/net/ethernet/freescale/fec_main.c文件,找到函数fec_probe,在函数开头添加如下代码:

  1. void __iomem *IMX6U_ENET1_TX_CLK;
  2. void __iomem *IMX6U_ENET2_TX_CLK;

  3. IMX6U_ENET1_TX_CLK = ioremap(0X020E00DC, 4);
  4. writel(0X14, IMX6U_ENET1_TX_CLK);

  5. IMX6U_ENET2_TX_CLK = ioremap(0X020E00FC, 4);
  6. writel(0X14, IMX6U_ENET2_TX_CLK);

  7. fec_enet_get_queue_num(pdev, &num_tx_qs, &num_rx_qs);

(4)修改PHY驱动源码

修改drivers/net/phy/smsc.c文件,添加两个头文件:

  1. #include <linux/of_gpio.h>
  2. #include <linux/io.h>

然后找到smsc_phy_reset函数,修改之后如下:

  1. tatic int smsc_phy_reset(struct phy_device *phydev)
  2. {
  3. int err, phy_reset;
  4. int msec = 1;
  5. struct device_node *np;
  6. int timeout = 50000;
  7. int rc;

  8. if (phydev->mdio.addr == 0) {
  9.   np = of_find_node_by_path("/soc/aips-bus@02100000/ethernet@02188000");
  10. } else if (phydev->mdio.addr == 1) {
  11.   np = of_find_node_by_path("/soc/aips-bus@02000000/ethernet@020b4000");
  12. }

  13. if (!np) {
  14.   return -1;
  15. }

  16. /* A sane reset duration should not be longer than 1s */
  17. err = of_property_read_u32(np, "phy-reset-duration", &msec);
  18. if (!err && msec > 1000)
  19.   msec = 1;

  20. phy_reset = of_get_named_gpio(np, "phy-reset-gpios", 0);
  21. if (!gpio_is_valid(phy_reset))
  22.   return -1;

  23. gpio_direction_output(phy_reset, 0);
  24. gpio_set_value(phy_reset, 0);
  25. msleep(msec);
  26. gpio_set_value(phy_reset, 1);

  27. rc = phy_read(phydev, MII_LAN83C185_SPECIAL_MODES);
  28. if (rc < 0)
  29.   return rc;

  30. /* If the SMSC PHY is in power down mode, then set it
  31.   * in all capable mode before using it.
  32.   */
  33. if ((rc & MII_LAN83C185_MODE_MASK) == MII_LAN83C185_MODE_POWERDOWN) {
  34.   /* set "all capable" mode */
  35.   rc |= MII_LAN83C185_MODE_ALL;
  36.   phy_write(phydev, MII_LAN83C185_SPECIAL_MODES, rc);
  37. }

  38. phy_write(phydev, MII_BMCR, BMCR_RESET);
  39. /* wait end of reset (max 500 ms) */
  40. do {
  41.   udelay(10);
  42.   if (timeout-- == 0)
  43.    return -1;
  44.   rc = phy_read(phydev, MII_BMCR);
  45. } while (rc & BMCR_RESET);

  46. /* reset the phy */
  47. return genphy_soft_reset(phydev);
  48. }

此时编译内核可以通过。

(5)配置Linux内核,使能LAN8720驱动

  1. make menuconfig

使能Device Drivers\Network device support\ PHY Device support and infrastructure\Drivers for SMSC PHYs:

保存到.config,然后退出。

(6)编译测试

重新编译内核,使用新的内核和设备树启动,测试网络是否正常。

ping主机测试:

至此,网络驱动修改成功。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

514

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部