Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
混口饭吃,
rt-thread
提交
5fd89e44
R
rt-thread
项目概览
混口饭吃,
/
rt-thread
与 Fork 源项目一致
Fork自
Mr_Pangza / rt-thread
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rt-thread
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
5fd89e44
编写于
12月 07, 2017
作者:
T
tanek liang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[bsp] update eth driver: fix phy init never timeout bug
上级
049ed504
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
94 addition
and
79 deletion
+94
-79
bsp/imxrt1052-evk/drivers/drv_eth.c
bsp/imxrt1052-evk/drivers/drv_eth.c
+87
-76
bsp/imxrt1052-evk/drivers/fsl_phy.c
bsp/imxrt1052-evk/drivers/fsl_phy.c
+7
-3
未找到文件。
bsp/imxrt1052-evk/drivers/drv_eth.c
浏览文件 @
5fd89e44
...
@@ -36,16 +36,17 @@
...
@@ -36,16 +36,17 @@
#define PHY_ADDRESS 0x02u
#define PHY_ADDRESS 0x02u
/* debug option */
/* debug option */
//#define DEBUG
//#define ETH_RX_DUMP
//#define ETH_RX_DUMP
//#define ETH_TX_DUMP
//#define ETH_TX_DUMP
#
ifdef DEBUG
#
define DBG_ENABLE
#define
ETH_PRINTF rt_kprintf
#define
DBG_SECTION_NAME "[ETH]"
#
else
#
define DBG_COLOR
#define
ETH_PRINTF(...)
#define
DBG_LEVEL DBG_INFO
#
endif
#
include <rtdbg.h>
#define MAX_ADDR_LEN 6
#define MAX_ADDR_LEN 6
...
@@ -380,13 +381,11 @@ static void _enet_config(void)
...
@@ -380,13 +381,11 @@ static void _enet_config(void)
/* Set SMI to get PHY link status. */
/* Set SMI to get PHY link status. */
sysClock
=
CLOCK_GetFreq
(
kCLOCK_AhbClk
);
sysClock
=
CLOCK_GetFreq
(
kCLOCK_AhbClk
);
status
=
PHY_Init
(
imxrt_eth_device
.
enet_base
,
PHY_ADDRESS
,
sysClock
);
status
=
PHY_Init
(
imxrt_eth_device
.
enet_base
,
PHY_ADDRESS
,
sysClock
);
while
(
status
!=
kStatus_Success
)
{
ETH_PRINTF
(
"
\r\n
PHY Auto-negotiation failed. Please check the cable connection and link partner setting.
\r\n
"
);
status
=
PHY_Init
(
imxrt_eth_device
.
enet_base
,
PHY_ADDRESS
,
sysClock
);
}
if
(
status
==
kStatus_Success
)
{
PHY_GetLinkStatus
(
imxrt_eth_device
.
enet_base
,
PHY_ADDRESS
,
&
link
);
PHY_GetLinkStatus
(
imxrt_eth_device
.
enet_base
,
PHY_ADDRESS
,
&
link
);
if
(
link
)
if
(
link
)
{
{
...
@@ -397,6 +396,18 @@ static void _enet_config(void)
...
@@ -397,6 +396,18 @@ static void _enet_config(void)
config
.
miiDuplex
=
(
enet_mii_duplex_t
)
duplex
;
config
.
miiDuplex
=
(
enet_mii_duplex_t
)
duplex
;
}
}
dbg_log
(
DBG_LOG
,
"PHY Auto-negotiation success.
\n
"
);
eth_device_linkchange
(
&
imxrt_eth_device
.
parent
,
RT_TRUE
);
}
else
{
config
.
miiSpeed
=
kENET_MiiSpeed10M
;
config
.
miiDuplex
=
kENET_MiiHalfDuplex
;
dbg_log
(
DBG_WARNING
,
"PHY Auto-negotiation failed. Please check the cable connection and link partner setting.
\n
"
);
eth_device_linkchange
(
&
imxrt_eth_device
.
parent
,
RT_FALSE
);
}
ENET_Init
(
imxrt_eth_device
.
enet_base
,
&
imxrt_eth_device
.
enet_handle
,
&
config
,
&
buffConfig
,
&
imxrt_eth_device
.
dev_addr
[
0
],
sysClock
);
ENET_Init
(
imxrt_eth_device
.
enet_base
,
&
imxrt_eth_device
.
enet_handle
,
&
config
,
&
buffConfig
,
&
imxrt_eth_device
.
dev_addr
[
0
],
sysClock
);
ENET_SetCallback
(
&
imxrt_eth_device
.
enet_handle
,
_enet_callback
,
&
imxrt_eth_device
);
ENET_SetCallback
(
&
imxrt_eth_device
.
enet_handle
,
_enet_callback
,
&
imxrt_eth_device
);
ENET_ActiveRead
(
imxrt_eth_device
.
enet_base
);
ENET_ActiveRead
(
imxrt_eth_device
.
enet_base
);
...
@@ -416,33 +427,33 @@ static rt_err_t rt_imxrt_eth_init(rt_device_t dev)
...
@@ -416,33 +427,33 @@ static rt_err_t rt_imxrt_eth_init(rt_device_t dev)
static
rt_err_t
rt_imxrt_eth_open
(
rt_device_t
dev
,
rt_uint16_t
oflag
)
static
rt_err_t
rt_imxrt_eth_open
(
rt_device_t
dev
,
rt_uint16_t
oflag
)
{
{
ETH_PRINTF
(
"rt_imxrt_eth_open...
\n
"
);
dbg_log
(
DBG_LOG
,
"rt_imxrt_eth_open...
\n
"
);
return
RT_EOK
;
return
RT_EOK
;
}
}
static
rt_err_t
rt_imxrt_eth_close
(
rt_device_t
dev
)
static
rt_err_t
rt_imxrt_eth_close
(
rt_device_t
dev
)
{
{
ETH_PRINTF
(
"rt_imxrt_eth_close...
\n
"
);
dbg_log
(
DBG_LOG
,
"rt_imxrt_eth_close...
\n
"
);
return
RT_EOK
;
return
RT_EOK
;
}
}
static
rt_size_t
rt_imxrt_eth_read
(
rt_device_t
dev
,
rt_off_t
pos
,
void
*
buffer
,
rt_size_t
size
)
static
rt_size_t
rt_imxrt_eth_read
(
rt_device_t
dev
,
rt_off_t
pos
,
void
*
buffer
,
rt_size_t
size
)
{
{
ETH_PRINTF
(
"rt_imxrt_eth_read...
\n
"
);
dbg_log
(
DBG_LOG
,
"rt_imxrt_eth_read...
\n
"
);
rt_set_errno
(
-
RT_ENOSYS
);
rt_set_errno
(
-
RT_ENOSYS
);
return
0
;
return
0
;
}
}
static
rt_size_t
rt_imxrt_eth_write
(
rt_device_t
dev
,
rt_off_t
pos
,
const
void
*
buffer
,
rt_size_t
size
)
static
rt_size_t
rt_imxrt_eth_write
(
rt_device_t
dev
,
rt_off_t
pos
,
const
void
*
buffer
,
rt_size_t
size
)
{
{
ETH_PRINTF
(
"rt_imxrt_eth_write...
\n
"
);
dbg_log
(
DBG_LOG
,
"rt_imxrt_eth_write...
\n
"
);
rt_set_errno
(
-
RT_ENOSYS
);
rt_set_errno
(
-
RT_ENOSYS
);
return
0
;
return
0
;
}
}
static
rt_err_t
rt_imxrt_eth_control
(
rt_device_t
dev
,
int
cmd
,
void
*
args
)
static
rt_err_t
rt_imxrt_eth_control
(
rt_device_t
dev
,
int
cmd
,
void
*
args
)
{
{
ETH_PRINTF
(
"rt_imxrt_eth_control...
\n
"
);
dbg_log
(
DBG_LOG
,
"rt_imxrt_eth_control...
\n
"
);
switch
(
cmd
)
switch
(
cmd
)
{
{
case
NIOCTL_GADDR
:
case
NIOCTL_GADDR
:
...
@@ -468,7 +479,7 @@ rt_err_t rt_imxrt_eth_tx( rt_device_t dev, struct pbuf* p)
...
@@ -468,7 +479,7 @@ rt_err_t rt_imxrt_eth_tx( rt_device_t dev, struct pbuf* p)
RT_ASSERT
(
p
!=
NULL
);
RT_ASSERT
(
p
!=
NULL
);
RT_ASSERT
(
enet_handle
!=
RT_NULL
);
RT_ASSERT
(
enet_handle
!=
RT_NULL
);
ETH_PRINTF
(
"rt_imxrt_eth_tx: %d
\n
"
,
p
->
len
);
dbg_log
(
DBG_LOG
,
"rt_imxrt_eth_tx: %d
\n
"
,
p
->
len
);
#ifdef ETH_TX_DUMP
#ifdef ETH_TX_DUMP
{
{
...
@@ -477,11 +488,11 @@ rt_err_t rt_imxrt_eth_tx( rt_device_t dev, struct pbuf* p)
...
@@ -477,11 +488,11 @@ rt_err_t rt_imxrt_eth_tx( rt_device_t dev, struct pbuf* p)
buf
=
(
uint8_t
*
)
p
->
payload
;
buf
=
(
uint8_t
*
)
p
->
payload
;
for
(
i
=
0
;
i
<
p
->
len
;
i
++
)
for
(
i
=
0
;
i
<
p
->
len
;
i
++
)
{
{
ETH_PRINTF
(
"%02X "
,
buf
[
i
]);
dbg_log
(
DBG_LOG
,
"%02X "
,
buf
[
i
]);
if
(
i
%
16
==
15
)
if
(
i
%
16
==
15
)
ETH_PRINTF
(
"
\n
"
);
dbg_log
(
DBG_LOG
,
"
\n
"
);
}
}
ETH_PRINTF
(
"
\n
"
);
dbg_log
(
DBG_LOG
,
"
\n
"
);
}
}
#endif
#endif
...
@@ -532,28 +543,28 @@ struct pbuf *rt_imxrt_eth_rx(rt_device_t dev)
...
@@ -532,28 +543,28 @@ struct pbuf *rt_imxrt_eth_rx(rt_device_t dev)
buf
=
(
uint8_t
*
)
p
->
payload
;
buf
=
(
uint8_t
*
)
p
->
payload
;
for
(
i
=
0
;
i
<
p
->
len
;
i
++
)
for
(
i
=
0
;
i
<
p
->
len
;
i
++
)
{
{
ETH_PRINTF
(
"%02X "
,
buf
[
i
]);
dbg_log
(
DBG_LOG
,
"%02X "
,
buf
[
i
]);
if
(
i
%
16
==
15
)
if
(
i
%
16
==
15
)
ETH_PRINTF
(
"
\n
"
);
dbg_log
(
DBG_LOG
,
"
\n
"
);
}
}
ETH_PRINTF
(
"
\n
"
);
dbg_log
(
DBG_LOG
,
"
\n
"
);
#endif
#endif
return
p
;
return
p
;
}
}
else
else
{
{
ETH_PRINTF
(
" A frame read failed
\n
"
);
dbg_log
(
DBG_LOG
,
" A frame read failed
\n
"
);
pbuf_free
(
p
);
pbuf_free
(
p
);
}
}
}
}
else
else
{
{
ETH_PRINTF
(
" pbuf_alloc faild
\n
"
);
dbg_log
(
DBG_LOG
,
" pbuf_alloc faild
\n
"
);
}
}
}
}
else
if
(
status
==
kStatus_ENET_RxFrameError
)
else
if
(
status
==
kStatus_ENET_RxFrameError
)
{
{
ETH_PRINTF
(
"ENET_GetRxFrameSize: kStatus_ENET_RxFrameError
\n
"
);
dbg_log
(
DBG_WARNING
,
"ENET_GetRxFrameSize: kStatus_ENET_RxFrameError
\n
"
);
/* Update the received buffer when error happened. */
/* Update the received buffer when error happened. */
/* Get the error information of the received g_frame. */
/* Get the error information of the received g_frame. */
ENET_GetRxErrBeforeReadFrame
(
enet_handle
,
error_statistic
);
ENET_GetRxErrBeforeReadFrame
(
enet_handle
,
error_statistic
);
...
@@ -591,20 +602,20 @@ static int rt_hw_imxrt_eth_init(void)
...
@@ -591,20 +602,20 @@ static int rt_hw_imxrt_eth_init(void)
imxrt_eth_device
.
parent
.
eth_rx
=
rt_imxrt_eth_rx
;
imxrt_eth_device
.
parent
.
eth_rx
=
rt_imxrt_eth_rx
;
imxrt_eth_device
.
parent
.
eth_tx
=
rt_imxrt_eth_tx
;
imxrt_eth_device
.
parent
.
eth_tx
=
rt_imxrt_eth_tx
;
ETH_PRINTF
(
"sem init: tx_wait
\r\n
"
);
dbg_log
(
DBG_LOG
,
"sem init: tx_wait
\r\n
"
);
/* init tx semaphore */
/* init tx semaphore */
rt_sem_init
(
&
imxrt_eth_device
.
tx_wait
,
"tx_wait"
,
0
,
RT_IPC_FLAG_FIFO
);
rt_sem_init
(
&
imxrt_eth_device
.
tx_wait
,
"tx_wait"
,
0
,
RT_IPC_FLAG_FIFO
);
/* register eth device */
/* register eth device */
ETH_PRINTF
(
"eth_device_init start
\r\n
"
);
dbg_log
(
DBG_LOG
,
"eth_device_init start
\r\n
"
);
state
=
eth_device_init
(
&
(
imxrt_eth_device
.
parent
),
"e0"
);
state
=
eth_device_init
(
&
(
imxrt_eth_device
.
parent
),
"e0"
);
if
(
RT_EOK
==
state
)
if
(
RT_EOK
==
state
)
{
{
ETH_PRINTF
(
"eth_device_init success
\r\n
"
);
dbg_log
(
DBG_LOG
,
"eth_device_init success
\r\n
"
);
}
}
else
else
{
{
ETH_PRINTF
(
"eth_device_init faild: %d
\r\n
"
,
state
);
dbg_log
(
DBG_LOG
,
"eth_device_init faild: %d
\r\n
"
,
state
);
}
}
return
state
;
return
state
;
}
}
...
...
bsp/imxrt1052-evk/drivers/fsl_phy.c
浏览文件 @
5fd89e44
...
@@ -29,12 +29,13 @@
...
@@ -29,12 +29,13 @@
*/
*/
#include "fsl_phy.h"
#include "fsl_phy.h"
#include <rtthread.h>
/*******************************************************************************
/*******************************************************************************
* Definitions
* Definitions
******************************************************************************/
******************************************************************************/
/*! @brief Defines the timeout macro. */
/*! @brief Defines the timeout macro. */
#define PHY_TIMEOUT_COUNT 0x
3FF
FFFFU
#define PHY_TIMEOUT_COUNT 0xFFFFU
/*******************************************************************************
/*******************************************************************************
* Prototypes
* Prototypes
...
@@ -90,7 +91,7 @@ status_t PHY_Init(ENET_Type *base, uint32_t phyAddr, uint32_t srcClock_Hz)
...
@@ -90,7 +91,7 @@ status_t PHY_Init(ENET_Type *base, uint32_t phyAddr, uint32_t srcClock_Hz)
}
}
/* Reset PHY. */
/* Reset PHY. */
counter
=
PHY_TIMEOUT_COUNT
;
counter
=
6
;
result
=
PHY_Write
(
base
,
phyAddr
,
PHY_BASICCONTROL_REG
,
PHY_BCTL_RESET_MASK
);
result
=
PHY_Write
(
base
,
phyAddr
,
PHY_BASICCONTROL_REG
,
PHY_BCTL_RESET_MASK
);
if
(
result
==
kStatus_Success
)
if
(
result
==
kStatus_Success
)
{
{
...
@@ -137,6 +138,9 @@ status_t PHY_Init(ENET_Type *base, uint32_t phyAddr, uint32_t srcClock_Hz)
...
@@ -137,6 +138,9 @@ status_t PHY_Init(ENET_Type *base, uint32_t phyAddr, uint32_t srcClock_Hz)
}
}
}
}
rt_kprintf
(
"[PHY] wait autonegotiation complete...
\n
"
);
rt_thread_delay
(
RT_TICK_PER_SECOND
);
if
(
!
counter
)
if
(
!
counter
)
{
{
return
kStatus_PHY_AutoNegotiateFail
;
return
kStatus_PHY_AutoNegotiateFail
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录