硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4430|回复: 17
收起左侧

[RL-TCPnet V7.X] 配套新版RL-TCPnet V7.X和LwIP的DM9162/9161驱动,符合CMSIS-Driver驱动规范,适用于所有STM32系列

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106828
QQ
发表于 2019-8-14 01:27:58 | 显示全部楼层 |阅读模式




  1. /*
  2. *********************************************************************************************************
  3. *
  4. *        模块名称 : DM9161/9162 FOR CMSIS Driver
  5. *        文件名称 : PHY_DM916x.c
  6. *        版    本 : V1.0
  7. *        说    明 : DM9161/9162驱动。
  8. *
  9. *        修改记录 :
  10. *                版本号   日期         作者        说明
  11. *                V1.0    2019-08-14   Eric2013     首版
  12. *
  13. *        Copyright (C), 2019-2030, 安富莱电子 www.armfly.com
  14. *
  15. *********************************************************************************************************
  16. */
  17. /* Copyright (c) 2013-2018 Arm Limited. All rights reserved.
  18. *
  19. * SPDX-License-Identifier: Apache-2.0
  20. *
  21. * Licensed under the Apache License, Version 2.0 (the License); you may
  22. * not use this file except in compliance with the License.
  23. * You may obtain a copy of the License at
  24. *
  25. * www.apache.org/licenses/LICENSE-2.0
  26. *
  27. * Unless required by applicable law or agreed to in writing, software
  28. * distributed under the License is distributed on an AS IS BASIS, WITHOUT
  29. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  30. * See the License for the specific language governing permissions and
  31. * limitations under the License.
  32. *
  33. * -----------------------------------------------------------------------
  34. *
  35. * $Date:        25. May 2018
  36. * $Revision:    V6.3
  37. *
  38. * Driver:       Driver_ETH_PHYn (default: Driver_ETH_PHY0)
  39. * Project:      Ethernet Physical Layer Transceiver (PHY)
  40. *               Driver for KSZ8081RNA (KSZ8081RNB compatible)
  41. * -----------------------------------------------------------------------
  42. * Use the following configuration settings in the middleware component
  43. * to connect to this driver.
  44. *
  45. *   Configuration Setting                     Value
  46. *   ---------------------                     -----
  47. *   Connect to hardware via Driver_ETH_PHY# = n (default: 0)
  48. * -------------------------------------------------------------------- */

  49. /* History:
  50. *  Version 6.3
  51. *    Added reference clock select configuration option (ETH_PHY_REF_CLK_50M)
  52. *  Version 6.2
  53. *    Updated for ARM compiler 6
  54. *  Version 6.1
  55. *    Added driver flow control flags
  56. *  Version 6.0
  57. *    Initial release
  58. */

  59. #include "PHY_DM916x.h"

  60. #define ARM_ETH_PHY_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(6,2) /* driver version */


  61. #ifndef ETH_PHY_NUM
  62. #define ETH_PHY_NUM          0        /* Default driver number */
  63. #endif

  64. #ifndef ETH_PHY_ADDR
  65. #define ETH_PHY_ADDR         0x01     /* Default device address */
  66. #endif

  67. #ifndef ETH_PHY_REF_CLK_50M
  68. #define ETH_PHY_REF_CLK_50M  0        /* RMII Reference Clock (0:25MHz,1:50MHz) */
  69. #endif


  70. /* Driver Version */
  71. static const ARM_DRIVER_VERSION DriverVersion = {
  72.   ARM_ETH_PHY_API_VERSION,
  73.   ARM_ETH_PHY_DRV_VERSION
  74. };

  75. /* Ethernet PHY control structure */
  76. static PHY_CTRL PHY = { NULL, NULL, 0, 0, 0 };


  77. /**
  78.   \\fn          ARM_DRIVER_VERSION GetVersion (void)
  79.   \\brief       Get driver version.
  80.   \\return      \\ref ARM_DRIVER_VERSION
  81. */
  82. static ARM_DRIVER_VERSION GetVersion (void) {
  83.   return DriverVersion;
  84. }


  85. /**
  86.   \\fn          int32_t Initialize (ARM_ETH_PHY_Read_t  fn_read,
  87.                                    ARM_ETH_PHY_Write_t fn_write)
  88.   \\brief       Initialize Ethernet PHY Device.
  89.   \\param[in]   fn_read   Pointer to \\ref ARM_ETH_MAC_PHY_Read
  90.   \\param[in]   fn_write  Pointer to \\ref ARM_ETH_MAC_PHY_Write
  91.   \\return      \\ref execution_status
  92. */
  93. static int32_t Initialize (ARM_ETH_PHY_Read_t fn_read, ARM_ETH_PHY_Write_t fn_write) {

  94.   if ((fn_read == NULL) || (fn_write == NULL)) { return ARM_DRIVER_ERROR_PARAMETER; }

  95.   if ((PHY.flags & PHY_INIT) == 0U) {
  96.     /* Register PHY read/write functions. */
  97.     PHY.reg_rd = fn_read;
  98.     PHY.reg_wr = fn_write;

  99.     PHY.bmcr   = 0U;
  100.     PHY.flags  = PHY_INIT;
  101.   }

  102.   return ARM_DRIVER_OK;
  103. }

  104. /**
  105.   \\fn          int32_t Uninitialize (void)
  106.   \\brief       De-initialize Ethernet PHY Device.
  107.   \\return      \\ref execution_status
  108. */
  109. static int32_t Uninitialize (void) {

  110.   PHY.reg_rd = NULL;
  111.   PHY.reg_wr = NULL;
  112.   PHY.bmcr   = 0U;
  113.   PHY.flags  = 0U;

  114.   return ARM_DRIVER_OK;
  115. }

  116. /**
  117.   \\fn          int32_t PowerControl (ARM_POWER_STATE state)
  118.   \\brief       Control Ethernet PHY Device Power.
  119.   \\param[in]   state  Power state
  120.   \\return      \\ref execution_status
  121. */
  122. static int32_t PowerControl (ARM_POWER_STATE state) {
  123.   uint16_t val;

  124.   switch ((int32_t)state) {
  125.     case ARM_POWER_OFF:
  126.       if ((PHY.flags & PHY_INIT) == 0U) {
  127.         /* Initialize must provide register access function pointers */
  128.         return ARM_DRIVER_ERROR;
  129.       }

  130.       PHY.flags &= ~PHY_POWER;
  131.       PHY.bmcr   =  BMCR_POWER_DOWN;

  132.       return (PHY.reg_wr(ETH_PHY_ADDR, REG_BMCR, PHY.bmcr));

  133.     case ARM_POWER_FULL:
  134.       if ((PHY.flags & PHY_INIT) == 0U) {
  135.         return ARM_DRIVER_ERROR;
  136.       }
  137.       if (PHY.flags & PHY_POWER) {
  138.         return ARM_DRIVER_OK;
  139.       }

  140.       /* Check Device Identification. */
  141.       PHY.reg_rd(ETH_PHY_ADDR, REG_PHYIDR1, &val);

  142.       if (val != PHY_ID1) {
  143.         /* Invalid PHY ID */
  144.         return ARM_DRIVER_ERROR_UNSUPPORTED;
  145.       }

  146.       PHY.reg_rd(ETH_PHY_ADDR, REG_PHYIDR2, &val);

  147.       if ((val & 0xFF00) != PHY_ID2) {
  148.         /* Invalid PHY ID */
  149.         return ARM_DRIVER_ERROR_UNSUPPORTED;
  150.       }

  151.       #if (ETH_PHY_REF_CLK_50M != 0)
  152.         /* PHY clock input XI is 50MHz */
  153.         PHY.reg_rd(ETH_PHY_ADDR, REG_PHYCR2, &val);

  154.         /* Set RMII Reference Clock Select bit */
  155.         val |= PHYCR2_REF_CLK_SELECT;

  156.         PHY.reg_wr(ETH_PHY_ADDR, REG_PHYCR2, val);
  157.       #endif

  158.       PHY.bmcr = 0U;

  159.       if (PHY.reg_wr(ETH_PHY_ADDR, REG_BMCR, PHY.bmcr) != ARM_DRIVER_OK) {
  160.         return ARM_DRIVER_ERROR;
  161.       }

  162.       PHY.flags |=  PHY_POWER;

  163.       return ARM_DRIVER_OK;

  164.     case ARM_POWER_LOW:
  165.     default:
  166.       return ARM_DRIVER_ERROR_UNSUPPORTED;
  167.   }
  168. }

  169. /**
  170.   \\fn          int32_t SetInterface (uint32_t interface)
  171.   \\brief       Set Ethernet Media Interface.
  172.   \\param[in]   interface  Media Interface type
  173.   \\return      \\ref execution_status
  174. */
  175. static int32_t SetInterface (uint32_t interface) {
  176.   int32_t status;

  177.   if ((PHY.flags & PHY_POWER) == 0U) { return ARM_DRIVER_ERROR; }

  178.   /* This device only supports RMII interface */
  179.   switch (interface) {
  180.     case ARM_ETH_INTERFACE_RMII: status = ARM_DRIVER_OK; break;
  181.     default:
  182.       status = ARM_DRIVER_ERROR_UNSUPPORTED; break;
  183.   }

  184.   return (status);
  185. }

  186. /**
  187.   \\fn          int32_t SetMode (uint32_t mode)
  188.   \\brief       Set Ethernet PHY Device Operation mode.
  189.   \\param[in]   mode  Operation Mode
  190.   \\return      \\ref execution_status
  191. */
  192. static int32_t SetMode (uint32_t mode) {
  193.   uint16_t val;

  194.   if ((PHY.flags & PHY_POWER) == 0U) { return ARM_DRIVER_ERROR; }

  195.   val = PHY.bmcr & BMCR_POWER_DOWN;

  196.   switch (mode & ARM_ETH_PHY_SPEED_Msk) {
  197.     case ARM_ETH_PHY_SPEED_10M:
  198.       break;
  199.     case ARM_ETH_PHY_SPEED_100M:
  200.       val |= BMCR_SPEED_SELECT;
  201.       break;
  202.     default:
  203.       return ARM_DRIVER_ERROR_UNSUPPORTED;
  204.   }

  205.   switch (mode & ARM_ETH_PHY_DUPLEX_Msk) {
  206.     case ARM_ETH_PHY_DUPLEX_HALF:
  207.       break;
  208.     case ARM_ETH_PHY_DUPLEX_FULL:
  209.       val |= BMCR_DUPLEX_MODE;
  210.       break;
  211.     default:
  212.       return ARM_DRIVER_ERROR_UNSUPPORTED;
  213.   }

  214.   if (mode & ARM_ETH_PHY_AUTO_NEGOTIATE) {
  215.     val |= BMCR_ANEG_EN;
  216.   }

  217.   if (mode & ARM_ETH_PHY_LOOPBACK) {
  218.     val |= BMCR_LOOPBACK;
  219.   }

  220.   if (mode & ARM_ETH_PHY_ISOLATE) {
  221.     val |= BMCR_ISOLATE;
  222.   }

  223.   PHY.bmcr = val;

  224.   return (PHY.reg_wr(ETH_PHY_ADDR, REG_BMCR, PHY.bmcr));
  225. }

  226. /**
  227.   \\fn          ARM_ETH_LINK_STATE GetLinkState (void)
  228.   \\brief       Get Ethernet PHY Device Link state.
  229.   \\return      current link status \\ref ARM_ETH_LINK_STATE
  230. */
  231. static ARM_ETH_LINK_STATE GetLinkState (void) {
  232.   ARM_ETH_LINK_STATE state;
  233.   uint16_t           val = 0U;

  234.   if (PHY.flags & PHY_POWER) {
  235.     PHY.reg_rd(ETH_PHY_ADDR, REG_BMSR, &val);
  236.   }
  237.   state = (val & BMSR_LINK_STAT) ? ARM_ETH_LINK_UP : ARM_ETH_LINK_DOWN;

  238.   return (state);
  239. }

  240. /**
  241.   \\fn          ARM_ETH_LINK_INFO GetLinkInfo (void)
  242.   \\brief       Get Ethernet PHY Device Link information.
  243.   \\return      current link parameters \\ref ARM_ETH_LINK_INFO
  244. */
  245. static ARM_ETH_LINK_INFO GetLinkInfo (void) {
  246.   ARM_ETH_LINK_INFO info;
  247.   uint16_t          val = 0U;

  248.   if (PHY.flags & PHY_POWER) {
  249.     /* Get operation mode indication from PHY DSCSR register */
  250.     PHY.reg_rd(ETH_PHY_ADDR, REG_DSCSR, &val);
  251.   }

  252.   /* Link must be up to get valid state */
  253.   info.speed  = ((val & DSCSR_100M_FD)|(val & DSCSR_100M_HD)) ? ARM_ETH_SPEED_100M  : ARM_ETH_SPEED_10M;
  254.   info.duplex = ((val & DSCSR_100M_FD)|(val & DSCSR_10M_FD)) ? ARM_ETH_DUPLEX_FULL : ARM_ETH_DUPLEX_HALF;


  255.   return (info);
  256. }


  257. /* PHY Driver Control Block */
  258. extern
  259. ARM_DRIVER_ETH_PHY ARM_Driver_ETH_PHY_(ETH_PHY_NUM);
  260. ARM_DRIVER_ETH_PHY ARM_Driver_ETH_PHY_(ETH_PHY_NUM) = {
  261.   GetVersion,
  262.   Initialize,
  263.   Uninitialize,
  264.   PowerControl,
  265.   SetInterface,
  266.   SetMode,
  267.   GetLinkState,
  268.   GetLinkInfo
  269. };
