首页 > 系统相关 >[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为

[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为

时间:2022-10-31 22:32:15浏览次数:51  
标签:reset ENET1 配置文件 另存为 emmc 引脚 pinctrl phy Linux


使能 8 线 EMMC 驱动

[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为_linux

Linux 内核驱动里面 EMMC 默认是 4 线模式的,4 线模式肯定没有 8 线模式的速度快,所以将 EMMC 的驱动修改为 8 线模式。修改方法很简单,直接修改设备树即可,打开文件 imx6ull-mybsp-emmc.dts,找到如下所示内容:

gedit arch/arm/boot/dts/imx6ull-mybsp-emmc.dts

关键字:&usdhc2

[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为_嵌入式_02

只需要将其改为如下代码即可:

&usdhc2 {
pinctrl-names = "default", "state_100mhz", "state_200mhz";
pinctrl-0 = <&pinctrl_usdhc2_8bit>;
pinctrl-1 = <&pinctrl_usdhc2_8bit_100mhz>;
pinctrl-2 = <&pinctrl_usdhc2_8bit_200mhz>;
bus-width = <8>;
non-removable;
status = "okay";
};

修改完成以后保存一下 imx6ull-mybsp-emmc.dts,然后使用命令“make dtbs”重新编译一下设备树,编译完成以后使用新的设备树重新烧录 Linux 系统即可。 下载烧录参考

修改网络驱动

  1. 修改 LAN8720 的复位以及网络时钟引脚驱动

ENET1 复位引脚 ENET1_RST 连接在 I.M6ULL 的 SNVS_TAMPER7 这个引脚上。ENET2的复位引脚 ENET2_RST 连接在 I.MX6ULL 的 SNVS_TAMPER8 上。
打开设备树文件 imx6ull-mybsp-emmc.dts,找到如下代码:

gedit arch/arm/boot/dts/imx6ull-mybsp-emmc.dts

关键词:pinctrl_spi4:

[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为_嵌入式_03


第 588 和 589 行就是初始化 SNVS_TAMPER7 和 SNVS_TAMPER8 这两个引脚的,但是它们作为了 SPI4 的 IO口。所以我们要删除SPI4的IO口掉重新定义。

修改后:

[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为_linux_04

关键词:spi4 {

[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为_嵌入式_05

第 129 行,设置 GPIO5_IO08 为 SPI4 的一个功能引脚,而GPIO5_IO08 就是 SNVS_TAMPER8 的 GPIO 功能引脚。

第 133 行, 设置 GPIO5_IO07 作为 SPI4 的片选引脚, 而 GPIO5_IO07 就是 SNVS_TAMPER7的 GPIO 功能引脚。

现在我们需要 GPIO5_IO07 和 GPIO5_IO08 分别作为 ENET1 和 ENET2 的复位引脚,而不是 SPI4 的什么功能引脚, 因此将示例代码中的第 129 行和第 133 行处的代码删除掉! !否则会干扰到网络复位引脚!

修改后:

[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为_网络_06

关键词:iomuxc_snvs
然后在此节点下添加网络复位引脚信息,内容如下:

/*enet1 reset*/
pinctrl_enet1_reset:enet1resetgrp {
fsl,pins = <
/* used for enet1 reset */
MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0 /* ENET1 RESET */
>;
};

/*enet2 reset*/
pinctrl_enet2_reset:enet2resetgrp {
fsl,pins = <
/* used for enet2 reset */
MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0 /* ENET2 RESET */
>;
};

[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为_shell_07


**关键词:pinctrl_enet1: **

添加如下内容:

MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 0x4001b009
MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 0x4001b009

修改前:

[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为_引脚_08


修改后:

[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为_shell_09

至此网络复位以及时钟引脚驱动就修改完成。

  1. 修改 fec1 和 fec2 节点的 pinctrl-0 属性

gedit arch/arm/boot/dts/imx6ull-mybsp-emmc.dts

先看下修改前,和修改后。

[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为_引脚_10


[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为_网络_11


第一部分:

//添加了 ENET1 网络复位引脚所使用的 IO 为 GPIO5_IO07, 低电平有效。复位低电平信号持续时间为 200ms。

//添加了 ENET2 网络复位引脚所使用的 IO 为 GPIO5_IO08, 低电平有效,持续时间同样为 200ms。

pinctrl-0 = <&pinctrl_enet1
&pinctrl_enet1_reset>;

pinctrl-0 = <&pinctrl_enet2
&pinctrl_enet2_reset>;

phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
phy-reset-duration = <200>;

phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
phy-reset-duration = <200>;

第二部分:
①“smsc,disable-energy-detect” 表明 PHY 芯片是 SMSC 公司的, 这样 Linux内核就会找到 SMSC 公司的 PHY 芯片驱动来驱动 LAN8720A。
②ethernet-phy@”后面的数字是 PHY 的地址,ENET1 的 PHY 地址为 0,所以“@”后面是 0(默认为 2)。
reg 的值也表示 PHY 地址,ENET1 的 PHY 地址为 0,所以 reg=0。
ENET1 的 LAN8720A 地址为 0x0,ENET2 的 LAN8720A地址为 0x1。

ethphy0: ethernet-phy@0 {
compatible = "ethernet-phy-ieee802.3-c22";
smsc,disable-energy-detect;
reg = <0>;
};

ethphy1: ethernet-phy@1 {
compatible = "ethernet-phy-ieee802.3-c22";
smsc,disable-energy-detect;
reg = <1>;
};
&fec1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_enet1
&pinctrl_enet1_reset>;
phy-mode = "rmii";
phy-handle = <ðphy0>;
phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
phy-reset-duration = <200>;
status = "okay";
};

&fec2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_enet2
&pinctrl_enet2_reset>;
phy-mode = "rmii";
phy-handle = <ðphy1>;
phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
phy-reset-duration = <200>;
status = "okay";

mdio {
#address-cells = <1>;
#size-cells = <0>;

ethphy0: ethernet-phy@0 {
compatible = "ethernet-phy-ieee802.3-c22";
smsc,disable-energy-detect;
reg = <0>;
};

ethphy1: ethernet-phy@1 {
compatible = "ethernet-phy-ieee802.3-c22";
smsc,disable-energy-detect;
reg = <1>;
};
};
};

重新编译一下设备树,终端输入:make dtbs

[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为_引脚_12

  1. 修改 fec_main.c 文件

要 在 I.MX6ULL 上 使 用 LAN8720A , 需 要 修 改 一 下 Linux 内 核 源 码 , 打 开drivers/net/ethernet/freescale/fec_main.c。

gedit drivers/net/ethernet/freescale/fec_main.c

关键词: fec_probe

fec_probe 中加入如下代码:

[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为_linux_13


[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为_嵌入式_14

/* 设置MX6UL_PAD_ENET1_TX_CLK和MX6UL_PAD_ENET2_TX_CLK
这两个IO的复用寄存器的SION位为1。
*/
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);
  1. 配置 Linux 内核,使能 LAN8720 驱动

终端输入命令:make menuconfig

步骤:

①-> Device Drivers

② -> Network device support

③ -> PHY Device support and infrastructure

④ -> Drivers for SMSC PHYs

[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为_引脚_15


保存完毕了,选择Exit,一路退出。

  1. 修改 smsc.c 文件

首先需要找到 LAN8720A 的驱动文件,LAN8720A 的驱动文件是 drivers/net/phy/smsc.c,在此文件中有个叫做 smsc_phy_reset 的函数。

gedit drivers/net/phy/smsc.c

①添加头文件

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

[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为_网络_16


② 修改复位函数:smsc_phy_reset

[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为_嵌入式_17


[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为_linux_18

static int smsc_phy_reset(struct phy_device *phydev)
{
int err, phy_reset;
int msec = 1;
struct device_node *np;

if(phydev->addr == 0) /* FEC1 */ {
np = of_find_node_by_path("/soc/aips-bus@02100000/ethernet@02188000");//获取 FEC1 网卡对应的设备节点
if(np == NULL) {
return -EINVAL;
}
}

if(phydev->addr == 1) /* FEC2 */ {
np = of_find_node_by_path("/soc/aips-bus@02000000/ethernet@020b4000");//获取 FEC2 网卡对应的设备节点
if(np == NULL) {
return -EINVAL;
}
}

err = of_property_read_u32(np, "phy-reset-duration", &msec);//从设备树中获取“phy-reset-duration”属性信息,也就是复位时间
/* A sane reset duration should not be longer than 1s */
if (!err && msec > 1000)
msec = 1;
phy_reset = of_get_named_gpio(np, "phy-reset-gpios", 0);//从设备树中获取“phy-reset-gpios”属性信息,也就是复位 IO
if (!gpio_is_valid(phy_reset))
return;
/*设置 PHY 的复位 IO,复位 LAN8720A*/
gpio_direction_output(phy_reset, 0);
gpio_set_value(phy_reset, 0);
msleep(msec);
gpio_set_value(phy_reset, 1);

int rc = phy_read(phydev, MII_LAN83C185_SPECIAL_MODES);
if (rc < 0)
return rc;

/* 设置为全功能模式*/
if ((rc & MII_LAN83C185_MODE_MASK) == MII_LAN83C185_MODE_POWERDOWN) {

/* 设置“所有功能”模式并重置phy */
rc |= MII_LAN83C185_MODE_ALL;
phy_write(phydev, MII_LAN83C185_SPECIAL_MODES, rc);
}

phy_write(phydev, MII_BMCR, BMCR_RESET);
/* 复位等待结束 (max 500 ms) */
int timeout = 50000;
do {
udelay(10);
if (timeout-- == 0)
return -1;
rc = phy_read(phydev, MII_BMCR);
} while (rc & BMCR_RESET);
return 0;
}

然后保存重新编译

(不要用shell,因为会清除配置文件)。

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_mybsp_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16

下载烧录:

编译完成以后就会在目录 arch/arm/boot 下生成 zImage 镜像文件。在 arch/arm/boot/dts 目录下生成 imx6ull-alientek-emmc.dtb 文件。

设置uboot环境变量

setenv bootargs ‘console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw’
saveenv

将zImage烧录到开发板中(参考 4、tftp 命令)

cp arch/arm/boot/zImage …/…/tftpboot/ -f
cp arch/arm/boot/dts/imx6ull-mybsp-emmc.dtb …/…/tftpboot/ -f

将这两个文件拷贝到 tftp 目录下,然后重启开发板,在uboot 命令模式中使用 tftp 命令下载这两个文件并启动,命令如下:

tftp 80800000 zImage
tftp 83000000 imx6ull-mybsp-emmc.dtb
bootz 80800000 - 83000000

[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为_网络_19

网络驱动测试

修改好设备树和 Linux 内核以后重新编译一下,得到新的 zImage 镜像文件和 imx6ull-mybsp-emmc.dtb 设备树文件, 使用网线将 I.MX6U-ALPHA 开发板的两个网口与路由器或者电脑连接起来,最后使用新的文件启动 Linux 内核。

输入命令“ifconfig -a”来查看一下开发板中存在的所有网卡:

[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为_嵌入式_20


使用如下命令依次打开 eth0 和 eth1 这两个网卡:

ifconfig eth0 up
ifconfig eth1 up

[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为_linux_21

输入“ifconfig”命令来查看一下当前活动的网卡

[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为_嵌入式_22


可以看出,此时 eth0 和 eth1 两个网卡都已经打开,并且工作正常,但是这两个网卡都还没有 IP 地址,所以不能进行 ping 等操作。使用如下命令给两个网卡配置 IP 地址:

ifconfig eth0 192.168.1.251、
ifconfig eth1 192.168.1.252

使用“ping”命令来 ping 一下自己的主机。

ping 192.168.1.250

[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为_shell_23

配置文件另存为

因为使用shell,因为会清除配置文件,所有我们需要把配置文件另存为。
操作如下:

终端输入:make menuconfig

[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为_shell_24

输入:arch/arm/configs/imx_mybsp_emmc_defconfig

[I.MX6UL] Linux 内核移植(三) 网络驱动修改 配置文件另存为_shell_25

这样就可以使用shell,因为另存为后,就不会被清除。
运行脚本:

chmod 777 imx6ull_mybsp_emmc.sh
//给予可执行权限
./imx6ull_mybsp_emmc.sh
//执行 shell 脚本编译内核


标签:reset,ENET1,配置文件,另存为,emmc,引脚,pinctrl,phy,Linux
From: https://blog.51cto.com/xuejianqiang/5811333

相关文章

  • [I.MX6UL] Linux 内核移植(二) 在 Linux 中添加自己的开发板
    添加开发板默认配置文件将arch/arm/configs目录下的imx_v7_mfg_defconfig重新复制一份,命名为imx_mybsp_emmc_defconfig,命令如下:当前路径:~/linux/IMX6ULL/li......
  • linux下使用nvm
    安装curl-o-https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh|bash配置环境vim~/.bashrc在~/.bashrc的末尾,添加如下语句:exportNVM_DI......
  • Linux下使用nm命令排查和解决“undefined reference to ”
    一、案例    编译出一个动态库.libXXXEngine.so。然后直接在另一个工程中,把头文件include进来,并link到该库:-lXXXEngine.尝试编译,出错:.//libXXXEngine.so:undefin......
  • Linux下的C语言编写
    终端下输入:创建目录:mkdirC_Program进入目录:cdC_Program创建目录:mkdirhello_world进入目录:cdhello_world使用gedit:gedit输入以下代码并保存:#include<stdio.h>int......
  • Linux C语言 Makefile 的使用 函数
    创建三个.c文件终端输入:创建目录:mkdirMakefile进入目录:cdMakefile使用gedit:gedit第一个文件:main.c#include<stdio.h>#include"input.h"#include"calcu.h"intm......
  • Linux I/O模型
    I/O:指的是计算机的input和outputLinux的I/O磁盘I/O网络I/O:一切皆文件,本质为对socket文件的读写磁盘I/O进程向内核发起系统调用,请求磁盘上的某个资源......
  • [单片机框架][driver层][ioctl] MCU模拟Linux注册驱动
    概念ioctl是设备驱动程序中设备控制接口函数,一个字符设备驱动通常会实现设备打开、关闭、读、写等功能,在一些需要细分的情境下,如果需要扩展新的功能,通常以增设ioctl()命......
  • Linux finger 命令
    Linux命令是对Linux系统进行管理的命令。对于Linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心,与......
  • Linux源码安装MySQL
    在Linux中源码安装MySQL​​A、必备条件​​​​a>CMake​​​​b>Boost​​​​c>Mysql​​​​B、安装详情​​​​a>添加mysql用户​​​​b>配置mysql预编译参数​​​......
  • Linux如何在history命令时,查看命令执行时间
    效果如下实现过程直接在/etc/profile文件的末尾,加上:exportHISTTIMEFORMAT="%Y-%m-%d%H:%M:%S"注意:在末尾的“引号”与“S”之间,加入一位空格,将日期时间和历史命令用空格......