rndis.c 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376
  1. /*
  2. * File : rndis.c
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2006-2013, RT-Thread Development Team
  5. *
  6. * The license and distribution terms for this file may be
  7. * found in the file LICENSE in this distribution or at
  8. * http://www.rt-thread.org/license/LICENSE
  9. *
  10. * Change Logs:
  11. * Date Author Notes
  12. * 2012-12-24 heyuanjie87 first version
  13. * 2013-04-13 aozima update ethernet driver.
  14. * 2013-04-26 aozima align the desc to 4byte.
  15. * 2013-05-08 aozima pad a dummy when send MAX_PKT_SIZE.
  16. * 2013-05-09 aozima add delay linkup feature.
  17. * 2013-07-09 aozima support respone chain list.
  18. * 2013-07-18 aozima re-initial respone chain list when RNDIS restart.
  19. * 2017-11-25 ZYH fix it and add OS descriptor
  20. */
  21. #include <rtdevice.h>
  22. #include "cdc.h"
  23. #include "rndis.h"
  24. #include "ndis.h"
  25. //#define RNDIS_DEBUG
  26. //#define RNDIS_DELAY_LINK_UP
  27. #ifdef RNDIS_DEBUG
  28. #define RNDIS_PRINTF rt_kprintf("[RNDIS] "); rt_kprintf
  29. #else
  30. #define RNDIS_PRINTF(...)
  31. #endif /* RNDIS_DEBUG */
  32. /* RT-Thread LWIP ethernet interface */
  33. #include <netif/ethernetif.h>
  34. struct rt_rndis_response
  35. {
  36. struct rt_list_node list;
  37. const void * buffer;
  38. };
  39. #define MAX_ADDR_LEN 6
  40. struct rt_rndis_eth
  41. {
  42. /* inherit from ethernet device */
  43. struct eth_device parent;
  44. struct ufunction *func;
  45. /* interface address info */
  46. rt_uint8_t host_addr[MAX_ADDR_LEN];
  47. rt_uint8_t dev_addr[MAX_ADDR_LEN];
  48. #ifdef RNDIS_DELAY_LINK_UP
  49. struct rt_timer timer;
  50. #endif /* RNDIS_DELAY_LINK_UP */
  51. ALIGN(4)
  52. rt_uint8_t rx_pool[512];
  53. ALIGN(4)
  54. rt_uint8_t tx_pool[512];
  55. rt_uint32_t cmd_pool[2];
  56. ALIGN(4)
  57. char rx_buffer[sizeof(struct rndis_packet_msg) + USB_ETH_MTU + 14];
  58. rt_size_t rx_offset;
  59. rt_size_t rx_length;
  60. rt_bool_t rx_flag;
  61. rt_bool_t rx_frist;
  62. ALIGN(4)
  63. char tx_buffer[sizeof(struct rndis_packet_msg) + USB_ETH_MTU + 14];
  64. struct rt_semaphore tx_buffer_free;
  65. struct rt_list_node response_list;
  66. rt_bool_t need_notify;
  67. struct cdc_eps eps;
  68. };
  69. typedef struct rt_rndis_eth * rt_rndis_eth_t;
  70. static rt_uint32_t oid_packet_filter = 0x0000000;
  71. ALIGN(4)
  72. static struct udevice_descriptor _dev_desc =
  73. {
  74. USB_DESC_LENGTH_DEVICE, /* bLength */
  75. USB_DESC_TYPE_DEVICE, /* type */
  76. USB_BCD_VERSION, /* bcdUSB */
  77. 0xEF, /* bDeviceClass */
  78. 0x04, /* bDeviceSubClass */
  79. 0x01, /* bDeviceProtocol */
  80. USB_CDC_BUFSIZE, /* bMaxPacketSize0 */
  81. _VENDOR_ID, /* idVendor */
  82. _PRODUCT_ID, /* idProduct */
  83. USB_BCD_DEVICE, /* bcdDevice */
  84. USB_STRING_MANU_INDEX, /* iManufacturer */
  85. USB_STRING_PRODUCT_INDEX, /* iProduct */
  86. USB_STRING_SERIAL_INDEX, /* iSerialNumber */
  87. USB_DYNAMIC /* bNumConfigurations */
  88. };
  89. /* communcation interface descriptor */
  90. ALIGN(4)
  91. const static struct ucdc_comm_descriptor _comm_desc =
  92. {
  93. #ifdef RT_USB_DEVICE_COMPOSITE
  94. /* Interface Association Descriptor */
  95. {
  96. USB_DESC_LENGTH_IAD,
  97. USB_DESC_TYPE_IAD,
  98. USB_DYNAMIC,
  99. 0x02,
  100. USB_CDC_CLASS_COMM,
  101. USB_CDC_SUBCLASS_ACM,
  102. USB_CDC_PROTOCOL_VENDOR,
  103. 0x00,
  104. },
  105. #endif
  106. /* Interface Descriptor */
  107. {
  108. USB_DESC_LENGTH_INTERFACE,
  109. USB_DESC_TYPE_INTERFACE,
  110. USB_DYNAMIC,
  111. 0x00,
  112. 0x01,
  113. USB_CDC_CLASS_COMM,
  114. USB_CDC_SUBCLASS_ACM,
  115. USB_CDC_PROTOCOL_VENDOR,
  116. 0x00,
  117. },
  118. /* Header Functional Descriptor */
  119. {
  120. 0x05,
  121. USB_CDC_CS_INTERFACE,
  122. USB_CDC_SCS_HEADER,
  123. 0x0110,
  124. },
  125. /* Call Management Functional Descriptor */
  126. {
  127. 0x05,
  128. USB_CDC_CS_INTERFACE,
  129. USB_CDC_SCS_CALL_MGMT,
  130. 0x00,
  131. USB_DYNAMIC,
  132. },
  133. /* Abstract Control Management Functional Descriptor */
  134. {
  135. 0x04,
  136. USB_CDC_CS_INTERFACE,
  137. USB_CDC_SCS_ACM,
  138. 0x02,
  139. },
  140. /* Union Functional Descriptor */
  141. {
  142. 0x05,
  143. USB_CDC_CS_INTERFACE,
  144. USB_CDC_SCS_UNION,
  145. USB_DYNAMIC,
  146. USB_DYNAMIC,
  147. },
  148. /* Endpoint Descriptor */
  149. {
  150. USB_DESC_LENGTH_ENDPOINT,
  151. USB_DESC_TYPE_ENDPOINT,
  152. USB_DIR_IN | USB_DYNAMIC,
  153. USB_EP_ATTR_INT,
  154. 0x08,
  155. 0x0A,
  156. },
  157. };
  158. /* data interface descriptor */
  159. ALIGN(4)
  160. const static struct ucdc_data_descriptor _data_desc =
  161. {
  162. /* interface descriptor */
  163. {
  164. USB_DESC_LENGTH_INTERFACE,
  165. USB_DESC_TYPE_INTERFACE,
  166. USB_DYNAMIC,
  167. 0x00,
  168. 0x02,
  169. USB_CDC_CLASS_DATA,
  170. 0x00,
  171. 0x00,
  172. 0x00,
  173. },
  174. /* endpoint, bulk out */
  175. {
  176. USB_DESC_LENGTH_ENDPOINT,
  177. USB_DESC_TYPE_ENDPOINT,
  178. USB_DIR_OUT | USB_DYNAMIC,
  179. USB_EP_ATTR_BULK,
  180. USB_DYNAMIC,
  181. 0x00,
  182. },
  183. /* endpoint, bulk in */
  184. {
  185. USB_DESC_LENGTH_ENDPOINT,
  186. USB_DESC_TYPE_ENDPOINT,
  187. USB_DYNAMIC | USB_DIR_IN,
  188. USB_EP_ATTR_BULK,
  189. USB_DYNAMIC,
  190. 0x00,
  191. },
  192. };
  193. ALIGN(4)
  194. const static char* _ustring[] =
  195. {
  196. "Language", /* LANGID */
  197. "RT-Thread Team.", /* MANU */
  198. "RT-Thread RNDIS device", /* PRODUCT */
  199. "1.1.0", /* SERIAL */
  200. "Configuration", /* CONFIG */
  201. "Interface", /* INTERFACE */
  202. USB_STRING_OS
  203. };
  204. struct usb_os_function_comp_id_descriptor rndis_func_comp_id_desc =
  205. {
  206. .bFirstInterfaceNumber = USB_DYNAMIC,
  207. .reserved1 = 0x01,
  208. .compatibleID = {'R', 'N', 'D', 'I', 'S', 0x00, 0x00, 0x00},
  209. .subCompatibleID = {'5', '1', '6', '2', '0', '0', '1', 0x00},
  210. .reserved2 = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
  211. };
  212. //FS and HS needed
  213. static struct usb_qualifier_descriptor dev_qualifier =
  214. {
  215. sizeof(dev_qualifier), //bLength
  216. USB_DESC_TYPE_DEVICEQUALIFIER, //bDescriptorType
  217. 0x0200, //bcdUSB
  218. USB_CLASS_CDC, //bDeviceClass
  219. USB_CDC_SUBCLASS_ACM, //bDeviceSubClass
  220. USB_CDC_PROTOCOL_VENDOR, //bDeviceProtocol
  221. 64, //bMaxPacketSize0
  222. 0x01, //bNumConfigurations
  223. 0,
  224. };
  225. /* supported OIDs */
  226. ALIGN(4)
  227. const static rt_uint32_t oid_supported_list[] =
  228. {
  229. /* General OIDs */
  230. OID_GEN_SUPPORTED_LIST,
  231. OID_GEN_HARDWARE_STATUS,
  232. OID_GEN_MEDIA_SUPPORTED,
  233. OID_GEN_MEDIA_IN_USE,
  234. OID_GEN_MAXIMUM_FRAME_SIZE,
  235. OID_GEN_LINK_SPEED,
  236. OID_GEN_TRANSMIT_BLOCK_SIZE,
  237. OID_GEN_RECEIVE_BLOCK_SIZE,
  238. OID_GEN_VENDOR_ID,
  239. OID_GEN_VENDOR_DESCRIPTION,
  240. OID_GEN_VENDOR_DRIVER_VERSION,
  241. OID_GEN_CURRENT_PACKET_FILTER,
  242. OID_GEN_MAXIMUM_TOTAL_SIZE,
  243. OID_GEN_MEDIA_CONNECT_STATUS,
  244. OID_GEN_PHYSICAL_MEDIUM,
  245. /* General Statistic OIDs */
  246. OID_GEN_XMIT_OK,
  247. OID_GEN_RCV_OK,
  248. OID_GEN_XMIT_ERROR,
  249. OID_GEN_RCV_ERROR,
  250. OID_GEN_RCV_NO_BUFFER,
  251. /* Please configure us */
  252. OID_GEN_RNDIS_CONFIG_PARAMETER,
  253. /* 802.3 OIDs */
  254. OID_802_3_PERMANENT_ADDRESS,
  255. OID_802_3_CURRENT_ADDRESS,
  256. OID_802_3_MULTICAST_LIST,
  257. OID_802_3_MAXIMUM_LIST_SIZE,
  258. /* 802.3 Statistic OIDs */
  259. OID_802_3_RCV_ERROR_ALIGNMENT,
  260. OID_802_3_XMIT_ONE_COLLISION,
  261. OID_802_3_XMIT_MORE_COLLISIONS,
  262. OID_802_3_MAC_OPTIONS,
  263. };
  264. static rt_uint8_t rndis_message_buffer[RNDIS_MESSAGE_BUFFER_SIZE];
  265. static void _rndis_response_available(ufunction_t func)
  266. {
  267. rt_rndis_eth_t device = (rt_rndis_eth_t)func->user_data;
  268. rt_uint32_t * data;
  269. if(device->need_notify == RT_TRUE)
  270. {
  271. device->need_notify = RT_FALSE;
  272. data = (rt_uint32_t *)device->eps.ep_cmd->buffer;
  273. data[0] = RESPONSE_AVAILABLE;
  274. data[1] = 0;
  275. device->eps.ep_cmd->request.buffer = device->eps.ep_cmd->buffer;
  276. device->eps.ep_cmd->request.size = 8;
  277. device->eps.ep_cmd->request.req_type = UIO_REQUEST_WRITE;
  278. rt_usbd_io_request(func->device, device->eps.ep_cmd, &device->eps.ep_cmd->request);
  279. }
  280. }
  281. static rt_err_t _rndis_init_response(ufunction_t func, rndis_init_msg_t msg)
  282. {
  283. rndis_init_cmplt_t resp;
  284. struct rt_rndis_response * response;
  285. response = rt_malloc(sizeof(struct rt_rndis_response));
  286. resp = rt_malloc(sizeof(struct rndis_init_cmplt));
  287. if( (response == RT_NULL) || (resp == RT_NULL) )
  288. {
  289. RNDIS_PRINTF("%d: no memory!\r\n", __LINE__);
  290. if(response != RT_NULL)
  291. rt_free(response);
  292. if(resp != RT_NULL)
  293. rt_free(resp);
  294. return -RT_ENOMEM;
  295. }
  296. resp->RequestId = msg->RequestId;
  297. resp->MessageType = REMOTE_NDIS_INITIALIZE_CMPLT;
  298. resp->MessageLength = sizeof(struct rndis_init_cmplt);
  299. resp->MajorVersion = RNDIS_MAJOR_VERSION;
  300. resp->MinorVersion = RNDIS_MAJOR_VERSION;
  301. resp->Status = RNDIS_STATUS_SUCCESS;
  302. resp->DeviceFlags = RNDIS_DF_CONNECTIONLESS;
  303. resp->Medium = RNDIS_MEDIUM_802_3;
  304. resp->MaxPacketsPerTransfer = 1;
  305. resp->MaxTransferSize = USB_ETH_MTU + 58; /* Space for 1280 IP buffer, Ethernet Header,
  306. RNDIS messages */
  307. resp->PacketAlignmentFactor = 3;
  308. resp->AfListOffset = 0;
  309. resp->AfListSize = 0;
  310. response->buffer = resp;
  311. {
  312. rt_base_t level = rt_hw_interrupt_disable();
  313. rt_list_insert_before(&((rt_rndis_eth_t)func->user_data)->response_list, &response->list);
  314. rt_hw_interrupt_enable(level);
  315. }
  316. return RT_EOK;
  317. }
  318. static rndis_query_cmplt_t _create_resp(rt_size_t size)
  319. {
  320. rndis_query_cmplt_t resp;
  321. resp = rt_malloc(sizeof(struct rndis_query_cmplt) + size);
  322. if(resp == RT_NULL)
  323. {
  324. RNDIS_PRINTF("%d: no memory!\r\n", __LINE__);
  325. return RT_NULL;
  326. }
  327. resp->InformationBufferLength = size;
  328. return resp;
  329. }
  330. static void _copy_resp(rndis_query_cmplt_t resp, const void * buffer)
  331. {
  332. char * resp_buffer = (char *)resp + sizeof(struct rndis_query_cmplt);
  333. memcpy(resp_buffer, buffer, resp->InformationBufferLength);
  334. }
  335. static void _set_resp(rndis_query_cmplt_t resp, rt_uint32_t value)
  336. {
  337. rt_uint32_t * response = (rt_uint32_t *)((char *)resp + sizeof(struct rndis_query_cmplt));
  338. *response = value;
  339. }
  340. static rt_err_t _rndis_query_response(ufunction_t func,rndis_query_msg_t msg)
  341. {
  342. rndis_query_cmplt_t resp = RT_NULL;
  343. struct rt_rndis_response * response;
  344. rt_err_t ret = RT_EOK;
  345. switch (msg->Oid)
  346. {
  347. /*
  348. * general OIDs
  349. */
  350. case OID_GEN_SUPPORTED_LIST:
  351. resp = _create_resp(sizeof(oid_supported_list));
  352. if(resp == RT_NULL) break;
  353. _copy_resp(resp, oid_supported_list);
  354. break;
  355. case OID_GEN_PHYSICAL_MEDIUM:
  356. resp = _create_resp(4);
  357. if(resp == RT_NULL) break;
  358. _set_resp(resp, NDIS_MEDIUM_802_3);
  359. break;
  360. case OID_GEN_MAXIMUM_FRAME_SIZE:
  361. case OID_GEN_TRANSMIT_BLOCK_SIZE:
  362. case OID_GEN_RECEIVE_BLOCK_SIZE:
  363. resp = _create_resp(4);
  364. if(resp == RT_NULL) break;
  365. _set_resp(resp, USB_ETH_MTU);
  366. break;
  367. case OID_GEN_MAXIMUM_TOTAL_SIZE:
  368. resp = _create_resp(4);
  369. if(resp == RT_NULL) break;
  370. _set_resp(resp, USB_ETH_MTU + RNDIS_MESSAGE_BUFFER_SIZE);
  371. break;
  372. case OID_GEN_LINK_SPEED:
  373. resp = _create_resp(4);
  374. if(resp == RT_NULL) break;
  375. _set_resp(resp, func->device->dcd->device_is_hs ? (480UL * 1000 *1000) : (12UL * 1000 * 1000) / 100);
  376. break;
  377. case OID_GEN_MEDIA_CONNECT_STATUS:
  378. /* link_status */
  379. resp = _create_resp(4);
  380. if(resp == RT_NULL) break;
  381. #ifdef RNDIS_DELAY_LINK_UP
  382. if(((rt_rndis_eth_t)func->user_data)->parent.link_status)
  383. {
  384. _set_resp(resp, NDIS_MEDIA_STATE_CONNECTED);
  385. }
  386. else
  387. {
  388. _set_resp(resp, NDIS_MEDIA_STATE_DISCONNECTED);
  389. }
  390. #else
  391. _set_resp(resp, NDIS_MEDIA_STATE_CONNECTED);
  392. #endif /* RNDIS_DELAY_LINK_UP */
  393. break;
  394. case OID_GEN_VENDOR_ID:
  395. resp = _create_resp(4);
  396. if(resp == RT_NULL) break;
  397. _set_resp(resp, 0x12345678); /* only for test */
  398. break;
  399. case OID_GEN_VENDOR_DESCRIPTION:
  400. {
  401. const char vendor_desc[] = "RT-Thread RNDIS";
  402. resp = _create_resp(sizeof(vendor_desc));
  403. if(resp == RT_NULL) break;
  404. _copy_resp(resp, vendor_desc);
  405. }
  406. break;
  407. case OID_GEN_VENDOR_DRIVER_VERSION:
  408. resp = _create_resp(4);
  409. if(resp == RT_NULL) break;
  410. _set_resp(resp, 0x0000200);
  411. break;
  412. /* statistics OIDs */
  413. case OID_GEN_XMIT_OK:
  414. case OID_GEN_RCV_OK:
  415. resp = _create_resp(4);
  416. if(resp == RT_NULL) break;
  417. _set_resp(resp, 1);
  418. break;
  419. case OID_GEN_XMIT_ERROR:
  420. case OID_GEN_RCV_ERROR:
  421. case OID_GEN_RCV_NO_BUFFER:
  422. resp = _create_resp(4);
  423. if(resp == RT_NULL) break;
  424. _set_resp(resp, 0);
  425. break;
  426. /*
  427. * ieee802.3 OIDs
  428. */
  429. case OID_802_3_MAXIMUM_LIST_SIZE:
  430. resp = _create_resp(4);
  431. if(resp == RT_NULL) break;
  432. _set_resp(resp, 1);
  433. break;
  434. case OID_802_3_PERMANENT_ADDRESS:
  435. case OID_802_3_CURRENT_ADDRESS:
  436. resp = _create_resp(sizeof(((rt_rndis_eth_t)func->user_data)->host_addr));
  437. if(resp == RT_NULL) break;
  438. _copy_resp(resp, ((rt_rndis_eth_t)func->user_data)->host_addr);
  439. break;
  440. case OID_802_3_MULTICAST_LIST:
  441. resp = _create_resp(4);
  442. if(resp == RT_NULL) break;
  443. _set_resp(resp, 0xE000000);
  444. break;
  445. case OID_802_3_MAC_OPTIONS:
  446. resp = _create_resp(4);
  447. if(resp == RT_NULL) break;
  448. _set_resp(resp, 0);
  449. break;
  450. default:
  451. RNDIS_PRINTF("OID %X\n", msg->Oid);
  452. ret = -RT_ERROR;
  453. break;
  454. }
  455. response = rt_malloc(sizeof(struct rt_rndis_response));
  456. if( (response == RT_NULL) || (resp == RT_NULL) )
  457. {
  458. RNDIS_PRINTF("%d: no memory!\r\n", __LINE__);
  459. if(response != RT_NULL)
  460. rt_free(response);
  461. if(resp != RT_NULL)
  462. rt_free(resp);
  463. return -RT_ENOMEM;
  464. }
  465. resp->RequestId = msg->RequestId;
  466. resp->MessageType = REMOTE_NDIS_QUERY_CMPLT;
  467. resp->InformationBufferOffset = 16;
  468. resp->Status = RNDIS_STATUS_SUCCESS;
  469. resp->MessageLength = sizeof(struct rndis_query_cmplt) + resp->InformationBufferLength;
  470. response->buffer = resp;
  471. {
  472. rt_base_t level = rt_hw_interrupt_disable();
  473. rt_list_insert_before(&((rt_rndis_eth_t)func->user_data)->response_list, &response->list);
  474. rt_hw_interrupt_enable(level);
  475. }
  476. return ret;
  477. }
  478. static rt_err_t _rndis_set_response(ufunction_t func,rndis_set_msg_t msg)
  479. {
  480. rndis_set_cmplt_t resp;
  481. struct rt_rndis_response * response;
  482. response = rt_malloc(sizeof(struct rt_rndis_response));
  483. resp = rt_malloc(sizeof(struct rndis_set_cmplt));
  484. if( (response == RT_NULL) || (resp == RT_NULL) )
  485. {
  486. RNDIS_PRINTF("%d: no memory!\r\n", __LINE__);
  487. if(response != RT_NULL)
  488. rt_free(response);
  489. if(resp != RT_NULL)
  490. rt_free(resp);
  491. return -RT_ENOMEM;
  492. }
  493. resp->RequestId = msg->RequestId;
  494. resp->MessageType = REMOTE_NDIS_SET_CMPLT;
  495. resp->MessageLength = sizeof(struct rndis_set_cmplt);
  496. switch (msg->Oid)
  497. {
  498. case OID_GEN_CURRENT_PACKET_FILTER:
  499. oid_packet_filter = *((rt_uint32_t *)((rt_uint8_t *)&(msg->RequestId) + \
  500. msg->InformationBufferOffset));
  501. oid_packet_filter = oid_packet_filter;
  502. RNDIS_PRINTF("OID_GEN_CURRENT_PACKET_FILTER\r\n");
  503. #ifdef RNDIS_DELAY_LINK_UP
  504. /* link up. */
  505. rt_timer_start(&((rt_rndis_eth_t)func->user_data)->timer);
  506. #else
  507. eth_device_linkchange(&((rt_rndis_eth_t)func->user_data)->parent, RT_TRUE);
  508. #endif /* RNDIS_DELAY_LINK_UP */
  509. break;
  510. case OID_802_3_MULTICAST_LIST:
  511. break;
  512. default:
  513. resp->Status = RNDIS_STATUS_FAILURE;
  514. return RT_EOK;
  515. }
  516. resp->Status = RNDIS_STATUS_SUCCESS;
  517. response->buffer = resp;
  518. {
  519. rt_base_t level = rt_hw_interrupt_disable();
  520. rt_list_insert_before(&((rt_rndis_eth_t)func->user_data)->response_list, &response->list);
  521. rt_hw_interrupt_enable(level);
  522. }
  523. return RT_EOK;
  524. }
  525. static rt_err_t _rndis_keepalive_response(ufunction_t func,rndis_keepalive_msg_t msg)
  526. {
  527. rndis_keepalive_cmplt_t resp;
  528. struct rt_rndis_response * response;
  529. response = rt_malloc(sizeof(struct rt_rndis_response));
  530. resp = rt_malloc(sizeof(struct rndis_keepalive_cmplt));
  531. if( (response == RT_NULL) || (resp == RT_NULL) )
  532. {
  533. RNDIS_PRINTF("%d: no memory!\r\n", __LINE__);
  534. if(response != RT_NULL)
  535. rt_free(response);
  536. if(resp != RT_NULL)
  537. rt_free(resp);
  538. return -RT_ENOMEM;
  539. }
  540. resp->MessageType = REMOTE_NDIS_KEEPALIVE_CMPLT;
  541. resp->MessageLength = sizeof(struct rndis_keepalive_cmplt);
  542. resp->Status = RNDIS_STATUS_SUCCESS;
  543. response->buffer = resp;
  544. {
  545. rt_base_t level = rt_hw_interrupt_disable();
  546. rt_list_insert_before(&((rt_rndis_eth_t)func->user_data)->response_list, &response->list);
  547. rt_hw_interrupt_enable(level);
  548. }
  549. return RT_EOK;
  550. }
  551. static rt_err_t _rndis_msg_parser(ufunction_t func, rt_uint8_t *msg)
  552. {
  553. rt_err_t ret = -RT_ERROR;
  554. switch (((rndis_gen_msg_t) msg)->MessageType)
  555. {
  556. case REMOTE_NDIS_INITIALIZE_MSG:
  557. ret = _rndis_init_response(func, (rndis_init_msg_t) msg);
  558. break;
  559. case REMOTE_NDIS_HALT_MSG:
  560. RNDIS_PRINTF("halt\n");
  561. /* link down. */
  562. eth_device_linkchange(&((rt_rndis_eth_t)func->user_data)->parent, RT_FALSE);
  563. break;
  564. case REMOTE_NDIS_QUERY_MSG:
  565. ret = _rndis_query_response(func,(rndis_query_msg_t) msg);
  566. break;
  567. case REMOTE_NDIS_SET_MSG:
  568. ret = _rndis_set_response(func,(rndis_set_msg_t) msg);
  569. RNDIS_PRINTF("set\n");
  570. break;
  571. case REMOTE_NDIS_RESET_MSG:
  572. RNDIS_PRINTF("reset\n");
  573. break;
  574. case REMOTE_NDIS_KEEPALIVE_MSG:
  575. ret = _rndis_keepalive_response(func,(rndis_keepalive_msg_t) msg);
  576. break;
  577. default:
  578. RNDIS_PRINTF("msg %X\n", ((rndis_gen_msg_t) msg)->MessageType);
  579. ret = -RT_ERROR;
  580. break;
  581. }
  582. if (ret == RT_EOK)
  583. _rndis_response_available(func);
  584. return ret;
  585. }
  586. static ufunction_t function = RT_NULL;
  587. static rt_err_t send_encapsulated_command_done(udevice_t device, rt_size_t size)
  588. {
  589. if(function != RT_NULL)
  590. {
  591. dcd_ep0_send_status(device->dcd);
  592. _rndis_msg_parser(function, rndis_message_buffer);
  593. function = RT_NULL;
  594. }
  595. return RT_EOK;
  596. }
  597. //#error here have bug ep 0x82 send failed
  598. static rt_err_t _rndis_send_encapsulated_command(ufunction_t func, ureq_t setup)
  599. {
  600. RT_ASSERT(setup->wLength <= sizeof(rndis_message_buffer));
  601. function = func;
  602. rt_usbd_ep0_read(func->device,rndis_message_buffer,setup->wLength,send_encapsulated_command_done);
  603. return RT_EOK;
  604. }
  605. static rt_err_t _rndis_get_encapsulated_response(ufunction_t func, ureq_t setup)
  606. {
  607. rndis_gen_msg_t msg;
  608. struct rt_rndis_response * response;
  609. if(rt_list_isempty(&((rt_rndis_eth_t)func->user_data)->response_list))
  610. {
  611. RNDIS_PRINTF("response_list is empty!\r\n");
  612. ((rt_rndis_eth_t)func->user_data)->need_notify = RT_TRUE;
  613. return RT_EOK;
  614. }
  615. response = (struct rt_rndis_response *)((rt_rndis_eth_t)func->user_data)->response_list.next;
  616. msg = (rndis_gen_msg_t)response->buffer;
  617. rt_usbd_ep0_write(func->device, (void*)msg, msg->MessageLength);
  618. {
  619. rt_base_t level = rt_hw_interrupt_disable();
  620. rt_list_remove(&response->list);
  621. rt_hw_interrupt_enable(level);
  622. }
  623. rt_free((void *)response->buffer);
  624. rt_free(response);
  625. if(!rt_list_isempty(&((rt_rndis_eth_t)func->user_data)->response_list))
  626. {
  627. rt_uint32_t * data;
  628. RNDIS_PRINTF("auto append next response!\r\n");
  629. data = (rt_uint32_t *)((rt_rndis_eth_t)func->user_data)->eps.ep_cmd->buffer;
  630. data[0] = RESPONSE_AVAILABLE;
  631. data[1] = 0;
  632. ((rt_rndis_eth_t)func->user_data)->eps.ep_cmd->request.buffer = ((rt_rndis_eth_t)func->user_data)->eps.ep_cmd->buffer;
  633. ((rt_rndis_eth_t)func->user_data)->eps.ep_cmd->request.size = 8;
  634. ((rt_rndis_eth_t)func->user_data)->eps.ep_cmd->request.req_type = UIO_REQUEST_WRITE;
  635. rt_usbd_io_request(func->device, ((rt_rndis_eth_t)func->user_data)->eps.ep_cmd, &((rt_rndis_eth_t)func->user_data)->eps.ep_cmd->request);
  636. }
  637. else
  638. {
  639. ((rt_rndis_eth_t)func->user_data)->need_notify = RT_TRUE;
  640. }
  641. return RT_EOK;
  642. }
  643. #ifdef RNDIS_DELAY_LINK_UP
  644. /**
  645. * This function will set rndis connect status.
  646. *
  647. * @param device the usb device object.
  648. * @param status the connect status.
  649. *
  650. * @return RT_EOK on successful.
  651. */
  652. static rt_err_t _rndis_indicate_status_msg(ufunction_t func, rt_uint32_t status)
  653. {
  654. rndis_indicate_status_msg_t resp;
  655. struct rt_rndis_response * response;
  656. response = rt_malloc(sizeof(struct rt_rndis_response));
  657. resp = rt_malloc(sizeof(struct rndis_indicate_status_msg));
  658. if( (response == RT_NULL) || (resp == RT_NULL) )
  659. {
  660. RNDIS_PRINTF("%d: no memory!\r\n", __LINE__);
  661. if(response != RT_NULL)
  662. rt_free(response);
  663. if(resp != RT_NULL)
  664. rt_free(resp);
  665. return -RT_ENOMEM;
  666. }
  667. resp->MessageType = REMOTE_NDIS_INDICATE_STATUS_MSG;
  668. resp->MessageLength = 20; /* sizeof(struct rndis_indicate_status_msg) */
  669. resp->Status = status;
  670. resp->StatusBufferLength = 0;
  671. resp->StatusBufferOffset = 0;
  672. response->buffer = resp;
  673. {
  674. rt_base_t level = rt_hw_interrupt_disable();
  675. rt_list_insert_before(&((rt_rndis_eth_t)func->user_data)->response_list, &response->list);
  676. rt_hw_interrupt_enable(level);
  677. }
  678. _rndis_response_available(func);
  679. return RT_EOK;
  680. }
  681. #endif /* RNDIS_DELAY_LINK_UP */
  682. /**
  683. * This function will handle rndis interface request.
  684. *
  685. * @param device the usb device object.
  686. * @param setup the setup request.
  687. *
  688. * @return RT_EOK on successful.
  689. */
  690. static rt_err_t _interface_handler(ufunction_t func, ureq_t setup)
  691. {
  692. RT_ASSERT(func != RT_NULL);
  693. RT_ASSERT(setup != RT_NULL);
  694. switch(setup->bRequest)
  695. {
  696. case CDC_SEND_ENCAPSULATED_COMMAND:
  697. _rndis_send_encapsulated_command(func, setup);
  698. break;
  699. case CDC_GET_ENCAPSULATED_RESPONSE:
  700. _rndis_get_encapsulated_response(func, setup);
  701. break;
  702. default:
  703. RNDIS_PRINTF("unkown setup->request!\r\n");
  704. break;
  705. }
  706. return RT_EOK;
  707. }
  708. /**
  709. * This function will handle rndis bulk in endpoint request.
  710. *
  711. * @param device the usb device object.
  712. * @param size request size.
  713. *
  714. * @return RT_EOK.
  715. */
  716. static rt_err_t _ep_in_handler(ufunction_t func, rt_size_t size)
  717. {
  718. rt_sem_release(&((rt_rndis_eth_t)func->user_data)->tx_buffer_free);
  719. return RT_EOK;
  720. }
  721. /**
  722. * This function will handle RNDIS bulk out endpoint request.
  723. *
  724. * @param device the usb device object.
  725. * @param size request size.
  726. *
  727. * @return RT_EOK.
  728. */
  729. static rt_err_t _ep_out_handler(ufunction_t func, rt_size_t size)
  730. {
  731. cdc_eps_t eps;
  732. char* data = RT_NULL;
  733. eps = (cdc_eps_t)&((rt_rndis_eth_t)func->user_data)->eps;
  734. data = (char*)eps->ep_out->buffer;
  735. if(((rt_rndis_eth_t)func->user_data)->rx_frist == RT_TRUE)
  736. {
  737. rndis_packet_msg_t msg = (rndis_packet_msg_t)data;
  738. ((rt_rndis_eth_t)func->user_data)->rx_length = msg->DataLength;
  739. ((rt_rndis_eth_t)func->user_data)->rx_offset = 0;
  740. if (size >= 44)
  741. {
  742. data += sizeof(struct rndis_packet_msg);
  743. size -= sizeof(struct rndis_packet_msg);
  744. ((rt_rndis_eth_t)func->user_data)->rx_frist = RT_FALSE;
  745. memcpy(&((rt_rndis_eth_t)func->user_data)->rx_buffer[((rt_rndis_eth_t)func->user_data)->rx_offset], data, size);
  746. ((rt_rndis_eth_t)func->user_data)->rx_offset += size;
  747. }
  748. }
  749. else
  750. {
  751. memcpy(&((rt_rndis_eth_t)func->user_data)->rx_buffer[((rt_rndis_eth_t)func->user_data)->rx_offset], data, size);
  752. ((rt_rndis_eth_t)func->user_data)->rx_offset += size;
  753. }
  754. if(((rt_rndis_eth_t)func->user_data)->rx_offset >= ((rt_rndis_eth_t)func->user_data)->rx_length)
  755. {
  756. ((rt_rndis_eth_t)func->user_data)->rx_frist = RT_TRUE;
  757. ((rt_rndis_eth_t)func->user_data)->rx_flag = RT_TRUE;
  758. eth_device_ready(&(((rt_rndis_eth_t)func->user_data)->parent));
  759. }
  760. else
  761. {
  762. eps->ep_out->request.buffer = eps->ep_out->buffer;
  763. eps->ep_out->request.size = EP_MAXPACKET(eps->ep_out);
  764. eps->ep_out->request.req_type = UIO_REQUEST_READ_BEST;
  765. rt_usbd_io_request(func->device, eps->ep_out, &eps->ep_out->request);
  766. }
  767. return RT_EOK;
  768. }
  769. /**
  770. * This function will handle RNDIS interrupt in endpoint request.
  771. *
  772. * @param device the usb device object.
  773. * @param size request size.
  774. *
  775. * @return RT_EOK.
  776. */
  777. static rt_err_t _ep_cmd_handler(ufunction_t func, rt_size_t size)
  778. {
  779. // _rndis_response_available(func);
  780. return RT_EOK;
  781. }
  782. /**
  783. * This function will run cdc class, it will be called on handle set configuration request.
  784. *
  785. * @param device the usb device object.
  786. *
  787. * @return RT_EOK on successful.
  788. */
  789. static rt_err_t _function_enable(ufunction_t func)
  790. {
  791. cdc_eps_t eps;
  792. eps = (cdc_eps_t)&((rt_rndis_eth_t)func->user_data)->eps;
  793. eps->ep_in->buffer = ((rt_rndis_eth_t)func->user_data)->tx_pool;
  794. eps->ep_out->buffer = ((rt_rndis_eth_t)func->user_data)->rx_pool;
  795. eps->ep_cmd->buffer = (rt_uint8_t*)((rt_rndis_eth_t)func->user_data)->cmd_pool;
  796. eps->ep_out->request.buffer = eps->ep_out->buffer;
  797. eps->ep_out->request.size = EP_MAXPACKET(eps->ep_out);
  798. eps->ep_out->request.req_type = UIO_REQUEST_READ_BEST;
  799. rt_usbd_io_request(func->device, eps->ep_out, &eps->ep_out->request);
  800. ((rt_rndis_eth_t)func->user_data)->rx_flag = RT_FALSE;
  801. ((rt_rndis_eth_t)func->user_data)->rx_frist = RT_TRUE;
  802. #ifdef RNDIS_DELAY_LINK_UP
  803. /* stop link up timer. */
  804. rt_timer_stop(&((rt_rndis_eth_t)func->user_data)->timer);
  805. #endif /* RNDIS_DELAY_LINK_UP */
  806. /* clean resp chain list. */
  807. {
  808. struct rt_rndis_response * response;
  809. rt_base_t level = rt_hw_interrupt_disable();
  810. while(!rt_list_isempty(&((rt_rndis_eth_t)func->user_data)->response_list))
  811. {
  812. response = (struct rt_rndis_response *)((rt_rndis_eth_t)func->user_data)->response_list.next;
  813. rt_list_remove(&response->list);
  814. rt_free((void *)response->buffer);
  815. rt_free(response);
  816. }
  817. ((rt_rndis_eth_t)func->user_data)->need_notify = RT_TRUE;
  818. rt_hw_interrupt_enable(level);
  819. }
  820. return RT_EOK;
  821. }
  822. /**
  823. * This function will stop cdc class, it will be called on handle set configuration request.
  824. *
  825. * @param device the usb device object.
  826. *
  827. * @return RT_EOK on successful.
  828. */
  829. static rt_err_t _function_disable(ufunction_t func)
  830. {
  831. RNDIS_PRINTF("plugged out\n");
  832. #ifdef RNDIS_DELAY_LINK_UP
  833. /* stop link up timer. */
  834. rt_timer_stop(&((rt_rndis_eth_t)func->user_data)->timer);
  835. #endif /* RNDIS_DELAY_LINK_UP */
  836. /* clean resp chain list. */
  837. {
  838. struct rt_rndis_response * response;
  839. rt_base_t level = rt_hw_interrupt_disable();
  840. while(!rt_list_isempty(&((rt_rndis_eth_t)func->user_data)->response_list))
  841. {
  842. response = (struct rt_rndis_response *)((rt_rndis_eth_t)func->user_data)->response_list.next;
  843. RNDIS_PRINTF("remove resp chain list!\r\n");
  844. rt_list_remove(&response->list);
  845. rt_free((void *)response->buffer);
  846. rt_free(response);
  847. }
  848. ((rt_rndis_eth_t)func->user_data)->need_notify = RT_TRUE;
  849. rt_hw_interrupt_enable(level);
  850. }
  851. /* link down. */
  852. eth_device_linkchange(&((rt_rndis_eth_t)func->user_data)->parent, RT_FALSE);
  853. return RT_EOK;
  854. }
  855. static struct ufunction_ops ops =
  856. {
  857. _function_enable,
  858. _function_disable,
  859. RT_NULL,
  860. };
  861. /**
  862. * This function will configure cdc descriptor.
  863. *
  864. * @param comm the communication interface number.
  865. * @param data the data interface number.
  866. *
  867. * @return RT_EOK on successful.
  868. */
  869. static rt_err_t _cdc_descriptor_config(ucdc_comm_desc_t comm, rt_uint8_t cintf_nr, ucdc_data_desc_t data, rt_uint8_t dintf_nr, rt_uint8_t device_is_hs)
  870. {
  871. comm->call_mgmt_desc.data_interface = dintf_nr;
  872. comm->union_desc.master_interface = cintf_nr;
  873. comm->union_desc.slave_interface0 = dintf_nr;
  874. #ifdef RT_USB_DEVICE_COMPOSITE
  875. comm->iad_desc.bFirstInterface = cintf_nr;
  876. #endif
  877. data->ep_out_desc.wMaxPacketSize = device_is_hs ? 512 : 64;
  878. data->ep_in_desc.wMaxPacketSize = device_is_hs ? 512 : 64;
  879. return RT_EOK;
  880. }
  881. #ifdef RT_USING_LWIP
  882. /* initialize the interface */
  883. static rt_err_t rt_rndis_eth_init(rt_device_t dev)
  884. {
  885. return RT_EOK;
  886. }
  887. static rt_err_t rt_rndis_eth_open(rt_device_t dev, rt_uint16_t oflag)
  888. {
  889. return RT_EOK;
  890. }
  891. static rt_err_t rt_rndis_eth_close(rt_device_t dev)
  892. {
  893. return RT_EOK;
  894. }
  895. static rt_size_t rt_rndis_eth_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
  896. {
  897. rt_set_errno(-RT_ENOSYS);
  898. return 0;
  899. }
  900. static rt_size_t rt_rndis_eth_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
  901. {
  902. rt_set_errno(-RT_ENOSYS);
  903. return 0;
  904. }
  905. static rt_err_t rt_rndis_eth_control(rt_device_t dev, int cmd, void *args)
  906. {
  907. rt_rndis_eth_t rndis_eth_dev = (rt_rndis_eth_t)dev;
  908. switch(cmd)
  909. {
  910. case NIOCTL_GADDR:
  911. /* get mac address */
  912. if(args) rt_memcpy(args, rndis_eth_dev->dev_addr, MAX_ADDR_LEN);
  913. else return -RT_ERROR;
  914. break;
  915. default :
  916. break;
  917. }
  918. return RT_EOK;
  919. }
  920. /* ethernet device interface */
  921. /* reception packet. */
  922. struct pbuf *rt_rndis_eth_rx(rt_device_t dev)
  923. {
  924. struct pbuf* p = RT_NULL;
  925. rt_uint32_t offset = 0;
  926. rt_rndis_eth_t device = (rt_rndis_eth_t)dev;
  927. if(device->rx_flag == RT_FALSE)
  928. {
  929. return p;
  930. }
  931. if(device->rx_length != 0)
  932. {
  933. /* allocate buffer */
  934. p = pbuf_alloc(PBUF_LINK, device->rx_length, PBUF_RAM);
  935. if (p != RT_NULL)
  936. {
  937. struct pbuf* q;
  938. for (q = p; q != RT_NULL; q= q->next)
  939. {
  940. /* Copy the received frame into buffer from memory pointed by the current ETHERNET DMA Rx descriptor */
  941. memcpy(q->payload,
  942. (rt_uint8_t *)((device->rx_buffer) + offset),
  943. q->len);
  944. offset += q->len;
  945. }
  946. }
  947. }
  948. {
  949. device->rx_flag = RT_FALSE;
  950. device->eps.ep_out->request.buffer = device->eps.ep_out->buffer;
  951. device->eps.ep_out->request.size = EP_MAXPACKET(device->eps.ep_out);
  952. device->eps.ep_out->request.req_type = UIO_REQUEST_READ_BEST;
  953. rt_usbd_io_request(device->func->device, device->eps.ep_out, &device->eps.ep_out->request);
  954. }
  955. return p;
  956. }
  957. /* transmit packet. */
  958. rt_err_t rt_rndis_eth_tx(rt_device_t dev, struct pbuf* p)
  959. {
  960. struct pbuf* q;
  961. char * buffer;
  962. rt_err_t result = RT_EOK;
  963. rt_rndis_eth_t device = (rt_rndis_eth_t)dev;
  964. if(!device->parent.link_status)
  965. {
  966. RNDIS_PRINTF("linkdown, drop pkg\r\n");
  967. return RT_EOK;
  968. }
  969. RT_ASSERT(p->tot_len < sizeof(device->tx_buffer));
  970. if(p->tot_len > sizeof(device->tx_buffer))
  971. {
  972. RNDIS_PRINTF("RNDIS MTU is:%d, but the send packet size is %d\r\n",
  973. sizeof(device->tx_buffer), p->tot_len);
  974. p->tot_len = sizeof(device->tx_buffer);
  975. }
  976. /* wait for buffer free. */
  977. result = rt_sem_take(&device->tx_buffer_free, RT_WAITING_FOREVER);
  978. if(result != RT_EOK)
  979. {
  980. return result;
  981. }
  982. buffer = (char *)&device->tx_buffer + sizeof(struct rndis_packet_msg);
  983. for (q = p; q != NULL; q = q->next)
  984. {
  985. memcpy(buffer, q->payload, q->len);
  986. buffer += q->len;
  987. }
  988. /* send */
  989. {
  990. rndis_packet_msg_t msg;
  991. msg = (rndis_packet_msg_t)&device->tx_buffer;
  992. msg->MessageType = REMOTE_NDIS_PACKET_MSG;
  993. msg->DataOffset = sizeof(struct rndis_packet_msg) - 8;
  994. msg->DataLength = p->tot_len;
  995. msg->OOBDataLength = 0;
  996. msg->OOBDataOffset = 0;
  997. msg->NumOOBDataElements = 0;
  998. msg->PerPacketInfoOffset = 0;
  999. msg->PerPacketInfoLength = 0;
  1000. msg->VcHandle = 0;
  1001. msg->Reserved = 0;
  1002. msg->MessageLength = sizeof(struct rndis_packet_msg) + p->tot_len;
  1003. if((msg->MessageLength & 0x3F) == 0)
  1004. {
  1005. /* pad a dummy. */
  1006. msg->MessageLength += 1;
  1007. }
  1008. device->eps.ep_in->request.buffer = (void *)&device->tx_buffer;
  1009. device->eps.ep_in->request.size = msg->MessageLength;
  1010. device->eps.ep_in->request.req_type = UIO_REQUEST_WRITE;
  1011. rt_usbd_io_request(device->func->device, device->eps.ep_in, &device->eps.ep_in->request);
  1012. }
  1013. return result;
  1014. }
  1015. #ifdef RT_USING_DEVICE_OPS
  1016. const static struct rt_device_ops rndis_device_ops =
  1017. {
  1018. rt_rndis_eth_init,
  1019. rt_rndis_eth_open,
  1020. rt_rndis_eth_close,
  1021. rt_rndis_eth_read,
  1022. rt_rndis_eth_write,
  1023. rt_rndis_eth_control
  1024. };
  1025. #endif
  1026. #endif /* RT_USING_LWIP */
  1027. #ifdef RNDIS_DELAY_LINK_UP
  1028. /* the delay linkup timer handler. */
  1029. static void timer_timeout(void* parameter)
  1030. {
  1031. RNDIS_PRINTF("delay link up!\r\n");
  1032. _rndis_indicate_status_msg(((rt_rndis_eth_t)parameter)->parent.parent.user_data,
  1033. RNDIS_STATUS_MEDIA_CONNECT);
  1034. eth_device_linkchange(&((rt_rndis_eth_t)parameter)->parent, RT_TRUE);
  1035. }
  1036. #endif /* RNDIS_DELAY_LINK_UP */
  1037. /**
  1038. * This function will create a cdc rndis class instance.
  1039. *
  1040. * @param device the usb device object.
  1041. *
  1042. * @return RT_EOK on successful.
  1043. */
  1044. ufunction_t rt_usbd_function_rndis_create(udevice_t device)
  1045. {
  1046. ufunction_t cdc;
  1047. rt_rndis_eth_t _rndis;
  1048. cdc_eps_t eps;
  1049. uintf_t intf_comm, intf_data;
  1050. ualtsetting_t comm_setting, data_setting;
  1051. ucdc_data_desc_t data_desc;
  1052. ucdc_comm_desc_t comm_desc;
  1053. /* parameter check */
  1054. RT_ASSERT(device != RT_NULL);
  1055. /* set usb device string description */
  1056. rt_usbd_device_set_string(device, _ustring);
  1057. /* create a cdc class */
  1058. cdc = rt_usbd_function_new(device, &_dev_desc, &ops);
  1059. rt_usbd_device_set_qualifier(device, &dev_qualifier);
  1060. _rndis= rt_malloc(sizeof(struct rt_rndis_eth));
  1061. rt_memset(_rndis, 0, sizeof(struct rt_rndis_eth));
  1062. cdc->user_data = _rndis;
  1063. _rndis->func = cdc;
  1064. /* create a cdc class endpoints collection */
  1065. eps = &_rndis->eps;
  1066. /* create a cdc communication interface and a cdc data interface */
  1067. intf_comm = rt_usbd_interface_new(device, _interface_handler);
  1068. intf_data = rt_usbd_interface_new(device, _interface_handler);
  1069. /* create a communication alternate setting and a data alternate setting */
  1070. comm_setting = rt_usbd_altsetting_new(sizeof(struct ucdc_comm_descriptor));
  1071. data_setting = rt_usbd_altsetting_new(sizeof(struct ucdc_data_descriptor));
  1072. /* config desc in alternate setting */
  1073. rt_usbd_altsetting_config_descriptor(comm_setting, &_comm_desc,
  1074. (rt_off_t)&((ucdc_comm_desc_t)0)->intf_desc);
  1075. rt_usbd_altsetting_config_descriptor(data_setting, &_data_desc, 0);
  1076. /* configure the cdc interface descriptor */
  1077. _cdc_descriptor_config(comm_setting->desc, intf_comm->intf_num, data_setting->desc, intf_data->intf_num, device->dcd->device_is_hs);
  1078. /* create a command endpoint */
  1079. comm_desc = (ucdc_comm_desc_t)comm_setting->desc;
  1080. eps->ep_cmd = rt_usbd_endpoint_new(&comm_desc->ep_desc, _ep_cmd_handler);
  1081. /* add the command endpoint to the cdc communication interface */
  1082. rt_usbd_altsetting_add_endpoint(comm_setting, eps->ep_cmd);
  1083. /* add the communication alternate setting to the communication interface,
  1084. then set default setting of the interface */
  1085. rt_usbd_interface_add_altsetting(intf_comm, comm_setting);
  1086. rt_usbd_set_altsetting(intf_comm, 0);
  1087. /* add the communication interface to the cdc class */
  1088. rt_usbd_function_add_interface(cdc, intf_comm);
  1089. /* create a bulk in and a bulk out endpoint */
  1090. data_desc = (ucdc_data_desc_t)data_setting->desc;
  1091. eps->ep_out = rt_usbd_endpoint_new(&data_desc->ep_out_desc, _ep_out_handler);
  1092. eps->ep_in = rt_usbd_endpoint_new(&data_desc->ep_in_desc, _ep_in_handler);
  1093. /* add the bulk out and bulk in endpoints to the data alternate setting */
  1094. rt_usbd_altsetting_add_endpoint(data_setting, eps->ep_in);
  1095. rt_usbd_altsetting_add_endpoint(data_setting, eps->ep_out);
  1096. /* add the data alternate setting to the data interface
  1097. then set default setting of the interface */
  1098. rt_usbd_interface_add_altsetting(intf_data, data_setting);
  1099. rt_usbd_set_altsetting(intf_data, 0);
  1100. /* add the cdc data interface to cdc class */
  1101. rt_usbd_function_add_interface(cdc, intf_data);
  1102. rt_usbd_os_comp_id_desc_add_os_func_comp_id_desc(device->os_comp_id_desc, &rndis_func_comp_id_desc);
  1103. #ifdef RT_USING_LWIP
  1104. rt_list_init(&_rndis->response_list);
  1105. _rndis->need_notify = RT_TRUE;
  1106. rt_sem_init(&_rndis->tx_buffer_free, "ue_tx", 1, RT_IPC_FLAG_FIFO);
  1107. #ifdef RNDIS_DELAY_LINK_UP
  1108. rt_timer_init(&_rndis->timer,
  1109. "RNDIS",
  1110. timer_timeout,
  1111. _rndis,
  1112. RT_TICK_PER_SECOND * 2,
  1113. RT_TIMER_FLAG_ONE_SHOT);
  1114. #endif /* RNDIS_DELAY_LINK_UP */
  1115. /* OUI 00-00-00, only for test. */
  1116. _rndis->dev_addr[0] = 0x34;
  1117. _rndis->dev_addr[1] = 0x97;
  1118. _rndis->dev_addr[2] = 0xF6;
  1119. /* generate random MAC. */
  1120. _rndis->dev_addr[3] = 0x94;//*(const rt_uint8_t *)(0x1fff7a10);
  1121. _rndis->dev_addr[4] = 0xEA;//*(const rt_uint8_t *)(0x1fff7a14);
  1122. _rndis->dev_addr[5] = 0x12;//(const rt_uint8_t *)(0x1fff7a18);
  1123. /* OUI 00-00-00, only for test. */
  1124. _rndis->host_addr[0] = 0x34;
  1125. _rndis->host_addr[1] = 0x97;
  1126. _rndis->host_addr[2] = 0xF6;
  1127. /* generate random MAC. */
  1128. _rndis->host_addr[3] = 0x94;//*(const rt_uint8_t *)(0x0FE081F0);
  1129. _rndis->host_addr[4] = 0xEA;//*(const rt_uint8_t *)(0x0FE081F1);
  1130. _rndis->host_addr[5] = 0x13;//*(const rt_uint8_t *)(0x0FE081F2);
  1131. #ifdef RT_USING_DEVICE_OPS
  1132. _rndis->parent.parent.ops = &rndis_device_ops;
  1133. #else
  1134. _rndis->parent.parent.init = rt_rndis_eth_init;
  1135. _rndis->parent.parent.open = rt_rndis_eth_open;
  1136. _rndis->parent.parent.close = rt_rndis_eth_close;
  1137. _rndis->parent.parent.read = rt_rndis_eth_read;
  1138. _rndis->parent.parent.write = rt_rndis_eth_write;
  1139. _rndis->parent.parent.control = rt_rndis_eth_control;
  1140. #endif
  1141. _rndis->parent.parent.user_data = device;
  1142. _rndis->parent.eth_rx = rt_rndis_eth_rx;
  1143. _rndis->parent.eth_tx = rt_rndis_eth_tx;
  1144. /* register eth device */
  1145. eth_device_init(&((rt_rndis_eth_t)cdc->user_data)->parent, "u0");
  1146. #endif /* RT_USING_LWIP */
  1147. return cdc;
  1148. }
  1149. struct udclass rndis_class =
  1150. {
  1151. .rt_usbd_function_create = rt_usbd_function_rndis_create
  1152. };
  1153. int rt_usbd_rndis_class_register(void)
  1154. {
  1155. rt_usbd_class_register(&rndis_class);
  1156. return 0;
  1157. }
  1158. INIT_PREV_EXPORT(rt_usbd_rndis_class_register);