复制代码


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106828
QQ
 楼主| 发表于 2019-8-14 01:28:51 | 显示全部楼层
这个专栏也发一份,方便以后查找。
回复

使用道具 举报

1

主题

16

回帖

19

积分

新手上路

积分
19
发表于 2019-8-14 07:50:56 | 显示全部楼层
这个芯片用FSMC驱动的?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106828
QQ
 楼主| 发表于 2019-8-14 08:59:59 | 显示全部楼层
1328616904 发表于 2019-8-14 07:50
这个芯片用FSMC驱动的?

RMII/MII
回复

使用道具 举报

1

主题

16

回帖

19

积分

新手上路

积分
19
发表于 2019-8-14 14:59:42 | 显示全部楼层

后来看了一下是个PHY,所以没审核改不了了
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2019-9-7 22:13:01 | 显示全部楼层
你好,你们现在网络协议栈也用的LWIP吗?LWIP教程在论坛哪里呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106828
QQ
 楼主| 发表于 2019-9-9 00:11:42 | 显示全部楼层
李拓 发表于 2019-9-7 22:13
你好,你们现在网络协议栈也用的LWIP吗?LWIP教程在论坛哪里呢?

这个驱动支持用于LwIP
回复

使用道具 举报

27

主题

27

回帖

108

