ryancw пре 2 година
родитељ
комит
7f863a1975

+ 63 - 40
W5500Client/RyanW5500.c

@@ -26,7 +26,7 @@ void RyanW5500NetDevInfoUpdate(struct netdev *netdev)
     netdev_low_level_set_dns_server(netdev, 0, (const ip_addr_t *)&netinfo.dns); // 设置网络接口设备DNS服务器地址
     memcpy(netdev->hwaddr, (const void *)&netinfo.mac, netdev->hwaddr_len);      // 设置mac地址
 
-    netdev_low_level_set_dhcp_status(netdev, (NETINFO_DHCP == gWIZNETINFO.dhcp) ? RT_TRUE : RT_FALSE);
+    // netdev_low_level_set_dhcp_status(netdev, (NETINFO_DHCP == gWIZNETINFO.dhcp) ? RT_TRUE : RT_FALSE);
 
     ctlwizchip(CW_GET_PHYLINK, &linkState);
     netdev_low_level_set_link_status(netdev, (PHY_LINK_ON == linkState) ? RT_TRUE : RT_FALSE);
@@ -42,60 +42,81 @@ int RyanW5500NetWorkInit(struct netdev *netdev)
 {
 
     uint8_t MaintainFlag = 0; // dhcp续租标志
+    uint8_t linkState = 0;
 
-    // nedev用户手动设置了ip / gw / mask / dnsService
-    if (RyanW5500Entry.netDevFlag & netDevSetDevInfo)
+    if (0 != RyanW5500Entry.netDevFlag)
     {
-        RyanW5500Entry.netDevFlag &= ~netDevSetDevInfo;
-        for (uint8_t socket = 0; socket < RyanW5500MaxSocketNum; socket++)
-            wiz_closesocket(socket);
+        // nedev用户手动设置了ip / gw / mask / dnsService
+        if (RyanW5500Entry.netDevFlag & netDevSetDevInfo)
+        {
+            RyanW5500Entry.netDevFlag &= ~netDevSetDevInfo;
+            for (uint8_t socket = 0; socket < RyanW5500MaxSocketNum; socket++)
+                wiz_closesocket(socket);
+        }
 
-        goto next;
-    }
+        // nedev用户使能了dhcp
+        if (RyanW5500Entry.netDevFlag & netDevDHCPEnable)
+        {
+            RyanW5500Entry.netDevFlag &= ~netDevDHCPEnable;
 
-    // nedev用户使能了dhcp
-    if (RyanW5500Entry.netDevFlag & netDevDHCP)
-    {
-        RyanW5500Entry.netDevFlag &= ~netDevDHCP;
-        for (uint8_t socket = 0; socket < RyanW5500MaxSocketNum; socket++)
-            wiz_closesocket(socket);
+            MaintainFlag = 0;
+            gWIZNETINFO.dhcp = NETINFO_DHCP;
 
-        MaintainFlag = 0;
-        goto next;
-    }
+            // 模式不一样,关闭所有socket
+            if (gWIZNETINFO.dhcp != NETINFO_DHCP)
+            {
+                for (uint8_t socket = 0; socket < RyanW5500MaxSocketNum; socket++)
+                    wiz_closesocket(socket);
+            }
+        }
 
-    // dhcp租期判断
-    if (NETINFO_DHCP == gWIZNETINFO.dhcp)
-    {
-        if (getDHCPRemainLeaseTime() < 10 * 1000) // 如果租期只剩余10秒,重新获取ip
+        // nedev用户失能了dhcp
+        if (RyanW5500Entry.netDevFlag & netDevDHCPDisable)
         {
-            rlog_i("dhcp租期接近超时, 重新获取ip");
+            RyanW5500Entry.netDevFlag &= ~netDevDHCPDisable;
+
             MaintainFlag = 0;
-            goto next;
+            gWIZNETINFO.dhcp = NETINFO_STATIC;
+
+            // ip可能不一样,直接关闭所有socket
+            for (uint8_t socket = 0; socket < RyanW5500MaxSocketNum; socket++)
+                wiz_closesocket(socket);
         }
+    }
+    else
+    {
 
-        if (getDHCPRemainLeaseTime() < (getDHCPLeaseTime() / 2)) // 超过一半就开始续租
+        // dhcp租期判断
+        if (NETINFO_DHCP == gWIZNETINFO.dhcp)
         {
-            rlog_i("dhcp续租");
-            MaintainFlag = 1;
-            goto next;
+            if (getDHCPRemainLeaseTime() < 10 * 1000) // 如果租期只剩余10秒,重新获取ip
+            {
+                rlog_i("dhcp租期接近超时, 重新获取ip");
+                MaintainFlag = 0;
+                goto next;
+            }
+
+            if (getDHCPRemainLeaseTime() < (getDHCPLeaseTime() / 2)) // 超过一半就开始续租
+            {
+                rlog_i("dhcp续租");
+                MaintainFlag = 1;
+                goto next;
+            }
         }
-    }
 
-    uint8_t linkState = 0;
-    ctlwizchip(CW_GET_PHYLINK, &linkState);
-    if (PHY_LINK_ON == linkState && netdev_is_link_up(netdev)) // netdev状态和设备状态匹配,不进行下面操作
-        return 0;
+        ctlwizchip(CW_GET_PHYLINK, &linkState);
+        if (PHY_LINK_ON == linkState && netdev_is_link_up(netdev)) // netdev状态和设备状态匹配,不进行下面操作
+            return 0;
 
-    if (PHY_LINK_ON == linkState) // w5500处于link状态,更新信息后就退出
-    {
-        rlog_d("link State: %d\r\n", linkState);
-        RyanW5500NetDevInfoUpdate(netdev);
-        return 0;
+        if (PHY_LINK_ON == linkState) // w5500处于link状态,更新信息后就退出
+        {
+            rlog_d("link State: %d\r\n", linkState);
+            RyanW5500NetDevInfoUpdate(netdev);
+            return 0;
+        }
     }
 
 next:
-    gWIZNETINFO.dhcp = netdev_is_dhcp_enabled(netdev) ? NETINFO_DHCP : NETINFO_STATIC;
     if (NETINFO_DHCP == gWIZNETINFO.dhcp)
     {
         if (0 == MaintainFlag)
@@ -260,11 +281,13 @@ int RyanW5500Init(wiz_NetInfo *netInfo)
     reg_wizchip_spiburst_cbfunc(RyanW5500ReadBurst, RyanW5500WriteBurst);   // 注册多个字节读写
 
     RyanW5500Entry.socketMutexHandle = rt_mutex_create("RyanW5500SocketMutex", RT_IPC_FLAG_FIFO);
+    RyanW5500Entry.dnsMutexHandle = rt_mutex_create("RyanW5500DnsMutex", RT_IPC_FLAG_FIFO);
     RyanW5500Entry.W5500EventHandle = rt_event_create("RyanW5500Event", RT_IPC_FLAG_PRIO);
     RyanW5500AttachIRQ(RyanW5500IRQCallback); // 绑定w5500中断回调函数
 
-    netdev = RyanW5500NetdevRegister("RyanW5500"); // W5500
-    netdev_low_level_set_status(netdev, RT_FALSE); // 设置网络接口设备状态
+    netdev = RyanW5500NetdevRegister("RyanW5500");                                                     // W5500
+    netdev_low_level_set_status(netdev, RT_FALSE);                                                     // 设置网络接口设备状态
+    netdev_low_level_set_dhcp_status(netdev, (NETINFO_DHCP == gWIZNETINFO.dhcp) ? RT_TRUE : RT_FALSE); // 同步dhcp状态
 
     RyanW5500Entry.w5500TaskHandle = rt_thread_create("RyanW5500",    // 线程name
                                                       wizIntDataTask, // 线程入口函数

+ 157 - 154
W5500Client/RyanW5500Socket.c

@@ -1,7 +1,7 @@
-#define rlogEnable 1               // 是否使能日志
-#define rlogColorEnable 1          // 是否使能日志颜色
-#define rlogLevel (rlogLvlWarning) // 日志打印等级
-#define rlogTag "W5500Socket"      // 日志tag
+#define rlogEnable 1             // 是否使能日志
+#define rlogColorEnable 1        // 是否使能日志颜色
+#define rlogLevel (rlogLvlDebug) // 日志打印等级
+#define rlogTag "W5500Socket"    // 日志tag
 
 #include "RyanW5500Store.h"
 
@@ -18,6 +18,140 @@
 static volatile RyanW5500Socket RyanW5500Sockets[RyanW5500MaxSocketNum] = {0};
 static volatile uint16_t wiz_port = 15500; // 用户可以自定义
 
+/**
+ * @brief
+ *
+ * @param s_addr
+ * @param ipStrArr
+ */
+static void inAddrToipStrArr(in_addr_t *s_addr, uint8_t *ipStrArr)
+{
+    RT_ASSERT(NULL != s_addr);
+    RT_ASSERT(NULL != ipStrArr);
+
+    // inet_pton(AF_INET, inet_ntoa(sin->sin_addr), &ipStrArr); // 效率有点低
+    uint8_t *p = (uint8_t *)s_addr;
+    ipStrArr[0] = *p;
+    ipStrArr[1] = *(p + 1);
+    ipStrArr[2] = *(p + 2);
+    ipStrArr[3] = *(p + 3);
+}
+
+/**
+ * @brief
+ *
+ * @param ipStrArr
+ * @return in_addr_t
+ */
+static in_addr_t ipStrArrToinAddr(uint8_t *ipStrArr)
+{
+    RT_ASSERT(NULL != ipStrArr);
+
+    // 效率有点低
+    // char remote_ipaddr[16] = {0};
+    // snprintf(remote_ipaddr, sizeof(remote_ipaddr), "%d.%d.%d.%d", ipStrArr[0], ipStrArr[1], ipStrArr[2], ipStrArr[3]);
+    // return inet_addr((const char *)remote_ipaddr);
+
+    in_addr_t p2 = 0;
+    uint8_t *p = (uint8_t *)&p2;
+    *p = ipStrArr[0];
+    *(p + 1) = ipStrArr[1];
+    *(p + 2) = ipStrArr[2];
+    *(p + 3) = ipStrArr[3];
+    return p2;
+}
+
+/**
+ * @brief 新的listen客户端连接
+ *
+ * @param serviceSock
+ * @param clientSock
+ */
+static void RyanW5500DoEventChanges(RyanW5500Socket *sock, RyanW5500Event_e event, rt_bool_t is_plus)
+{
+
+    RT_ASSERT(NULL != sock);
+
+    switch (event)
+    {
+    case WIZ_EVENT_SEND:
+    {
+        if (is_plus)
+        {
+            sock->sendevent = 1;
+
+#ifdef SAL_USING_POSIX
+            rt_wqueue_wakeup(&sock->wait_head, (void *)POLLOUT);
+#endif
+        }
+        else if (sock->sendevent)
+        {
+            sock->sendevent = 0;
+        }
+        break;
+    }
+    case WIZ_EVENT_RECV:
+    {
+        if (is_plus)
+        {
+            sock->rcvevent++;
+
+#ifdef SAL_USING_POSIX
+            rt_wqueue_wakeup(&sock->wait_head, (void *)POLLIN);
+#endif
+        }
+        else if (sock->rcvevent)
+        {
+            sock->rcvevent--;
+        }
+        break;
+    }
+    case WIZ_EVENT_ERROR:
+    {
+        if (is_plus)
+        {
+            sock->errevent++;
+
+#ifdef SAL_USING_POSIX
+            rt_wqueue_wakeup(&sock->wait_head, (void *)POLLERR);
+#endif
+        }
+        else if (sock->errevent)
+        {
+            sock->errevent--;
+        }
+        break;
+    }
+
+    default:
+        rlog_e("Not supported event (%d)", event);
+    }
+}
+
+static void wiz_do_event_clean(RyanW5500Socket *sock, RyanW5500Event_e event)
+{
+    switch (event)
+    {
+    case WIZ_EVENT_SEND:
+    {
+        sock->sendevent = 0;
+        break;
+    }
+    case WIZ_EVENT_RECV:
+    {
+        sock->rcvevent = 0;
+        break;
+    }
+    case WIZ_EVENT_ERROR:
+    {
+        sock->errevent = 0;
+        break;
+    }
+    default:
+        rlog_e("Not supported event (%d)", event);
+    }
+}
+
 /**
  * @brief 中断接收到数据回调函数
  *
@@ -60,49 +194,6 @@ int RyanW5500CloseCallback(int socket)
     return 0;
 }
 
-/**
- * @brief
- *
- * @param s_addr
- * @param ipStrArr
- */
-void inAddrToipStrArr(in_addr_t *s_addr, uint8_t *ipStrArr)
-{
-    RT_ASSERT(NULL != s_addr);
-    RT_ASSERT(NULL != ipStrArr);
-
-    // inet_pton(AF_INET, inet_ntoa(sin->sin_addr), &ipStrArr); // 效率有点低
-    uint8_t *p = (uint8_t *)s_addr;
-    ipStrArr[0] = *p;
-    ipStrArr[1] = *(p + 1);
-    ipStrArr[2] = *(p + 2);
-    ipStrArr[3] = *(p + 3);
-}
-
-/**
- * @brief
- *
- * @param ipStrArr
- * @return in_addr_t
- */
-in_addr_t ipStrArrToinAddr(uint8_t *ipStrArr)
-{
-    RT_ASSERT(NULL != ipStrArr);
-
-    // 效率有点低
-    // char remote_ipaddr[16] = {0};
-    // snprintf(remote_ipaddr, sizeof(remote_ipaddr), "%d.%d.%d.%d", ipStrArr[0], ipStrArr[1], ipStrArr[2], ipStrArr[3]);
-    // return inet_addr((const char *)remote_ipaddr);
-
-    in_addr_t p2 = 0;
-    uint8_t *p = (uint8_t *)&p2;
-    *p = ipStrArr[0];
-    *(p + 1) = ipStrArr[1];
-    *(p + 2) = ipStrArr[2];
-    *(p + 3) = ipStrArr[3];
-    return p2;
-}
-
 /**
  * @brief 根据socket获取RyanW5500Socket结构体
  *
@@ -133,7 +224,7 @@ RyanW5500Socket *RyanW5500GetSock(int socket)
  * @param serviceSock
  * @return RyanW5500Socket*
  */
-RyanW5500Socket *RyanW5500CreateListenClient(RyanW5500Socket *serviceSock)
+static RyanW5500Socket *RyanW5500CreateListenClient(RyanW5500Socket *serviceSock)
 {
     RT_ASSERT(NULL != serviceSock);
 
@@ -188,6 +279,7 @@ static void RyanW5500ListenSocketDestory(RyanW5500Socket *sock)
             continue;
 
         RyanListDel(&clientInfo->list);
+        wiz_closesocket(clientInfo->sock->socket);
 
         // // 增加listen客户端数
         // if (0 == serviceSock->serviceInfo->backlog)
@@ -212,12 +304,12 @@ static int RyanW5500SocketDestory(RyanW5500Socket *sock)
 
     RT_ASSERT(NULL != sock);
 
-    rt_mutex_take(RyanW5500Entry.socketMutexHandle, RT_WAITING_FOREVER); //
-    rlog_i("销毁套接字");
-
     if (sock->magic != WIZ_SOCKET_MAGIC)
         goto next;
 
+    rlog_d("销毁套接字");
+    rt_mutex_take(RyanW5500Entry.socketMutexHandle, RT_WAITING_FOREVER); //
+
     if (sock->recvLock)
         rt_mutex_delete(sock->recvLock);
 
@@ -376,97 +468,6 @@ __exit:
     RyanW5500DoEventChanges(serviceSock, WIZ_EVENT_ERROR, RT_TRUE);
 }
 
-/**
- * @brief 新的listen客户端连接
- *
- * @param serviceSock
- * @param clientSock
- */
-void RyanW5500DoEventChanges(RyanW5500Socket *sock, RyanW5500Event_e event, rt_bool_t is_plus)
-{
-
-    RT_ASSERT(NULL != sock);
-
-    switch (event)
-    {
-    case WIZ_EVENT_SEND:
-    {
-        if (is_plus)
-        {
-            sock->sendevent = 1;
-
-#ifdef SAL_USING_POSIX
-            rt_wqueue_wakeup(&sock->wait_head, (void *)POLLOUT);
-#endif
-        }
-        else if (sock->sendevent)
-        {
-            sock->sendevent = 0;
-        }
-        break;
-    }
-    case WIZ_EVENT_RECV:
-    {
-        if (is_plus)
-        {
-            sock->rcvevent++;
-
-#ifdef SAL_USING_POSIX
-            rt_wqueue_wakeup(&sock->wait_head, (void *)POLLIN);
-#endif
-        }
-        else if (sock->rcvevent)
-        {
-            sock->rcvevent--;
-        }
-        break;
-    }
-    case WIZ_EVENT_ERROR:
-    {
-        if (is_plus)
-        {
-            sock->errevent++;
-
-#ifdef SAL_USING_POSIX
-            rt_wqueue_wakeup(&sock->wait_head, (void *)POLLERR);
-#endif
-        }
-        else if (sock->errevent)
-        {
-            sock->errevent--;
-        }
-        break;
-    }
-
-    default:
-        rlog_e("Not supported event (%d)", event);
-    }
-}
-
-static void wiz_do_event_clean(RyanW5500Socket *sock, RyanW5500Event_e event)
-{
-    switch (event)
-    {
-    case WIZ_EVENT_SEND:
-    {
-        sock->sendevent = 0;
-        break;
-    }
-    case WIZ_EVENT_RECV:
-    {
-        sock->rcvevent = 0;
-        break;
-    }
-    case WIZ_EVENT_ERROR:
-    {
-        sock->errevent = 0;
-        break;
-    }
-    default:
-        rlog_e("Not supported event (%d)", event);
-    }
-}
-
 /**
  * @brief 创建套接字
  *
@@ -526,16 +527,17 @@ int wiz_bind(int socket, const struct sockaddr *name, socklen_t namelen)
 
     sock = RyanW5500GetSock(socket);
     RyanW5500CheckCode(NULL != sock, EBADF, rlog_d, { return -1; });
+    RyanW5500CheckCode(WIZ_SOCKET_MAGIC == sock->magic, EIO, rlog_d, { return -1; });
 
     // PRASE IP 地址和端口
     const struct sockaddr_in *sin = (const struct sockaddr_in *)name;
     port = (uint16_t)htons(sin->sin_port);
 
-    if (sock->port == port)
+    if (sock->port == port) // 相等,不需要重新进行绑定
         return 0;
 
 #ifdef SAL_USING_POSIX
-    rt_wqueue_init(&sock->wait_head);
+    rt_wqueue_init(&sock->wait_head); // 重置一下wqueue
 #endif
 
     sock->port = port;
@@ -749,6 +751,7 @@ int wiz_sendto(int socket, const void *data, size_t size, int flags, const struc
     sock = RyanW5500GetSock(socket);
     RyanW5500CheckCode(NULL != sock, EBADF, rlog_d, { return -1; });
     RyanW5500CheckCode(WIZ_SOCKET_MAGIC == sock->magic, EIO, rlog_d, { return -1; });
+    RyanW5500CheckCode(RyanW5500SocketEstablished == sock->state, EIO, rlog_d, { return -1; });
 
     switch (sock->type)
     {
@@ -862,6 +865,9 @@ again:
     {
     case Sn_MR_TCP:
     {
+        socketState = getSn_SR(socket);
+        RyanW5500CheckCode(SOCK_ESTABLISHED == socketState, ENOTCONN, rlog_d, { result = -1; goto __exit; }); // 在未连接的连接模式套接字上尝试接收。
+
         // 先读取之前存在的数据
         recvLen = getSn_RX_RSR(socket);
         if (recvLen > 0)
@@ -873,9 +879,6 @@ again:
                 goto __exit;
         }
 
-        socketState = getSn_SR(socket);
-        RyanW5500CheckCode(SOCK_ESTABLISHED == socketState, ENOTCONN, rlog_d, { result = -1; goto __exit; }); // 在未连接的连接模式套接字上尝试接收。
-
         result = rt_event_recv(RyanW5500Entry.W5500EventHandle, (1 << sock->socket),
                                RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR,
                                timeout, NULL);
@@ -923,9 +926,9 @@ again:
         if (recvLen > len)
             recvLen = len;
 
-        rt_mutex_take(sock->recvLock, RT_WAITING_FOREVER);
+        // rt_mutex_take(sock->recvLock, RT_WAITING_FOREVER);
         recvLen = wizchip_recvfrom(socket, mem, recvLen, remoteIp, &remotePort);
-        rt_mutex_release(sock->recvLock);
+        // rt_mutex_release(sock->recvLock);
         if (recvLen < 0)
         {
             RyanW5500CheckCode(SOCKERR_SOCKCLOSED == recvLen, ECONNRESET, rlog_d, { result = 0; goto __exit; }); // 套接字被关闭
@@ -1348,7 +1351,7 @@ int wiz_getsockopt(int socket, int level, int optname, void *optval, socklen_t *
     return 0;
 }
 
-int RyanW5500_gethostbyname(const char *name, ip_addr_t *addr)
+static int RyanW5500_gethostbyname(const char *name, ip_addr_t *addr)
 {
 
     int idx = 0;
@@ -1372,9 +1375,9 @@ int RyanW5500_gethostbyname(const char *name, ip_addr_t *addr)
         // rlog_w("开始获取dns");
 
         // DNS客户端处理
-        rt_mutex_take(RyanW5500Entry.socketMutexHandle, RT_WAITING_FOREVER); // 获取互斥锁
+        rt_mutex_take(RyanW5500Entry.dnsMutexHandle, RT_WAITING_FOREVER); // 获取互斥锁
         ret = DNS_run(gWIZNETINFO.dns, (uint8_t *)name, remote_ip, data_buffer);
-        rt_mutex_release(RyanW5500Entry.socketMutexHandle); // 释放互斥锁
+        rt_mutex_release(RyanW5500Entry.dnsMutexHandle); // 释放互斥锁
         if (1 != ret)
         {
             if (-1 == ret)
@@ -1445,8 +1448,8 @@ struct hostent *wiz_gethostbyname(const char *name)
     s_hostent_addr = addr;
     s_phostent_addr[0] = &s_hostent_addr;
     s_phostent_addr[1] = NULL;
-    strncpy(s_hostname, name, DNS_MAX_NAME_LENGTH);
-    s_hostname[DNS_MAX_NAME_LENGTH] = 0;
+    strncpy(s_hostname, name, strlen(name));
+    s_hostname[strlen(name)] = 0;
     s_aliases = NULL;
 
     s_hostent.h_name = s_hostname;

+ 0 - 2
W5500Client/RyanW5500Socket.h

@@ -92,8 +92,6 @@ extern "C"
     extern int RyanW5500RecvDataCallback(int socket);
     extern int RyanW5500CloseCallback(int socket);
 
-    extern void RyanW5500DoEventChanges(RyanW5500Socket *sock, RyanW5500Event_e event, rt_bool_t is_plus);
-
 #ifdef __cplusplus
 }
 #endif

+ 4 - 2
W5500Client/RyanW5500Store.h

@@ -62,8 +62,9 @@ extern "C"
 #endif
 
 #define RyanW5500MaxSocketNum (_WIZCHIP_SOCK_NUM_)
-#define netDevDHCP (1 << 2)
-#define netDevSetDevInfo (1 << 3)
+#define netDevDHCPEnable (1 << 2)
+#define netDevDHCPDisable (1 << 3)
+#define netDevSetDevInfo (1 << 4)
 
 // event标志
 // 前8bit用于socket通道数据解析
@@ -96,6 +97,7 @@ extern "C"
         uint32_t netDevFlag;          // netdev用flag
         rt_event_t W5500EventHandle;  // 事件标志组,用于中断通知和socket状态通知
         rt_mutex_t socketMutexHandle; // socket锁
+        rt_mutex_t dnsMutexHandle;    // dns解析锁
         rt_thread_t w5500TaskHandle;  // W5500线程
     } RyanW5500Entry_t;
 

+ 10 - 2
W5500Client/RyanW5500netDev.c

@@ -84,10 +84,18 @@ static int RyanW5500NetdevSetDnsServer(struct netdev *netdev, uint8_t dns_num, i
 static int RyanW5500NetdevSetDhcp(struct netdev *netdev, rt_bool_t is_enabled)
 {
 
-    RyanW5500Entry.netDevFlag |= netDevDHCP;
+    if (is_enabled)
+    {
+        RyanW5500Entry.netDevFlag |= netDevDHCPEnable;
+        RyanW5500Entry.netDevFlag &= ~netDevDHCPDisable;
+    }
+    else
+    {
+        RyanW5500Entry.netDevFlag |= netDevDHCPDisable;
+        RyanW5500Entry.netDevFlag &= ~netDevDHCPEnable;
+    }
 
     netdev_low_level_set_dhcp_status(netdev, is_enabled);
-    netdev_low_level_set_link_status(netdev, RT_FALSE);
     return RT_EOK;
 }