Mastering Embedded Linux Programming 学习 (五)在百问网157开发板上,解决网络配置问题

思考、参考

搜索发现,需要配置设备树,参考这个链接

修改设备树

找到百问网的补丁文件里面的ethernet0节点,内容如下所示

&ethernet0 {status = "okay";pinctrl-0 = <&ethernet0_rgmii_pins_a>;pinctrl-1 = <&ethernet0_rgmii_pins_sleep_a>;pinctrl-names = "default", "sleep";phy-mode = "rgmii";max-speed = <1000>;phy-handle = <&phy0>;mdio0 {#address-cells = <1>;#size-cells = <0>;compatible = "snps,dwmac-mdio";phy0: ethernet-phy@6 {reg = <6>;};};
};

首先把它添加到u-boot的设备树文件里头
修改arch/arm/dts/stm32mp15xx-myboard.dtsi
将文件里的ethernet0节点,修改成上面的ethernet0节点

ethernet0的引脚

注意ethernet0_rgmii_pins_sleep_a,百问网的补丁文件重新定义了,不是简单的修改成原来的ethernet0_rgmii_sleep_pins_a就完事

修改arch/arm/dts/stm32mp15-pinctrl.dtsi
pinctrl节点下的ethernet0_rgmii_sleep_pins_a节点前面添加下面的两个节点
注意要把原来的ethernet0_rgmii_pins_a节点删掉


ethernet0_rgmii_pins_a: rgmii-0 {pins1 {pinmux = <STM32_PINMUX('G', 5, AF11)>, /* ETH_RGMII_CLK125 */<STM32_PINMUX('G', 4, AF11)>, /* ETH_RGMII_GTX_CLK */<STM32_PINMUX('G', 13, AF11)>, /* ETH_RGMII_TXD0 */<STM32_PINMUX('G', 14, AF11)>, /* ETH_RGMII_TXD1 */<STM32_PINMUX('C', 2, AF11)>, /* ETH_RGMII_TXD2 */<STM32_PINMUX('E', 2, AF11)>, /* ETH_RGMII_TXD3 */<STM32_PINMUX('B', 11, AF11)>, /* ETH_RGMII_TX_CTL */<STM32_PINMUX('A', 2, AF11)>, /* ETH_MDIO */<STM32_PINMUX('C', 1, AF11)>; /* ETH_MDC */bias-disable;drive-push-pull;slew-rate = <2>;};pins2 {pinmux = <STM32_PINMUX('C', 4, AF11)>, /* ETH_RGMII_RXD0 */<STM32_PINMUX('C', 4, AF11)>, /* ETH_RGMII_RXD0 */<STM32_PINMUX('C', 5, AF11)>, /* ETH_RGMII_RXD1 */<STM32_PINMUX('B', 0, AF11)>, /* ETH_RGMII_RXD2 */<STM32_PINMUX('B', 1, AF11)>, /* ETH_RGMII_RXD3 */<STM32_PINMUX('A', 1, AF11)>, /* ETH_RGMII_RX_CLK */<STM32_PINMUX('A', 7, AF11)>; /* ETH_RGMII_RX_CTL */bias-disable;};};ethernet0_rgmii_pins_sleep_a: rgmii-sleep-0 {pins1 {pinmux = <STM32_PINMUX('G', 5, ANALOG)>, /* ETH_RGMII_CLK125 */<STM32_PINMUX('G', 4, ANALOG)>, /* ETH_RGMII_GTX_CLK */<STM32_PINMUX('G', 13, ANALOG)>, /* ETH_RGMII_TXD0 */<STM32_PINMUX('G', 14, ANALOG)>, /* ETH_RGMII_TXD1 */<STM32_PINMUX('C', 2, ANALOG)>, /* ETH_RGMII_TXD2 */<STM32_PINMUX('E', 2, ANALOG)>, /* ETH_RGMII_TXD3 */<STM32_PINMUX('B', 11, ANALOG)>, /* ETH_RGMII_TX_CTL */<STM32_PINMUX('A', 2, ANALOG)>, /* ETH_MDIO */<STM32_PINMUX('C', 1, ANALOG)>, /* ETH_MDC */<STM32_PINMUX('C', 4, ANALOG)>, /* ETH_RGMII_RXD0 */<STM32_PINMUX('C', 5, ANALOG)>, /* ETH_RGMII_RXD1 */<STM32_PINMUX('B', 0, ANALOG)>, /* ETH_RGMII_RXD2 */<STM32_PINMUX('B', 1, ANALOG)>, /* ETH_RGMII_RXD3 */<STM32_PINMUX('A', 1, ANALOG)>, /* ETH_RGMII_RX_CLK */<STM32_PINMUX('A', 7, ANALOG)>; /* ETH_RGMII_RX_CTL */};
};

修改arch/arm/dts/stm32mp15xx-myboard.dtsi
adc节点的status属性修改为disable

然后重新烧录编译

启动u-boot

设置网络参数

setenv ipaddr 192.168.123.18
setenv gatewayip 192.168.123.1
setenv netmask 255.255.255.0
setenv serverip 192.168.123.220
saveenv

修改ethernet0节点

备份arch/arm/dts/stm32mp151.dtsi
修改arch/arm/dts/stm32mp151.dtsi下的ethernet0节点
修改成如下的格式

ethernet0: ethernet@5800a000 {compatible = "st,stm32mp1-dwmac", "snps,dwmac-4.20a";reg = <0x5800a000 0x2000>;reg-names = "stmmaceth";interrupts-extended = <&intc GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>,<&exti 70 IRQ_TYPE_LEVEL_HIGH>;interrupt-names = "macirq","eth_wake_irq";clock-names = "stmmaceth","mac-clk-tx","mac-clk-rx","ethstp","ethstp";clocks = <&rcc ETHMAC>,<&rcc ETHTX>,<&rcc ETHRX>,<&rcc ETHCK_K>,<&rcc ETHSTP>;st,syscon = <&syscfg 0x4>;snps,mixed-burst;snps,pbl = <2>;snps,en-tx-lpi-clockgating;snps,axi-config = <&stmmac_axi_config_0>;snps,tso;power-domains = <&pd_core>;status = "disabled";
};

重新编译烧录

pd_core不存在

提示pd_core不存在
在100ask的arch/arm/dts/stm32mp151.dtsi文件找到如下节点

编译成功

修改**arch/arm/dts/stm32mp15xx-myboard.dtsi **下的adc节点的adc1节点的status为disable

重新编译烧录

不报adc错误了,但是提示找不到adc设备
使用dhcp命令报错

搜索源码发现是在这个文件里

然后发现是这个玩意的驱动

发现是出错在这里

找到157相关的寄存器,发现有提示,难道是时钟没有配置好?

参考补丁开始修改

修改board/st/common/stusb160x.c

STUSB1600_CC_CONNECTION_STATUS修改为0x42
但是在board/st/stm32mp1/stm32mp1.c找不到这一个,不过发现下面这一行头文件

最后发现是在这个文件里面
board/st/common/stusb160x.c
而且变成了这个形式

修改这两个宏如下

修改board/st/stm32mp1/stm32mp1.c

继续修改stm32mp151.c,在最后一个endif下面添加下面的代码

static bool board_is_ya15xc_v2(void)
{if (CONFIG_IS_ENABLED(TARGET_ST_STM32MP15x) && of_machine_is_compatible("st,stm32mp157"))return true;return false;
}static int phy_power(void)
{ofnode node1;struct gpio_desc phy;int ret = 0;node1 = ofnode_path("/wifi_bt_power/phy");if (!ofnode_valid(node1)) {printf("%s:  no phy-power?\n", __func__);return -ENOENT;}if (gpio_request_by_name_nodev(node1, "gpios", 0,&phy, GPIOD_IS_OUT)) {printf("%s: could not find reset-gpios1\n",__func__);return -ENOENT;}ret = dm_gpio_set_value(&phy, 1);if (ret) {pr_err("%s: can't set_value for phy reset gpio", __func__);goto error;}error:return ret;
}static bool board_is_ya15xc(void)
{if (CONFIG_IS_ENABLED(TARGET_ST_STM32MP15x) &&(of_machine_is_compatible("st,stm32mp157") ||of_machine_is_compatible("st,stm32mp157c-ya157c-v2")))return true;return false;
}//reset the wifi-bt
static int wifi_bt_power(void)
{ofnode node1, node2;struct gpio_desc wifi, bt;int ret = 0;node1 = ofnode_path("/wifi_bt_power/wifi");if (!ofnode_valid(node1)) {printf("%s:  no wifi-power?\n", __func__);return -ENOENT;}node2 = ofnode_path("/wifi_bt_power/bt");if (!ofnode_valid(node2)) {printf("%s:  no bt-power?\n", __func__);return -ENOENT;}if (gpio_request_by_name_nodev(node1, "gpios", 0,&wifi, GPIOD_IS_OUT)) {printf("%s: could not find reset-gpios1\n",__func__);return -ENOENT;}if (gpio_request_by_name_nodev(node2, "gpios", 0,&bt, GPIOD_IS_OUT)) {printf("%s: could not find reset-gpios2\n",__func__);return -ENOENT;}ret = dm_gpio_set_value(&wifi, 0);if (ret) {pr_err("%s: can't set_value for wifi reset gpio", __func__);goto error;}ret = dm_gpio_set_value(&bt, 0);if (ret) {pr_err("%s: can't set_value for bt reset gpio", __func__);goto error;}mdelay(100);//delayret = dm_gpio_set_value(&wifi, 1);if (ret) {pr_err("%s: can't set_value for wifi reset gpio", __func__);goto error;}ret = dm_gpio_set_value(&bt, 1);if (ret) {pr_err("%s: can't set_value for bt reset gpio", __func__);goto error;}error:return ret;}

搜索board_key_check,在board_init()函数调用board_key_check函数的后面添加如下代码


if (board_is_ya15xc())
{wifi_bt_power();dk2_i2c1_fix();
}if (board_is_ya15xc_v2())
{phy_power();}

考虑到把函数定义放在了后面,需要在board_init函数前放我们上面的函数声明

static bool board_is_ya15xc_v2(void);
static int phy_power(void);
static bool board_is_ya15xc(void);
static int wifi_bt_power(void);/* board dependent setup after realloc */
int board_init(void)
...

修改drivers/clk/clk_stm32mp1.c

修改drivers/dfu/dfu.c

做如下修改

修改drivers/net/dwc_eth_qos.c

修改drivers/net/phy/atheros.c

在int ret 下添加下面的内容

u16 val;
/*----------------------------------------------*/
/* Ar803x phy SmartEEE feature cause link status generates glitch,
* which cause ethernet link down/up issue, so disable SmartEEE
*/
phy_write(phydev,MDIO_DEVAD_NONE, 0xd, 0x3);
phy_write(phydev,MDIO_DEVAD_NONE, 0xe, 0x805d);
phy_write(phydev,MDIO_DEVAD_NONE, 0xd, 0x4003);val = phy_read(phydev,MDIO_DEVAD_NONE, 0xe);
phy_write(phydev,MDIO_DEVAD_NONE, 0xe, val & ~(1 << 8));/* To enable AR8031 output a 125MHz clk from CLK_25M */
phy_write(phydev,MDIO_DEVAD_NONE, 0xd, 0x7);
phy_write(phydev,MDIO_DEVAD_NONE, 0xe, 0x8016);
phy_write(phydev,MDIO_DEVAD_NONE, 0xd, 0x4007);val = phy_read(phydev,MDIO_DEVAD_NONE, 0xe);
val &= 0xffe3;
val |= 0x18;
phy_write(phydev,MDIO_DEVAD_NONE, 0xe, val);phy_write(phydev,MDIO_DEVAD_NONE, 0x1d, 0x5);
val = phy_read(phydev,MDIO_DEVAD_NONE, 0x1e);
val |= 0x0100;
phy_write(phydev,MDIO_DEVAD_NONE, 0x1e, val);
printf("test ar8035 !!!");
/*------------------------------------------*/

修改drivers/net/phy/phy.c

在phy_probe函数下添加如下内容


phydev->supported = phydev->drv->features;phydev->mmds = phydev->drv->mmds;u16 val;
/*----------------------------------------------*/
/* Ar803x phy SmartEEE feature cause link status generates glitch,
* which cause ethernet link down/up issue, so disable SmartEEE
*/
phy_write(phydev,MDIO_DEVAD_NONE, 0xd, 0x3);
phy_write(phydev,MDIO_DEVAD_NONE, 0xe, 0x805d);
phy_write(phydev,MDIO_DEVAD_NONE, 0xd, 0x4003);val = phy_read(phydev,MDIO_DEVAD_NONE, 0xe);
phy_write(phydev,MDIO_DEVAD_NONE, 0xe, val & ~(1 << 8));/* To enable AR8031 output a 125MHz clk from CLK_25M */
phy_write(phydev,MDIO_DEVAD_NONE, 0xd, 0x7);
phy_write(phydev,MDIO_DEVAD_NONE, 0xe, 0x8016);
phy_write(phydev,MDIO_DEVAD_NONE, 0xd, 0x4007);val = phy_read(phydev,MDIO_DEVAD_NONE, 0xe);
val &= 0xffe3;
val |= 0x18;
phy_write(phydev,MDIO_DEVAD_NONE, 0xe, val);phy_write(phydev,MDIO_DEVAD_NONE, 0x1d, 0x5);
val = phy_read(phydev,MDIO_DEVAD_NONE, 0x1e);
val |= 0x0100;
phy_write(phydev,MDIO_DEVAD_NONE, 0x1e, val);
//--------------------------------------

编译成功,重新烧录

提示这个,需要继续修改设备树文件

修改arch/arm/dts/stm32mp157c-myboard.dts

在根节点下添加

wifi_bt_power:wifi_bt_power {compatible = "wifibt-rst";wifi {label = "wifi-rst";gpios = <&gpioi 3 GPIO_ACTIVE_HIGH>;};bt {label = "bt-rst";gpios = <&gpioa 15 GPIO_ACTIVE_HIGH>;};phy {label = "phy-rest";gpios = <&gpiog 0 GPIO_ACTIVE_HIGH>;};
};    

编译成功,重新烧录


成功搞定!!!

Mastering Embedded Linux Programming 学习 (五)在百问网157开发板上,解决网络配置问题相关推荐

  1. Mastering Embedded Linux Programming 学习 (二)在百问网157开发板上,编译构建u-boot

    Mastering Embedded Linux Programming 学习 (二)在百问网157开发板上,编译构建u-boot 一.下载u-boot源码 git clone https://git ...

  2. Mastering Embedded Linux Programming 学习 (三)在百问网157开发板上,编译构建linux内核

    Mastering Embedded Linux Programming 学习 (三)在百问网157开发板上,编译构建linux内核 一.下载内核源码 wget http://ftp.sjtu.edu ...

  3. Mastering Embedded Linux Programming 学习 (一)嵌入式交叉编译工具链的构建,基于crosstool-NG

    Mastering Embedded Linux Programming 学习 (一) 一.ubuntu 软件包下载 sudo apt install autoconf automake bison ...

  4. 基于百问网IMX6ULL_PRO开发板的Uboot移植(Uboot-2017.03)

    文章目录 引言 Uboot下载 Uboot目录分析 目录分析 移植所需要关注的目录 首次编译下载Uboot 编译 下载 方法1 方法2 方法3 现象 移植Uboot 添加自己单板相关文件 添加修改单板 ...

  5. 基于百问网IMX6ULL_PRO开发板移植LCD多点触摸驱动(GT911)

    引言 笔者这里使用的Linux内核是自己移植的4.1.15版本 添加驱动代码 进入drivers/input/touchscreen目录查找是否拥有gt911驱动 cd drivers/input/t ...

  6. 关于百问网_STM32F103_MINI开发板的介绍

    STM32F103_MINI开发板的介绍 学习内容: 建立集成开发环境 调试或者下载 打印显示 1.如何建立集成开发环境: 主要通过步骤是编辑→编译→汇编→链接→调试和下载 2.调试和下载: 主机(电 ...

  7. 【百问网DongshanPI-D1S开发板体验】+ RT-Smart初体验

    前言 根据测评计划,本次在D1S开发板芯片上体验RT-Smart系统,在整个过程中也遇到了很多问题,熬了几个晚上,终于把坑铺平了,本篇文章记录整个过程,本篇文章是完成后才写的,中间可能有部分遗漏,遇到 ...

  8. qt 4.8.4 linux,Tslib和Qt 4.8.4与在开发板上的移植

    这篇博客算是接着Linux 下编译.安装.配置 QT这篇的,搞完PC平台的就来弄一下嵌入式平台的,Linux的东西搞起来麻烦的地方就在于太杂.太散,像QT,各版本之间都有很多差异,因此在网络上查找资料 ...

  9. 嵌入式Linux作业二分析u-boot-1.1.6在smdk2410开发板上的启动代码

    嵌入式Linux实验 嵌入式Linux作业二 文章目录 嵌入式Linux实验 作业要求 一.作业分析 二.实验步骤 1.下载并解压uboot1.1.6源码 2. 分析该版本下开发板smdk2410的相 ...

最新文章

  1. 细节详解 | Bert,GPT,RNN及LSTM模型
  2. 服务器 上传文件 杀毒,一种实现文件上传网站后自动进行杀毒的方法及系统
  3. 大数据,只是为了赚钱么?
  4. 皮一皮:颜值的重要。。。
  5. (转载)安全漏洞概念及分类
  6. vue设置全局变量和修改
  7. C语言实验——拍皮球_JAVA
  8. 获取Domain中Value Range值和描述文本的方法
  9. Java集合框架总结(5)——Map接口的使用
  10. 关于ES6的10个最佳特性
  11. 【TensorFlow-windows】学习笔记七——生成对抗网络
  12. IT人回家过年的尴尬
  13. 工作327:uni-数据格式处理
  14. 类中的__init__()
  15. Docker教程小白实操入门(3)--如何启动一个已经停止的容器
  16. Ubuntu java 环境变量
  17. docker 安装 oracle
  18. JavaScript 中级篇:模块化编程
  19. c语言uefi读写文件,UEFI简单的应用程序模块MyHelloWorld:C源文件/INF工程文件源码/简析[6]...
  20. 机器人遛机器狗,估计不久能看到了

热门文章

  1. 第四课 SS7产品简介
  2. ANSYS | 材料属性库复制
  3. 突然 Gitee 倒下了!!!
  4. Google云端硬盘初学者使用Colaboratory出现的问题——指定已上传的文件夹
  5. 全排列邻位对换法c语言算法,全排列及相关扩展算法(六)——全排列最蛋疼的算法:邻位对换法...
  6. 预推免复习之英语口试
  7. 使用Postman测试接口时绕过登录
  8. 20145326 《Java程序设计》实验五——Java网络编程及安全实验报告
  9. SQL创建视图(CREATE VIEW)
  10. 1.算法入门必知必会:时间复杂度和空间复杂度