积分

初级会员

积分
108
发表于 2019-10-14 16:28:59 | 显示全部楼层
我用的LAN8720芯片,用MDK5配置CMSIS DRIVER 的MAC PHY  然后使用RL-TCPNET 7.x
打开DEBUG调试 在使用SOCKET API时  会有ETH ERR:LINK DOWN,请教是什么原因,
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106828
QQ
 楼主| 发表于 2019-10-14 16:58:01 | 显示全部楼层
nofreeze 发表于 2019-10-14 16:28
我用的LAN8720芯片,用MDK5配置CMSIS DRIVER 的MAC PHY  然后使用RL-TCPNET 7.x
打开DEBUG调试 在使用SOC ...

意思是不是调试不正常,但正常全速运行没问题
回复

使用道具 举报

27

主题

27

回帖

108

积分

初级会员

积分
108
发表于 2019-10-15 00:53:53 | 显示全部楼层
eric2013 发表于 2019-10-14 16:58
意思是不是调试不正常,但正常全速运行没问题

不是,网络就没正常过,RTX系统可以跑起来,但网络没反应,代码是先复位了PHY,然后调用netInitialize (),然后调用BSD SOCKET API, MDK5自带的驱动需要哪里配置或更改吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106828
QQ
 楼主| 发表于 2019-10-15 12:40:29 | 显示全部楼层
