rndis.c 41 KB

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