nofreeze 发表于 2019-10-15 00:53
不是,网络就没正常过,RTX系统可以跑起来,但网络没反应,代码是先复位了PHY,然后调用netInitialize () ...

你的中断服务程序和RMII引脚和时钟什么的都配置好了没
回复

使用道具 举报

27

主题

27

回帖

108

积分

初级会员

积分
108
发表于 2019-10-15 16:46:37 | 显示全部楼层
eric2013 发表于 2019-10-15 12:40
你的中断服务程序和RMII引脚和时钟什么的都配置好了没

RMII引脚用RTE_Device.h配置的, 中断服务程序在EMAC_STM32F4xx.c里没有配吗? 时钟也没有单独配置,LAN8720用的25M时钟,需要在哪里单独配置吗? 那岂不是要修改官方的驱动,意思驱动是不完整的。
回复

使用道具 举报

27

主题

27

回帖

108

积分

初级会员

积分
108
发表于 2019-10-15 18:49:38 | 显示全部楼层
eric2013 发表于 2019-10-15 12:40
你的中断服务程序和RMII引脚和时钟什么的都配置好了没

中断服务没有配置,EMAC_STM32F4xx驱动默认没有配置吗?,RMII使用的RTE环境配的,时钟没有配置,需要单独配置吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106828
QQ
 楼主| 发表于 2019-10-16 06:33:34 | 显示全部楼层
nofreeze 发表于 2019-10-15 18:49
中断服务没有配置,EMAC_STM32F4xx驱动默认没有配置吗?,RMII使用的RTE环境配的,时钟没有配置,需要单 ...

你这种方式不用,你这种方式是经典的RTE配置方式,像H7上已经没有这种方式了,要单独配置
回复

使用道具 举报

13

主题

223

回帖

262

积分

高级会员

积分
262
发表于 2019-10-31 17:24:32 | 显示全部楼层
nofreeze 发表于 2019-10-15 18:49
中断服务没有配置,EMAC_STM32F4xx驱动默认没有配置吗?,RMII使用的RTE环境配的,时钟没有配置,需要单 ...

楼主网络跑通了吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106828
QQ
 楼主| 发表于 2019-11-1 08:33:08 | 显示全部楼层
miaoqiongb 发表于 2019-10-31 17:24
楼主网络跑通了吗?

F4系列的也做好了,这个月就会发布,确定会发布。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-6 13:14 , Processed in 0.374023 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表