dev_serial_v2.c 64 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199
  1. /*
  2. * Copyright (c) 2006-2024 RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-06-01 KyleChan first version
  9. */
  10. #include <rthw.h>
  11. #include <rtthread.h>
  12. #include <rtdevice.h>
  13. #define DBG_TAG "Serial"
  14. #define DBG_LVL DBG_INFO
  15. #include <rtdbg.h>
  16. #ifdef RT_SERIAL_BUF_STRATEGY_DROP
  17. #define RT_SERIAL_FIFO_LOCK(spinlock) ((rt_base_t)0)
  18. #define RT_SERIAL_FIFO_UNLOCK(spinlock, level) \
  19. do \
  20. { \
  21. RT_UNUSED(spinlock); \
  22. RT_UNUSED(level); \
  23. } while (0)
  24. #else
  25. #define RT_SERIAL_FIFO_LOCK(spinlock) rt_spin_lock_irqsave(spinlock)
  26. #define RT_SERIAL_FIFO_UNLOCK(spinlock, level) rt_spin_unlock_irqrestore(spinlock, level)
  27. #endif /* RT_SERIAL_BUF_STRATEGY_DROP */
  28. #ifdef RT_USING_POSIX_STDIO
  29. #include <unistd.h>
  30. #include <fcntl.h>
  31. #include <poll.h>
  32. #include <sys/ioctl.h>
  33. #include <dfs_file.h>
  34. #ifdef RT_USING_POSIX_TERMIOS
  35. #include <termios.h>
  36. #endif
  37. #ifdef getc
  38. #undef getc
  39. #endif
  40. #ifdef putc
  41. #undef putc
  42. #endif
  43. RT_OBJECT_HOOKLIST_DEFINE(rt_hw_serial_rxind);
  44. static rt_err_t serial_fops_rx_ind(rt_device_t dev, rt_size_t size)
  45. {
  46. rt_wqueue_wakeup(&dev->wait_queue, (void *)POLLIN);
  47. RT_OBJECT_HOOKLIST_CALL(rt_hw_serial_rxind, (dev, size));
  48. return RT_EOK;
  49. }
  50. /* fops for serial */
  51. static int serial_fops_open(struct dfs_file *fd)
  52. {
  53. rt_err_t ret = 0;
  54. rt_uint16_t flags = 0;
  55. rt_device_t device;
  56. struct rt_serial_device *serial;
  57. device = (rt_device_t)fd->vnode->data;
  58. RT_ASSERT(device != RT_NULL);
  59. switch (fd->flags & O_ACCMODE)
  60. {
  61. case O_RDONLY:
  62. LOG_D("fops open: O_RDONLY!");
  63. flags = RT_DEVICE_FLAG_RDONLY;
  64. break;
  65. case O_WRONLY:
  66. LOG_D("fops open: O_WRONLY!");
  67. flags = RT_DEVICE_FLAG_WRONLY;
  68. break;
  69. case O_RDWR:
  70. LOG_D("fops open: O_RDWR!");
  71. flags = RT_DEVICE_FLAG_RDWR;
  72. break;
  73. default:
  74. LOG_E("fops open: unknown mode - %d!", fd->flags & O_ACCMODE);
  75. break;
  76. }
  77. if ((fd->flags & O_ACCMODE) != O_WRONLY)
  78. rt_device_set_rx_indicate(device, serial_fops_rx_ind);
  79. flags |= RT_SERIAL_RX_BLOCKING | RT_SERIAL_TX_BLOCKING;
  80. /* preserve RT_DEVICE_FLAG_STREAM if it was set before close */
  81. if (device->open_flag & RT_DEVICE_FLAG_STREAM)
  82. {
  83. flags |= RT_DEVICE_FLAG_STREAM;
  84. }
  85. rt_device_close(device);
  86. ret = rt_device_open(device, flags);
  87. if (ret == RT_EOK)
  88. {
  89. serial = (struct rt_serial_device *)device;
  90. serial->is_posix_mode = RT_TRUE;
  91. }
  92. return ret;
  93. }
  94. static int serial_fops_close(struct dfs_file *fd)
  95. {
  96. rt_device_t device;
  97. device = (rt_device_t)fd->vnode->data;
  98. rt_device_set_rx_indicate(device, RT_NULL);
  99. rt_device_close(device);
  100. return 0;
  101. }
  102. static int serial_fops_ioctl(struct dfs_file *fd, int cmd, void *args)
  103. {
  104. rt_device_t device;
  105. int flags = (int)(rt_base_t)args;
  106. int mask = O_NONBLOCK | O_APPEND;
  107. device = (rt_device_t)fd->vnode->data;
  108. switch ((rt_ubase_t)cmd)
  109. {
  110. case FIONREAD:
  111. break;
  112. case FIONWRITE:
  113. break;
  114. case F_SETFL:
  115. flags &= mask;
  116. fd->flags &= ~mask;
  117. fd->flags |= flags;
  118. break;
  119. default:
  120. break;
  121. }
  122. return rt_device_control(device, cmd, args);
  123. }
  124. #ifdef RT_USING_DFS_V2
  125. static ssize_t serial_fops_read(struct dfs_file *fd, void *buf, size_t count, off_t *pos)
  126. #else
  127. static ssize_t serial_fops_read(struct dfs_file *fd, void *buf, size_t count)
  128. #endif
  129. {
  130. ssize_t size = 0;
  131. rt_device_t device;
  132. rt_int32_t rx_timout;
  133. if (count == 0)
  134. return 0;
  135. RT_ASSERT(fd != RT_NULL && buf != RT_NULL);
  136. device = (rt_device_t)fd->vnode->data;
  137. RT_ASSERT(device != RT_NULL);
  138. /* nonblock mode */
  139. if (fd->flags & O_NONBLOCK)
  140. {
  141. rx_timout = RT_WAITING_NO;
  142. rt_device_control(device, RT_SERIAL_CTRL_SET_RX_TIMEOUT, (void *)&rx_timout);
  143. size = rt_device_read(device, -1, buf, count);
  144. if (size <= 0)
  145. {
  146. size = -1;
  147. rt_set_errno(EAGAIN);
  148. }
  149. }
  150. else
  151. {
  152. rx_timout = RT_WAITING_FOREVER;
  153. rt_device_control(device, RT_SERIAL_CTRL_SET_RX_TIMEOUT, (void *)&rx_timout);
  154. size = rt_device_read(device, -1, buf, count);
  155. }
  156. return size;
  157. }
  158. #ifdef RT_USING_DFS_V2
  159. static ssize_t serial_fops_write(struct dfs_file *fd, const void *buf, size_t count, off_t *pos)
  160. #else
  161. static ssize_t serial_fops_write(struct dfs_file *fd, const void *buf, size_t count)
  162. #endif
  163. {
  164. ssize_t size = 0;
  165. rt_device_t device;
  166. rt_int32_t tx_timeout;
  167. device = (rt_device_t)fd->vnode->data;
  168. if (fd->flags & O_NONBLOCK)
  169. {
  170. tx_timeout = RT_WAITING_NO;
  171. rt_device_control(device, RT_SERIAL_CTRL_SET_TX_TIMEOUT, (void *)&tx_timeout);
  172. size = rt_device_write(device, -1, buf, count);
  173. if (size <= 0)
  174. {
  175. size = -1;
  176. rt_set_errno(EAGAIN);
  177. }
  178. }
  179. else
  180. {
  181. tx_timeout = RT_WAITING_FOREVER;
  182. rt_device_control(device, RT_SERIAL_CTRL_SET_TX_TIMEOUT, (void *)&tx_timeout);
  183. size = rt_device_write(device, -1, buf, count);
  184. }
  185. return size;
  186. }
  187. static int serial_fops_flush(struct dfs_file *fd)
  188. {
  189. rt_device_t device;
  190. device = (rt_device_t)fd->vnode->data;
  191. RT_ASSERT(device != RT_NULL);
  192. rt_device_control(device, RT_SERIAL_CTRL_TX_FLUSH, (void *)RT_NULL);
  193. rt_device_control(device, RT_SERIAL_CTRL_RX_FLUSH, (void *)RT_NULL);
  194. return 0;
  195. }
  196. static int serial_fops_poll(struct dfs_file *fd, struct rt_pollreq *req)
  197. {
  198. int mask = 0;
  199. int flags = 0;
  200. rt_device_t device;
  201. struct rt_serial_device *serial;
  202. device = (rt_device_t)fd->vnode->data;
  203. RT_ASSERT(device != RT_NULL);
  204. serial = (struct rt_serial_device *)device;
  205. /* only support POLLIN */
  206. flags = fd->flags & O_ACCMODE;
  207. if (flags == O_RDONLY || flags == O_RDWR)
  208. {
  209. rt_base_t level;
  210. struct rt_serial_rx_fifo *rx_fifo;
  211. rt_poll_add(&device->wait_queue, req);
  212. rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
  213. level = RT_SERIAL_FIFO_LOCK(&serial->spinlock);
  214. if (rt_ringbuffer_data_len(&rx_fifo->rb))
  215. mask |= POLLIN;
  216. RT_SERIAL_FIFO_UNLOCK(&serial->spinlock, level);
  217. }
  218. /* mask|=POLLOUT; */
  219. return mask;
  220. }
  221. const static struct dfs_file_ops _serial_fops = {
  222. .open = serial_fops_open,
  223. .close = serial_fops_close,
  224. .ioctl = serial_fops_ioctl,
  225. .read = serial_fops_read,
  226. .write = serial_fops_write,
  227. .flush = serial_fops_flush,
  228. .poll = serial_fops_poll,
  229. };
  230. #endif /* RT_USING_POSIX_STDIO */
  231. static rt_ssize_t rt_serial_get_linear_buffer(struct rt_ringbuffer *rb,
  232. rt_uint8_t **ptr)
  233. {
  234. rt_size_t size;
  235. RT_ASSERT(rb != RT_NULL);
  236. /* whether has enough data */
  237. size = rt_ringbuffer_data_len(rb);
  238. /* no data */
  239. if (size == 0)
  240. return 0;
  241. *ptr = &rb->buffer_ptr[rb->read_index];
  242. if (rb->buffer_size - rb->read_index > size)
  243. {
  244. return size;
  245. }
  246. return rb->buffer_size - rb->read_index;
  247. }
  248. #ifdef RT_SERIAL_USING_DMA
  249. static void rt_serial_update_read_index(struct rt_ringbuffer *rb,
  250. rt_uint16_t length)
  251. {
  252. rt_size_t size;
  253. RT_ASSERT(rb != RT_NULL);
  254. /* whether has enough data */
  255. size = rt_ringbuffer_data_len(rb);
  256. /* no data */
  257. if (size == 0)
  258. return;
  259. /* less data */
  260. if (size < length)
  261. length = size;
  262. if (rb->buffer_size - rb->read_index > length)
  263. {
  264. rb->read_index += length;
  265. return;
  266. }
  267. /* we are going into the other side of the mirror */
  268. rb->read_mirror = ~rb->read_mirror;
  269. rb->read_index = length - (rb->buffer_size - rb->read_index);
  270. return;
  271. }
  272. static void rt_serial_update_write_index(struct rt_ringbuffer *rb,
  273. rt_uint16_t length)
  274. {
  275. rt_uint16_t space_length;
  276. RT_ASSERT(rb != RT_NULL);
  277. /* whether has enough space */
  278. space_length = rt_ringbuffer_space_len(rb);
  279. if (length > rb->buffer_size)
  280. {
  281. length = rb->buffer_size;
  282. #if !defined(RT_USING_ULOG) || defined(ULOG_USING_ISR_LOG)
  283. LOG_W("The serial buffer (len %d) is overflow.", rb->buffer_size);
  284. #endif
  285. }
  286. if (rb->buffer_size - rb->write_index > length)
  287. {
  288. /* this should not cause overflow because there is enough space for
  289. * length of data in current mirror */
  290. rb->write_index += length;
  291. if (length > space_length)
  292. rb->read_index = rb->write_index;
  293. return;
  294. }
  295. /* we are going into the other side of the mirror */
  296. rb->write_mirror = ~rb->write_mirror;
  297. rb->write_index = length - (rb->buffer_size - rb->write_index);
  298. if (length > space_length)
  299. {
  300. if (rb->write_index <= rb->read_index)
  301. rb->read_mirror = ~rb->read_mirror;
  302. rb->read_index = rb->write_index;
  303. }
  304. return;
  305. }
  306. #endif /* RT_SERIAL_USING_DMA */
  307. /**
  308. * @brief Serial polling receive data routine, This function will receive data
  309. * in a continuous loop by one by one byte.
  310. * @param dev The pointer of device driver structure
  311. * @param pos Empty parameter.
  312. * @param buffer Receive data buffer.
  313. * @param size Receive data buffer length.
  314. * @return Return the final length of data received.
  315. */
  316. rt_ssize_t _serial_poll_rx(struct rt_device *dev,
  317. rt_off_t pos,
  318. void *buffer,
  319. rt_size_t size)
  320. {
  321. struct rt_serial_device *serial;
  322. rt_size_t getc_size;
  323. int getc_element; /* Gets one byte of data received */
  324. rt_uint8_t *getc_buffer; /* Pointer to the receive data buffer */
  325. RT_ASSERT(dev != RT_NULL && buffer != RT_NULL);
  326. if (size == 0)
  327. return 0;
  328. serial = (struct rt_serial_device *)dev;
  329. getc_buffer = (rt_uint8_t *)buffer;
  330. getc_size = size;
  331. while (size)
  332. {
  333. getc_element = serial->ops->getc(serial);
  334. if (getc_element < 0)
  335. break;
  336. *getc_buffer = getc_element;
  337. ++getc_buffer;
  338. --size;
  339. if (serial->parent.open_flag & RT_DEVICE_FLAG_STREAM)
  340. {
  341. /* If open_flag satisfies RT_DEVICE_FLAG_STREAM
  342. * and the received character is '\n', exit the loop directly */
  343. if (getc_element == '\n')
  344. break;
  345. }
  346. }
  347. return getc_size - size;
  348. }
  349. /**
  350. * @brief Serial polling transmit data routines, This function will transmit
  351. * data in a continuous loop by one by one byte.
  352. * @param dev The pointer of device driver structure
  353. * @param pos Empty parameter.
  354. * @param buffer Transmit data buffer.
  355. * @param size Transmit data buffer length.
  356. * @return Return the final length of data transmit.
  357. */
  358. rt_ssize_t _serial_poll_tx(struct rt_device *dev,
  359. rt_off_t pos,
  360. const void *buffer,
  361. rt_size_t size)
  362. {
  363. struct rt_serial_device *serial;
  364. rt_size_t putc_size;
  365. rt_uint8_t *putc_buffer; /* Pointer to the transmit data buffer */
  366. int putc_result;
  367. if (size == 0)
  368. return 0;
  369. RT_ASSERT(dev != RT_NULL && buffer != RT_NULL);
  370. serial = (struct rt_serial_device *)dev;
  371. putc_buffer = (rt_uint8_t *)buffer;
  372. putc_size = size;
  373. while (size)
  374. {
  375. if (serial->parent.open_flag & RT_DEVICE_FLAG_STREAM)
  376. {
  377. /* If open_flag satisfies RT_DEVICE_FLAG_STREAM and the received character is '\n',
  378. * inserts '\r' character before '\n' character for the effect of carriage return newline */
  379. if (*putc_buffer == '\n')
  380. serial->ops->putc(serial, '\r');
  381. }
  382. putc_result = serial->ops->putc(serial, *putc_buffer);
  383. if (putc_result < 0)
  384. break;
  385. ++putc_buffer;
  386. --size;
  387. }
  388. return putc_size - size;
  389. }
  390. /**
  391. * @brief Serial receive data routines, This function will receive
  392. * data by using fifo
  393. *
  394. * @note In blocking mode, the function will wait until the specified amount of data is received or until a timeout occurs.
  395. * In non-blocking mode, the function will immediately attempt to retrieve as much data as possible from the ring buffer and return.
  396. *
  397. * @param dev The pointer of device driver structure
  398. * @param pos Empty parameter.
  399. * @param buffer Receive data buffer.
  400. * @param size Receive data buffer length.
  401. * @return Returns the actual length of data received.
  402. */
  403. static rt_ssize_t _serial_fifo_rx(struct rt_device *dev,
  404. rt_off_t pos,
  405. void *buffer,
  406. rt_size_t size)
  407. {
  408. struct rt_serial_device *serial;
  409. struct rt_serial_rx_fifo *rx_fifo;
  410. rt_base_t level;
  411. rt_size_t recv_size = 0;
  412. if (size == 0)
  413. return 0;
  414. RT_ASSERT(dev != RT_NULL && buffer != RT_NULL);
  415. serial = (struct rt_serial_device *)dev;
  416. rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
  417. if (dev->open_flag & RT_SERIAL_RX_BLOCKING)
  418. {
  419. rt_size_t data_len;
  420. rt_tick_t delta_tick;
  421. rt_size_t rx_bufsz_third = serial->config.rx_bufsz / 2;
  422. rt_int32_t base_rx_timeout = rt_atomic_load(&rx_fifo->rx_timeout);
  423. rt_int32_t rx_timeout_left = base_rx_timeout;
  424. rt_tick_t begin_tick = rt_tick_get();
  425. while (1)
  426. {
  427. if (rx_timeout_left != RT_WAITING_NO)
  428. {
  429. level = rt_spin_lock_irqsave(&serial->spinlock);
  430. data_len = rt_ringbuffer_data_len(&rx_fifo->rb);
  431. if (data_len < size - recv_size)
  432. {
  433. if (size - (recv_size + data_len) >= rx_bufsz_third)
  434. {
  435. rx_fifo->rx_cpt_index = rx_bufsz_third;
  436. }
  437. else
  438. {
  439. rx_fifo->rx_cpt_index = size - (recv_size + data_len);
  440. }
  441. rt_completion_wait(&rx_fifo->rx_cpt, 0);
  442. }
  443. rt_spin_unlock_irqrestore(&serial->spinlock, level);
  444. }
  445. level = RT_SERIAL_FIFO_LOCK(&serial->spinlock);
  446. recv_size += rt_ringbuffer_get(&rx_fifo->rb, (rt_uint8_t *)buffer + recv_size, size - recv_size);
  447. RT_SERIAL_FIFO_UNLOCK(&serial->spinlock, level);
  448. if (recv_size == size || rx_timeout_left == RT_WAITING_NO)
  449. {
  450. break;
  451. }
  452. rt_completion_wait(&rx_fifo->rx_cpt, rx_timeout_left);
  453. if (rx_timeout_left != RT_WAITING_FOREVER)
  454. {
  455. delta_tick = rt_tick_get_delta(begin_tick);
  456. if (delta_tick >= base_rx_timeout)
  457. {
  458. level = RT_SERIAL_FIFO_LOCK(&serial->spinlock);
  459. recv_size += rt_ringbuffer_get(&rx_fifo->rb, (rt_uint8_t *)buffer + recv_size, size - recv_size);
  460. RT_SERIAL_FIFO_UNLOCK(&serial->spinlock, level);
  461. return recv_size;
  462. }
  463. rx_timeout_left = base_rx_timeout - delta_tick;
  464. }
  465. }
  466. }
  467. else if (dev->open_flag & RT_SERIAL_RX_NON_BLOCKING)
  468. {
  469. /* When open_flag is RT_SERIAL_RX_NON_BLOCKING,
  470. * the data is retrieved directly from the ringbuffer and returned */
  471. level = RT_SERIAL_FIFO_LOCK(&serial->spinlock);
  472. recv_size = rt_ringbuffer_get(&rx_fifo->rb, buffer, size);
  473. RT_SERIAL_FIFO_UNLOCK(&serial->spinlock, level);
  474. }
  475. return recv_size;
  476. }
  477. /**
  478. * @brief Serial transmit data routines, This function will transmit
  479. * data by using blocking_nbuf.
  480. * @param dev The pointer of device driver structure
  481. * @param pos Empty parameter.
  482. * @param buffer Transmit data buffer.
  483. * @param size Transmit data buffer length.
  484. * @return Returns the actual length of data transmitted.
  485. */
  486. static rt_ssize_t _serial_fifo_tx_blocking_nbuf(struct rt_device *dev,
  487. rt_off_t pos,
  488. const void *buffer,
  489. rt_size_t size)
  490. {
  491. struct rt_serial_device *serial;
  492. struct rt_serial_tx_fifo *tx_fifo;
  493. rt_ssize_t send_size;
  494. rt_err_t ret;
  495. if (size == 0)
  496. return 0;
  497. RT_ASSERT(dev != RT_NULL && buffer != RT_NULL);
  498. serial = (struct rt_serial_device *)dev;
  499. tx_fifo = (struct rt_serial_tx_fifo *)serial->serial_tx;
  500. RT_ASSERT(tx_fifo != RT_NULL);
  501. if (rt_thread_self() == RT_NULL || (serial->parent.open_flag & RT_DEVICE_FLAG_STREAM) || (dev == rt_console_get_device()))
  502. {
  503. /* using poll tx when the scheduler not startup or in stream mode */
  504. return _serial_poll_tx(dev, pos, buffer, size);
  505. }
  506. /* When serial transmit in tx_blocking mode,
  507. * if the activated mode is RT_TRUE, it will return directly */
  508. if (rt_atomic_flag_test_and_set(&tx_fifo->activated))
  509. {
  510. return 0;
  511. }
  512. /* clear tx_cpt flag */
  513. rt_completion_wait(&tx_fifo->tx_cpt, 0);
  514. /* Call the transmit interface for transmission */
  515. send_size = serial->ops->transmit(serial,
  516. (rt_uint8_t *)buffer,
  517. size,
  518. RT_SERIAL_TX_BLOCKING);
  519. if (send_size <= 0)
  520. {
  521. return 0;
  522. }
  523. if (rt_atomic_load(&tx_fifo->tx_timeout) == RT_WAITING_NO)
  524. {
  525. /* The implementation of POSIX nonblock mode is to set tx_timeout to RT_WAITING_NO */
  526. #ifdef RT_USING_POSIX_STDIO
  527. if (serial->is_posix_mode)
  528. return send_size;
  529. #endif
  530. return 0;
  531. }
  532. /* Waiting for the transmission to complete */
  533. ret = rt_completion_wait(&tx_fifo->tx_cpt, rt_atomic_load(&tx_fifo->tx_timeout));
  534. if (ret != RT_EOK)
  535. {
  536. /* Cannot get the number of bytes sent under DMA, so returns 0 directly */
  537. return 0;
  538. }
  539. return send_size;
  540. }
  541. /**
  542. * @brief Serial transmit data routines, This function will transmit
  543. * data by using blocking_buf.
  544. * @param dev The pointer of device driver structure
  545. * @param pos Empty parameter.
  546. * @param buffer Transmit data buffer.
  547. * @param size Transmit data buffer length.
  548. * @return Returns the final length of data transmitted.
  549. */
  550. static rt_ssize_t _serial_fifo_tx_blocking_buf(struct rt_device *dev,
  551. rt_off_t pos,
  552. const void *buffer,
  553. rt_size_t size)
  554. {
  555. struct rt_serial_device *serial;
  556. struct rt_serial_tx_fifo *tx_fifo;
  557. rt_base_t level;
  558. if (size == 0)
  559. return 0;
  560. RT_ASSERT(dev != RT_NULL && buffer != RT_NULL);
  561. serial = (struct rt_serial_device *)dev;
  562. tx_fifo = (struct rt_serial_tx_fifo *)serial->serial_tx;
  563. RT_ASSERT(tx_fifo != RT_NULL);
  564. if (rt_thread_self() == RT_NULL || (serial->parent.open_flag & RT_DEVICE_FLAG_STREAM) || (dev == rt_console_get_device()))
  565. {
  566. /* using poll tx when the scheduler not startup or in stream mode */
  567. return _serial_poll_tx(dev, pos, buffer, size);
  568. }
  569. /* When serial transmit in tx_blocking mode,
  570. * if the activated mode is RT_TRUE, it will return directly */
  571. if (rt_atomic_flag_test_and_set(&tx_fifo->activated))
  572. {
  573. return 0;
  574. }
  575. rt_tick_t delta_tick;
  576. rt_int32_t base_tx_timeout = rt_atomic_load(&tx_fifo->tx_timeout);
  577. rt_int32_t tx_timeout_left = base_tx_timeout;
  578. rt_tick_t begin_tick = rt_tick_get();
  579. rt_size_t send_size = 0;
  580. rt_size_t rb_size;
  581. rt_ssize_t transmit_size;
  582. while (send_size != size)
  583. {
  584. /* Copy one piece of data into the ringbuffer at a time
  585. * until the length of the data is equal to size */
  586. level = RT_SERIAL_FIFO_LOCK(&serial->spinlock);
  587. tx_fifo->put_size = rt_ringbuffer_put(&tx_fifo->rb,
  588. (rt_uint8_t *)buffer + send_size,
  589. size - send_size);
  590. rb_size = rt_ringbuffer_data_len(&tx_fifo->rb);
  591. RT_SERIAL_FIFO_UNLOCK(&serial->spinlock, level);
  592. /* clear tx_cpt flag */
  593. rt_completion_wait(&tx_fifo->tx_cpt, 0);
  594. /* Call the transmit interface for transmission again */
  595. /* Note that in interrupt mode, buffer and tx_fifo->put_size
  596. * are inactive parameters */
  597. transmit_size = serial->ops->transmit(serial,
  598. (rt_uint8_t *)buffer + send_size,
  599. tx_fifo->put_size,
  600. RT_SERIAL_TX_BLOCKING);
  601. if (transmit_size <= 0)
  602. {
  603. return send_size;
  604. }
  605. if (tx_timeout_left == RT_WAITING_NO)
  606. {
  607. /* The implementation of POSIX nonblock mode is to set tx_timeout to RT_WAITING_NO */
  608. #ifdef RT_USING_POSIX_STDIO
  609. if (serial->is_posix_mode)
  610. send_size += tx_fifo->put_size;
  611. #endif
  612. break;
  613. }
  614. /* Waiting for the transmission to complete */
  615. rt_completion_wait(&tx_fifo->tx_cpt, tx_timeout_left);
  616. if (tx_timeout_left != RT_WAITING_FOREVER)
  617. {
  618. delta_tick = rt_tick_get_delta(begin_tick);
  619. if (delta_tick >= base_tx_timeout)
  620. {
  621. level = RT_SERIAL_FIFO_LOCK(&serial->spinlock);
  622. send_size += rb_size - rt_ringbuffer_data_len(&tx_fifo->rb);
  623. RT_SERIAL_FIFO_UNLOCK(&serial->spinlock, level);
  624. return send_size;
  625. }
  626. tx_timeout_left = base_tx_timeout - delta_tick;
  627. }
  628. send_size += tx_fifo->put_size;
  629. }
  630. return send_size;
  631. }
  632. /**
  633. * @brief Serial transmit data routines, This function will transmit
  634. * data by using nonblocking.
  635. * @param dev The pointer of device driver structure
  636. * @param pos Empty parameter.
  637. * @param buffer Transmit data buffer.
  638. * @param size Transmit data buffer length.
  639. * @return Return the final length of data transmit.
  640. */
  641. static rt_ssize_t _serial_fifo_tx_nonblocking(struct rt_device *dev,
  642. rt_off_t pos,
  643. const void *buffer,
  644. rt_size_t size)
  645. {
  646. struct rt_serial_device *serial;
  647. struct rt_serial_tx_fifo *tx_fifo;
  648. rt_uint8_t *put_ptr = RT_NULL;
  649. rt_base_t level;
  650. rt_size_t send_size;
  651. rt_ssize_t transmit_size;
  652. if (size == 0)
  653. return 0;
  654. RT_ASSERT(dev != RT_NULL && buffer != RT_NULL);
  655. serial = (struct rt_serial_device *)dev;
  656. tx_fifo = (struct rt_serial_tx_fifo *)serial->serial_tx;
  657. RT_ASSERT(tx_fifo != RT_NULL);
  658. /* When serial transmit in tx_non_blocking mode, if the activated mode is RT_FALSE,
  659. * start copying data into the ringbuffer */
  660. if (!rt_atomic_flag_test_and_set(&tx_fifo->activated))
  661. {
  662. level = RT_SERIAL_FIFO_LOCK(&serial->spinlock);
  663. /* Copying data into the ringbuffer */
  664. send_size = rt_ringbuffer_put(&tx_fifo->rb, buffer, size);
  665. /* Get the linear length buffer from ringbuffer */
  666. tx_fifo->put_size = rt_serial_get_linear_buffer(&tx_fifo->rb, &put_ptr);
  667. RT_SERIAL_FIFO_UNLOCK(&serial->spinlock, level);
  668. /* clear tx_cpt flag */
  669. rt_completion_wait(&tx_fifo->tx_cpt, 0);
  670. /* Call the transmit interface for transmission again */
  671. /* Note that in interrupt mode, put_ptr and tx_fifo->put_size
  672. * are inactive parameters */
  673. transmit_size = serial->ops->transmit(serial,
  674. put_ptr,
  675. tx_fifo->put_size,
  676. RT_SERIAL_TX_NON_BLOCKING);
  677. if (transmit_size <= 0)
  678. {
  679. return 0;
  680. }
  681. /* In tx_nonblocking mode, there is no need to call rt_completion_wait() APIs to wait
  682. * for the rt_current_thread to resume */
  683. return send_size;
  684. }
  685. /* If the activated mode is RT_TRUE, it means that serial device is transmitting,
  686. * where only the data in the ringbuffer and there is no need to call the transmit() API.
  687. * Note that this part of the code requires disable interrupts
  688. * to prevent multi thread reentrant */
  689. level = RT_SERIAL_FIFO_LOCK(&serial->spinlock);
  690. /* Copying data into the ringbuffer */
  691. send_size = rt_ringbuffer_put(&tx_fifo->rb, buffer, size);
  692. RT_SERIAL_FIFO_UNLOCK(&serial->spinlock, level);
  693. return send_size;
  694. }
  695. /**
  696. * @brief Enable serial transmit mode.
  697. * @param dev The pointer of device driver structure
  698. * @param rx_oflag The flag of that the serial port opens.
  699. * @return Return the status of the operation.
  700. */
  701. static rt_err_t rt_serial_tx_enable(struct rt_device *dev,
  702. rt_uint16_t tx_oflag)
  703. {
  704. struct rt_serial_device *serial;
  705. struct rt_serial_tx_fifo *tx_fifo = RT_NULL;
  706. rt_err_t control_result = RT_EOK;
  707. RT_ASSERT(dev != RT_NULL);
  708. serial = (struct rt_serial_device *)dev;
  709. if (serial->config.tx_bufsz == 0)
  710. {
  711. /* Cannot use RT_SERIAL_TX_NON_BLOCKING when tx_bufsz is 0 */
  712. if (tx_oflag == RT_SERIAL_TX_NON_BLOCKING)
  713. {
  714. LOG_E("(%s) serial device with misconfigure: tx_bufsz = 0",
  715. dev->parent.name);
  716. return -RT_EINVAL;
  717. }
  718. #ifndef RT_USING_DEVICE_OPS
  719. dev->write = _serial_poll_tx;
  720. #endif
  721. dev->open_flag |= RT_SERIAL_TX_BLOCKING;
  722. return RT_EOK;
  723. }
  724. /* Limits the minimum value of tx_bufsz */
  725. if (serial->config.tx_bufsz < RT_SERIAL_TX_MINBUFSZ)
  726. serial->config.tx_bufsz = RT_SERIAL_TX_MINBUFSZ;
  727. if (tx_oflag == RT_SERIAL_TX_BLOCKING)
  728. {
  729. /* When using RT_SERIAL_TX_BLOCKING, it is necessary to determine
  730. * whether serial device needs to use buffer */
  731. /* Call the Control() API to get the operating mode */
  732. control_result = serial->ops->control(serial,
  733. RT_DEVICE_CHECK_OPTMODE,
  734. (void *)RT_DEVICE_FLAG_TX_BLOCKING);
  735. if (control_result < 0)
  736. {
  737. return control_result;
  738. }
  739. rt_err_t optmode = control_result;
  740. if (optmode == RT_SERIAL_TX_BLOCKING_BUFFER)
  741. {
  742. /* If use RT_SERIAL_TX_BLOCKING_BUFFER, the ringbuffer is initialized */
  743. tx_fifo = (struct rt_serial_tx_fifo *)rt_malloc(sizeof(struct rt_serial_tx_fifo) + serial->config.tx_bufsz);
  744. RT_ASSERT(tx_fifo != RT_NULL);
  745. rt_memset(tx_fifo, RT_NULL, sizeof(struct rt_serial_tx_fifo) + serial->config.tx_bufsz);
  746. rt_ringbuffer_init(&tx_fifo->rb,
  747. (rt_uint8_t *)tx_fifo + sizeof(struct rt_serial_tx_fifo),
  748. serial->config.tx_bufsz);
  749. serial->serial_tx = tx_fifo;
  750. #ifndef RT_USING_DEVICE_OPS
  751. dev->write = _serial_fifo_tx_blocking_buf;
  752. #endif
  753. }
  754. else if (optmode == RT_SERIAL_TX_BLOCKING_NO_BUFFER)
  755. {
  756. /* If not use RT_SERIAL_TX_BLOCKING_BUFFER,
  757. * the control() API is called to configure the serial device */
  758. tx_fifo = (struct rt_serial_tx_fifo *)rt_malloc(sizeof(struct rt_serial_tx_fifo));
  759. RT_ASSERT(tx_fifo != RT_NULL);
  760. rt_memset(tx_fifo, RT_NULL, sizeof(struct rt_serial_tx_fifo));
  761. /* Init rb.buffer_ptr to RT_NULL, in rt_serial_write() need check it
  762. * otherwise buffer_ptr maybe a random value, as rt_malloc not init memory */
  763. serial->serial_tx = tx_fifo;
  764. #ifndef RT_USING_DEVICE_OPS
  765. dev->write = _serial_fifo_tx_blocking_nbuf;
  766. #endif
  767. /* Call the control() API to configure the serial device by RT_SERIAL_TX_BLOCKING*/
  768. control_result = serial->ops->control(serial,
  769. RT_DEVICE_CTRL_CONFIG,
  770. (void *)RT_SERIAL_TX_BLOCKING);
  771. if (control_result < 0)
  772. {
  773. goto __exit;
  774. }
  775. }
  776. else
  777. {
  778. return -RT_EIO;
  779. }
  780. rt_atomic_flag_clear(&tx_fifo->activated);
  781. tx_fifo->put_size = 0;
  782. rt_atomic_store(&tx_fifo->tx_timeout, RT_WAITING_FOREVER);
  783. rt_completion_init(&tx_fifo->tx_cpt);
  784. dev->open_flag |= RT_SERIAL_TX_BLOCKING;
  785. return RT_EOK;
  786. }
  787. /* When using RT_SERIAL_TX_NON_BLOCKING, ringbuffer needs to be initialized,
  788. * and initialize the tx_fifo->activated value is RT_FALSE.
  789. */
  790. tx_fifo = (struct rt_serial_tx_fifo *)rt_malloc(sizeof(struct rt_serial_tx_fifo) + serial->config.tx_bufsz);
  791. RT_ASSERT(tx_fifo != RT_NULL);
  792. rt_memset(tx_fifo, RT_NULL, sizeof(struct rt_serial_tx_fifo) + serial->config.tx_bufsz);
  793. rt_ringbuffer_init(&tx_fifo->rb,
  794. (rt_uint8_t *)tx_fifo + sizeof(struct rt_serial_tx_fifo),
  795. serial->config.tx_bufsz);
  796. serial->serial_tx = tx_fifo;
  797. rt_atomic_flag_clear(&tx_fifo->activated);
  798. tx_fifo->put_size = 0;
  799. #ifndef RT_USING_DEVICE_OPS
  800. dev->write = _serial_fifo_tx_nonblocking;
  801. #endif
  802. rt_completion_init(&tx_fifo->tx_cpt);
  803. dev->open_flag |= RT_SERIAL_TX_NON_BLOCKING;
  804. /* Call the control() API to configure the serial device by RT_SERIAL_TX_NON_BLOCKING*/
  805. control_result = serial->ops->control(serial,
  806. RT_DEVICE_CTRL_CONFIG,
  807. (void *)RT_SERIAL_TX_NON_BLOCKING);
  808. __exit:
  809. return control_result;
  810. }
  811. /**
  812. * @brief Enable serial receive mode.
  813. * @param dev The pointer of device driver structure
  814. * @param rx_oflag The flag of that the serial port opens.
  815. * @return Return the status of the operation.
  816. */
  817. static rt_err_t rt_serial_rx_enable(struct rt_device *dev,
  818. rt_uint16_t rx_oflag)
  819. {
  820. struct rt_serial_device *serial;
  821. struct rt_serial_rx_fifo *rx_fifo = RT_NULL;
  822. rt_size_t rx_fifo_size = 0;
  823. RT_ASSERT(dev != RT_NULL);
  824. serial = (struct rt_serial_device *)dev;
  825. if (serial->config.rx_bufsz == 0)
  826. {
  827. /* Cannot use RT_SERIAL_RX_NON_BLOCKING when rx_bufsz is 0 */
  828. if (rx_oflag == RT_SERIAL_RX_NON_BLOCKING)
  829. {
  830. LOG_E("(%s) serial device with misconfigure: rx_bufsz = 0",
  831. dev->parent.name);
  832. return -RT_EINVAL;
  833. }
  834. #ifndef RT_USING_DEVICE_OPS
  835. dev->read = _serial_poll_rx;
  836. #endif
  837. dev->open_flag |= RT_SERIAL_RX_BLOCKING;
  838. return RT_EOK;
  839. }
  840. /* Limits the minimum value of rx_bufsz */
  841. if (serial->config.rx_bufsz < RT_SERIAL_RX_MINBUFSZ)
  842. serial->config.rx_bufsz = RT_SERIAL_RX_MINBUFSZ;
  843. #ifdef RT_SERIAL_USING_DMA
  844. if (serial->config.dma_ping_bufsz < RT_SERIAL_RX_MINBUFSZ / 2)
  845. serial->config.dma_ping_bufsz = RT_SERIAL_RX_MINBUFSZ / 2;
  846. rx_fifo_size = sizeof(struct rt_serial_rx_fifo) + serial->config.rx_bufsz + serial->config.dma_ping_bufsz;
  847. #else
  848. rx_fifo_size = sizeof(struct rt_serial_rx_fifo) + serial->config.rx_bufsz;
  849. #endif
  850. rx_fifo = (struct rt_serial_rx_fifo *)rt_malloc(rx_fifo_size);
  851. RT_ASSERT(rx_fifo != RT_NULL);
  852. rt_memset(rx_fifo, RT_NULL, rx_fifo_size);
  853. rt_ringbuffer_init(&rx_fifo->rb,
  854. (rt_uint8_t *)rx_fifo + sizeof(struct rt_serial_rx_fifo),
  855. serial->config.rx_bufsz);
  856. #ifdef RT_SERIAL_USING_DMA
  857. rt_ringbuffer_init(&rx_fifo->dma_ping_rb,
  858. (rt_uint8_t *)rx_fifo + sizeof(struct rt_serial_rx_fifo) + serial->config.rx_bufsz,
  859. serial->config.dma_ping_bufsz);
  860. #endif
  861. serial->serial_rx = rx_fifo;
  862. #ifndef RT_USING_DEVICE_OPS
  863. dev->read = _serial_fifo_rx;
  864. #endif
  865. if (rx_oflag == RT_SERIAL_RX_NON_BLOCKING)
  866. {
  867. dev->open_flag |= RT_SERIAL_RX_NON_BLOCKING;
  868. /* Call the control() API to configure the serial device by RT_SERIAL_RX_NON_BLOCKING*/
  869. return serial->ops->control(serial, RT_DEVICE_CTRL_CONFIG, (void *)RT_SERIAL_RX_NON_BLOCKING);
  870. }
  871. /* When using RT_SERIAL_RX_BLOCKING, rt_completion_init() and rx_cpt_index are initialized */
  872. rx_fifo->rx_cpt_index = 0;
  873. rt_atomic_store(&rx_fifo->rx_timeout, RT_WAITING_FOREVER);
  874. rt_completion_init(&rx_fifo->rx_cpt);
  875. dev->open_flag |= RT_SERIAL_RX_BLOCKING;
  876. /* Call the control() API to configure the serial device by RT_SERIAL_RX_BLOCKING*/
  877. return serial->ops->control(serial, RT_DEVICE_CTRL_CONFIG, (void *)RT_SERIAL_RX_BLOCKING);
  878. }
  879. /**
  880. * @brief Disable serial receive mode.
  881. * @param dev The pointer of device driver structure
  882. * @param rx_oflag The flag of that the serial port opens.
  883. * @return Return the status of the operation.
  884. */
  885. static rt_err_t rt_serial_rx_disable(struct rt_device *dev,
  886. rt_uint16_t rx_oflag)
  887. {
  888. struct rt_serial_device *serial;
  889. struct rt_serial_rx_fifo *rx_fifo;
  890. RT_ASSERT(dev != RT_NULL);
  891. serial = (struct rt_serial_device *)dev;
  892. #ifndef RT_USING_DEVICE_OPS
  893. dev->read = RT_NULL;
  894. #endif
  895. if (serial->serial_rx == RT_NULL)
  896. return RT_EOK;
  897. rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
  898. RT_ASSERT(rx_fifo != RT_NULL);
  899. if (rx_oflag == RT_SERIAL_RX_NON_BLOCKING)
  900. {
  901. dev->open_flag &= ~RT_SERIAL_RX_NON_BLOCKING;
  902. /* disable ignore return value */
  903. serial->ops->control(serial,
  904. RT_DEVICE_CTRL_CLR_INT,
  905. (void *)RT_SERIAL_RX_NON_BLOCKING);
  906. }
  907. else
  908. {
  909. rt_completion_done(&rx_fifo->rx_cpt);
  910. dev->open_flag &= ~RT_SERIAL_RX_BLOCKING;
  911. /* disable ignore return value */
  912. serial->ops->control(serial,
  913. RT_DEVICE_CTRL_CLR_INT,
  914. (void *)RT_SERIAL_RX_BLOCKING);
  915. }
  916. rt_free(rx_fifo);
  917. serial->serial_rx = RT_NULL;
  918. return RT_EOK;
  919. }
  920. /**
  921. * @brief Disable serial tranmit mode.
  922. * @param dev The pointer of device driver structure
  923. * @param rx_oflag The flag of that the serial port opens.
  924. * @return Return the status of the operation.
  925. */
  926. static rt_err_t rt_serial_tx_disable(struct rt_device *dev,
  927. rt_uint16_t tx_oflag)
  928. {
  929. struct rt_serial_device *serial;
  930. struct rt_serial_tx_fifo *tx_fifo;
  931. RT_ASSERT(dev != RT_NULL);
  932. serial = (struct rt_serial_device *)dev;
  933. #ifndef RT_USING_DEVICE_OPS
  934. dev->write = RT_NULL;
  935. #endif
  936. if (serial->serial_tx == RT_NULL)
  937. return RT_EOK;
  938. tx_fifo = (struct rt_serial_tx_fifo *)serial->serial_tx;
  939. RT_ASSERT(tx_fifo != RT_NULL);
  940. if (tx_oflag == RT_SERIAL_TX_NON_BLOCKING)
  941. {
  942. dev->open_flag &= ~RT_SERIAL_TX_NON_BLOCKING;
  943. /* disable ignore return value */
  944. serial->ops->control(serial,
  945. RT_DEVICE_CTRL_CLR_INT,
  946. (void *)RT_SERIAL_TX_NON_BLOCKING);
  947. }
  948. else
  949. {
  950. rt_completion_done(&tx_fifo->tx_cpt);
  951. dev->open_flag &= ~RT_SERIAL_TX_BLOCKING;
  952. /* disable ignore return value */
  953. serial->ops->control(serial,
  954. RT_DEVICE_CTRL_CLR_INT,
  955. (void *)RT_SERIAL_TX_BLOCKING);
  956. }
  957. rt_free(tx_fifo);
  958. serial->serial_tx = RT_NULL;
  959. return RT_EOK;
  960. }
  961. /**
  962. * @brief Initialize the serial device.
  963. * @param dev The pointer of device driver structure
  964. * @return Return the status of the operation.
  965. */
  966. static rt_err_t rt_serial_init(struct rt_device *dev)
  967. {
  968. rt_err_t result = RT_EOK;
  969. struct rt_serial_device *serial;
  970. RT_ASSERT(dev != RT_NULL);
  971. serial = (struct rt_serial_device *)dev;
  972. RT_ASSERT(serial->ops->transmit != RT_NULL);
  973. /* initialize rx/tx */
  974. serial->serial_rx = RT_NULL;
  975. serial->serial_tx = RT_NULL;
  976. /* apply configuration */
  977. if (serial->ops->configure)
  978. result = serial->ops->configure(serial, &serial->config);
  979. return result;
  980. }
  981. /**
  982. * @brief Close the serial device.
  983. * @param dev The pointer of device driver structure
  984. * @return Return the status of the operation.
  985. */
  986. static rt_err_t rt_serial_close(struct rt_device *dev)
  987. {
  988. struct rt_serial_device *serial;
  989. RT_ASSERT(dev != RT_NULL);
  990. serial = (struct rt_serial_device *)dev;
  991. /* Disable serial receive mode. */
  992. rt_serial_rx_disable(dev, dev->open_flag & (RT_SERIAL_RX_BLOCKING | RT_SERIAL_RX_NON_BLOCKING));
  993. /* Disable serial tranmit mode. */
  994. rt_serial_tx_disable(dev, dev->open_flag & (RT_SERIAL_TX_BLOCKING | RT_SERIAL_TX_NON_BLOCKING));
  995. /* Clear the callback function */
  996. serial->parent.rx_indicate = RT_NULL;
  997. serial->parent.tx_complete = RT_NULL;
  998. rt_memset(&serial->rx_notify, RT_NULL, sizeof(struct rt_device_notify));
  999. /* Call the control() API to close the serial device. disable ignore return value */
  1000. serial->ops->control(serial, RT_DEVICE_CTRL_CLOSE, RT_NULL);
  1001. dev->flag &= ~RT_DEVICE_FLAG_ACTIVATED;
  1002. return RT_EOK;
  1003. }
  1004. /**
  1005. * @brief Open the serial device.
  1006. * @param dev The pointer of device driver structure
  1007. * @param oflag The flag of that the serial port opens.
  1008. * @return Return the status of the operation.
  1009. */
  1010. static rt_err_t rt_serial_open(struct rt_device *dev, rt_uint16_t oflag)
  1011. {
  1012. struct rt_serial_device *serial;
  1013. rt_err_t result = RT_EOK;
  1014. RT_ASSERT(dev != RT_NULL);
  1015. serial = (struct rt_serial_device *)dev;
  1016. LOG_D("open serial device: 0x%08x with open flag: 0x%04x", dev, oflag);
  1017. /* By default, the receive mode of a serial devide is RT_SERIAL_RX_NON_BLOCKING */
  1018. if ((oflag & RT_SERIAL_RX_BLOCKING) == RT_SERIAL_RX_BLOCKING)
  1019. dev->open_flag |= RT_SERIAL_RX_BLOCKING;
  1020. else
  1021. dev->open_flag |= RT_SERIAL_RX_NON_BLOCKING;
  1022. /* By default, the transmit mode of a serial devide is RT_SERIAL_TX_BLOCKING */
  1023. if ((oflag & RT_SERIAL_TX_NON_BLOCKING) == RT_SERIAL_TX_NON_BLOCKING)
  1024. dev->open_flag |= RT_SERIAL_TX_NON_BLOCKING;
  1025. else
  1026. dev->open_flag |= RT_SERIAL_TX_BLOCKING;
  1027. /* set steam flag */
  1028. if ((oflag & RT_DEVICE_FLAG_STREAM) || (dev->open_flag & RT_DEVICE_FLAG_STREAM))
  1029. dev->open_flag |= RT_DEVICE_FLAG_STREAM;
  1030. /* initialize the Rx structure according to open flag */
  1031. if (serial->serial_rx == RT_NULL)
  1032. {
  1033. result = rt_serial_rx_enable(dev, dev->open_flag & (RT_SERIAL_RX_BLOCKING | RT_SERIAL_RX_NON_BLOCKING));
  1034. if (result != RT_EOK)
  1035. {
  1036. rt_serial_close(dev);
  1037. goto __exit;
  1038. }
  1039. }
  1040. /* initialize the Tx structure according to open flag */
  1041. if (serial->serial_tx == RT_NULL)
  1042. {
  1043. result = rt_serial_tx_enable(dev, dev->open_flag & (RT_SERIAL_TX_BLOCKING | RT_SERIAL_TX_NON_BLOCKING));
  1044. if (result != RT_EOK)
  1045. {
  1046. rt_serial_close(dev);
  1047. goto __exit;
  1048. }
  1049. }
  1050. __exit:
  1051. return result;
  1052. }
  1053. static void _serial_rx_flush(struct rt_serial_device *serial)
  1054. {
  1055. rt_base_t level;
  1056. struct rt_serial_rx_fifo *rx_fifo;
  1057. RT_ASSERT(serial != RT_NULL);
  1058. if (serial->config.rx_bufsz == 0)
  1059. {
  1060. rt_uint32_t rx_flush_limit = 0xFFFFFFF;
  1061. while (serial->ops->getc(serial) != -1 && rx_flush_limit > 0)
  1062. {
  1063. rx_flush_limit--;
  1064. }
  1065. }
  1066. else
  1067. {
  1068. rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
  1069. RT_ASSERT(rx_fifo != RT_NULL);
  1070. level = rt_spin_lock_irqsave(&serial->spinlock);
  1071. rt_completion_wait(&rx_fifo->rx_cpt, 0);
  1072. rt_ringbuffer_reset(&rx_fifo->rb);
  1073. rx_fifo->rx_cpt_index = 0;
  1074. #ifdef RT_SERIAL_USING_DMA
  1075. rt_serial_update_read_index(&rx_fifo->dma_ping_rb, rt_ringbuffer_get_size(&rx_fifo->dma_ping_rb));
  1076. #endif
  1077. rt_spin_unlock_irqrestore(&serial->spinlock, level);
  1078. }
  1079. }
  1080. static void _serial_tx_flush(struct rt_serial_device *serial)
  1081. {
  1082. struct rt_serial_tx_fifo *tx_fifo;
  1083. RT_ASSERT(serial != RT_NULL);
  1084. if (serial->config.tx_bufsz != 0)
  1085. {
  1086. tx_fifo = (struct rt_serial_tx_fifo *)serial->serial_tx;
  1087. RT_ASSERT(tx_fifo != RT_NULL);
  1088. if (rt_atomic_load(&tx_fifo->activated))
  1089. {
  1090. rt_completion_wait(&tx_fifo->tx_cpt, RT_WAITING_FOREVER);
  1091. }
  1092. }
  1093. }
  1094. static rt_err_t _serial_get_unread_bytes_count(struct rt_serial_device *serial, rt_ssize_t *unread_bytes)
  1095. {
  1096. rt_base_t level;
  1097. struct rt_serial_rx_fifo *rx_fifo;
  1098. RT_ASSERT(serial != RT_NULL);
  1099. if (serial->config.rx_bufsz == 0)
  1100. {
  1101. LOG_W("get unread bytes count not support in poll mode.");
  1102. *unread_bytes = -1;
  1103. return -RT_EPERM;
  1104. }
  1105. rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
  1106. RT_ASSERT(rx_fifo != RT_NULL);
  1107. level = RT_SERIAL_FIFO_LOCK(&serial->spinlock);
  1108. *unread_bytes = rt_ringbuffer_data_len(&rx_fifo->rb);
  1109. RT_SERIAL_FIFO_UNLOCK(&serial->spinlock, level);
  1110. return RT_EOK;
  1111. }
  1112. #ifdef RT_USING_POSIX_TERMIOS
  1113. struct speed_baudrate_item
  1114. {
  1115. speed_t speed;
  1116. int baudrate;
  1117. };
  1118. const static struct speed_baudrate_item _tbl[] = {
  1119. { B2400, BAUD_RATE_2400 },
  1120. { B4800, BAUD_RATE_4800 },
  1121. { B9600, BAUD_RATE_9600 },
  1122. { B19200, BAUD_RATE_19200 },
  1123. { B38400, BAUD_RATE_38400 },
  1124. { B57600, BAUD_RATE_57600 },
  1125. { B115200, BAUD_RATE_115200 },
  1126. { B230400, BAUD_RATE_230400 },
  1127. { B460800, BAUD_RATE_460800 },
  1128. { B500000, BAUD_RATE_500000 },
  1129. { B921600, BAUD_RATE_921600 },
  1130. { B2000000, BAUD_RATE_2000000 },
  1131. { B3000000, BAUD_RATE_3000000 },
  1132. };
  1133. static speed_t _get_speed(int baudrate)
  1134. {
  1135. int index;
  1136. for (index = 0; index < sizeof(_tbl) / sizeof(_tbl[0]); index++)
  1137. {
  1138. if (_tbl[index].baudrate == baudrate)
  1139. return _tbl[index].speed;
  1140. }
  1141. return B0;
  1142. }
  1143. static int _get_baudrate(speed_t speed)
  1144. {
  1145. int index;
  1146. for (index = 0; index < sizeof(_tbl) / sizeof(_tbl[0]); index++)
  1147. {
  1148. if (_tbl[index].speed == speed)
  1149. return _tbl[index].baudrate;
  1150. }
  1151. return 0;
  1152. }
  1153. static void _tc_flush(struct rt_serial_device *serial, int queue)
  1154. {
  1155. RT_ASSERT(serial != RT_NULL);
  1156. if (queue == TCIFLUSH || queue == TCIOFLUSH)
  1157. {
  1158. _serial_rx_flush(serial);
  1159. }
  1160. if (queue == TCOFLUSH || queue == TCIOFLUSH)
  1161. {
  1162. _serial_tx_flush(serial);
  1163. }
  1164. }
  1165. #endif /* RT_USING_POSIX_TERMIOS */
  1166. /**
  1167. * @brief Control the serial device.
  1168. * @param dev The pointer of device driver structure
  1169. * @param cmd The command value that controls the serial device
  1170. * @param args The parameter value that controls the serial device
  1171. * @return Return the status of the operation.
  1172. */
  1173. static rt_err_t rt_serial_control(struct rt_device *dev,
  1174. int cmd,
  1175. void *args)
  1176. {
  1177. rt_err_t ret = RT_EOK;
  1178. struct rt_serial_device *serial;
  1179. RT_ASSERT(dev != RT_NULL);
  1180. serial = (struct rt_serial_device *)dev;
  1181. switch ((rt_ubase_t)cmd)
  1182. {
  1183. case RT_DEVICE_CTRL_SUSPEND:
  1184. /* suspend device */
  1185. dev->flag |= RT_DEVICE_FLAG_SUSPENDED;
  1186. break;
  1187. case RT_DEVICE_CTRL_RESUME:
  1188. /* resume device */
  1189. dev->flag &= ~RT_DEVICE_FLAG_SUSPENDED;
  1190. break;
  1191. case RT_DEVICE_CTRL_CONFIG:
  1192. if (args == RT_NULL)
  1193. {
  1194. ret = -RT_EINVAL;
  1195. }
  1196. else
  1197. {
  1198. struct serial_configure *pconfig = (struct serial_configure *)args;
  1199. if (((pconfig->rx_bufsz != serial->config.rx_bufsz) || (pconfig->tx_bufsz != serial->config.tx_bufsz)
  1200. #ifdef RT_SERIAL_USING_DMA
  1201. || (pconfig->dma_ping_bufsz != serial->config.dma_ping_bufsz)
  1202. #endif
  1203. ) &&
  1204. serial->parent.ref_count != 0)
  1205. {
  1206. /*can not change buffer size*/
  1207. ret = -RT_EBUSY;
  1208. break;
  1209. }
  1210. /* set serial configure */
  1211. serial->config = *pconfig;
  1212. serial->ops->configure(serial, (struct serial_configure *)args);
  1213. }
  1214. break;
  1215. case RT_SERIAL_CTRL_GET_CONFIG:
  1216. if (args == RT_NULL)
  1217. {
  1218. ret = -RT_EINVAL;
  1219. }
  1220. else
  1221. {
  1222. struct serial_configure *pconfig = (struct serial_configure *)args;
  1223. *pconfig = serial->config;
  1224. }
  1225. break;
  1226. case RT_DEVICE_CTRL_NOTIFY_SET:
  1227. if (args == RT_NULL)
  1228. {
  1229. ret = -RT_EINVAL;
  1230. }
  1231. else
  1232. {
  1233. rt_memcpy(&serial->rx_notify, args, sizeof(struct rt_device_notify));
  1234. }
  1235. break;
  1236. case RT_DEVICE_CTRL_CONSOLE_OFLAG:
  1237. if (args == RT_NULL)
  1238. {
  1239. ret = -RT_EINVAL;
  1240. }
  1241. else
  1242. {
  1243. *(rt_uint16_t *)args = RT_DEVICE_FLAG_RDWR | RT_SERIAL_RX_BLOCKING | RT_SERIAL_TX_BLOCKING | RT_DEVICE_FLAG_STREAM;
  1244. }
  1245. break;
  1246. /* Call before rt_device_read */
  1247. case RT_SERIAL_CTRL_SET_RX_TIMEOUT:
  1248. if (args == RT_NULL)
  1249. {
  1250. ret = -RT_EINVAL;
  1251. }
  1252. else
  1253. {
  1254. if (serial->config.rx_bufsz == 0)
  1255. {
  1256. ret = -RT_EPERM;
  1257. break;
  1258. }
  1259. struct rt_serial_rx_fifo *rx_fifo = RT_NULL;
  1260. rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
  1261. RT_ASSERT(rx_fifo != RT_NULL);
  1262. rt_atomic_store(&rx_fifo->rx_timeout, *(rt_int32_t *)args);
  1263. }
  1264. break;
  1265. /* Call before rt_device_write */
  1266. case RT_SERIAL_CTRL_SET_TX_TIMEOUT:
  1267. if (args == RT_NULL)
  1268. {
  1269. ret = -RT_EINVAL;
  1270. }
  1271. else
  1272. {
  1273. if (serial->config.tx_bufsz == 0)
  1274. {
  1275. ret = -RT_EPERM;
  1276. break;
  1277. }
  1278. struct rt_serial_tx_fifo *tx_fifo = RT_NULL;
  1279. tx_fifo = (struct rt_serial_tx_fifo *)serial->serial_tx;
  1280. RT_ASSERT(tx_fifo != RT_NULL);
  1281. rt_atomic_store(&tx_fifo->tx_timeout, *(rt_int32_t *)args);
  1282. }
  1283. break;
  1284. case RT_SERIAL_CTRL_GET_RX_TIMEOUT:
  1285. if (args == RT_NULL)
  1286. {
  1287. ret = -RT_EINVAL;
  1288. }
  1289. else
  1290. {
  1291. if (serial->config.rx_bufsz == 0)
  1292. {
  1293. ret = -RT_EPERM;
  1294. break;
  1295. }
  1296. struct rt_serial_rx_fifo *rx_fifo = RT_NULL;
  1297. rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
  1298. RT_ASSERT(rx_fifo != RT_NULL);
  1299. *(rt_int32_t *)args = rt_atomic_load(&rx_fifo->rx_timeout);
  1300. }
  1301. break;
  1302. case RT_SERIAL_CTRL_GET_TX_TIMEOUT:
  1303. if (args == RT_NULL)
  1304. {
  1305. ret = -RT_EINVAL;
  1306. }
  1307. else
  1308. {
  1309. if (serial->config.tx_bufsz == 0)
  1310. {
  1311. ret = -RT_EPERM;
  1312. break;
  1313. }
  1314. struct rt_serial_tx_fifo *tx_fifo = RT_NULL;
  1315. tx_fifo = (struct rt_serial_tx_fifo *)serial->serial_tx;
  1316. RT_ASSERT(tx_fifo != RT_NULL);
  1317. *(rt_int32_t *)args = rt_atomic_load(&tx_fifo->tx_timeout);
  1318. }
  1319. break;
  1320. /* Discard all data */
  1321. case RT_SERIAL_CTRL_RX_FLUSH:
  1322. _serial_rx_flush(serial);
  1323. break;
  1324. /* Blocking and wait for the send buffer data to be sent. */
  1325. case RT_SERIAL_CTRL_TX_FLUSH:
  1326. _serial_tx_flush(serial);
  1327. break;
  1328. /* get unread bytes count. */
  1329. case RT_SERIAL_CTRL_GET_UNREAD_BYTES_COUNT:
  1330. if (args == RT_NULL)
  1331. {
  1332. ret = -RT_EINVAL;
  1333. }
  1334. else
  1335. {
  1336. ret = _serial_get_unread_bytes_count(serial, (rt_ssize_t *)args);
  1337. }
  1338. break;
  1339. #ifdef RT_USING_POSIX_STDIO
  1340. #ifdef RT_USING_POSIX_TERMIOS
  1341. case TCGETA:
  1342. {
  1343. struct termios *tio = (struct termios *)args;
  1344. if (tio == RT_NULL)
  1345. return -RT_EINVAL;
  1346. tio->c_iflag = 0;
  1347. tio->c_oflag = 0;
  1348. tio->c_lflag = 0;
  1349. /* update oflag for console device */
  1350. if (rt_console_get_device() == dev)
  1351. tio->c_oflag = OPOST | ONLCR;
  1352. /* set cflag */
  1353. tio->c_cflag = 0;
  1354. if (serial->config.data_bits == DATA_BITS_5)
  1355. tio->c_cflag = CS5;
  1356. else if (serial->config.data_bits == DATA_BITS_6)
  1357. tio->c_cflag = CS6;
  1358. else if (serial->config.data_bits == DATA_BITS_7)
  1359. tio->c_cflag = CS7;
  1360. else if (serial->config.data_bits == DATA_BITS_8)
  1361. tio->c_cflag = CS8;
  1362. if (serial->config.stop_bits == STOP_BITS_2)
  1363. tio->c_cflag |= CSTOPB;
  1364. if (serial->config.parity == PARITY_EVEN)
  1365. tio->c_cflag |= PARENB;
  1366. else if (serial->config.parity == PARITY_ODD)
  1367. tio->c_cflag |= (PARODD | PARENB);
  1368. if (serial->config.flowcontrol == RT_SERIAL_FLOWCONTROL_CTSRTS)
  1369. tio->c_cflag |= CRTSCTS;
  1370. cfsetospeed(tio, _get_speed(serial->config.baud_rate));
  1371. }
  1372. break;
  1373. case TCSETAW:
  1374. case TCSETAF:
  1375. case TCSETA:
  1376. {
  1377. int baudrate;
  1378. struct serial_configure config;
  1379. struct termios *tio = (struct termios *)args;
  1380. if (tio == RT_NULL)
  1381. return -RT_EINVAL;
  1382. config = serial->config;
  1383. baudrate = _get_baudrate(cfgetospeed(tio));
  1384. config.baud_rate = baudrate;
  1385. switch (tio->c_cflag & CSIZE)
  1386. {
  1387. case CS5:
  1388. config.data_bits = DATA_BITS_5;
  1389. break;
  1390. case CS6:
  1391. config.data_bits = DATA_BITS_6;
  1392. break;
  1393. case CS7:
  1394. config.data_bits = DATA_BITS_7;
  1395. break;
  1396. default:
  1397. config.data_bits = DATA_BITS_8;
  1398. break;
  1399. }
  1400. if (tio->c_cflag & CSTOPB)
  1401. config.stop_bits = STOP_BITS_2;
  1402. else
  1403. config.stop_bits = STOP_BITS_1;
  1404. if (tio->c_cflag & PARENB)
  1405. {
  1406. if (tio->c_cflag & PARODD)
  1407. config.parity = PARITY_ODD;
  1408. else
  1409. config.parity = PARITY_EVEN;
  1410. }
  1411. else
  1412. config.parity = PARITY_NONE;
  1413. if (tio->c_cflag & CRTSCTS)
  1414. config.flowcontrol = RT_SERIAL_FLOWCONTROL_CTSRTS;
  1415. else
  1416. config.flowcontrol = RT_SERIAL_FLOWCONTROL_NONE;
  1417. /* set serial configure */
  1418. serial->config = config;
  1419. serial->ops->configure(serial, &config);
  1420. }
  1421. break;
  1422. case TCFLSH:
  1423. {
  1424. int queue = (int)args;
  1425. _tc_flush(serial, queue);
  1426. }
  1427. break;
  1428. case TCXONC:
  1429. break;
  1430. #endif /*RT_USING_POSIX_TERMIOS*/
  1431. case TIOCSWINSZ:
  1432. {
  1433. struct winsize *p_winsize;
  1434. p_winsize = (struct winsize *)args;
  1435. rt_kprintf("\x1b[8;%d;%dt", p_winsize->ws_col, p_winsize->ws_row);
  1436. }
  1437. break;
  1438. case TIOCGWINSZ:
  1439. {
  1440. struct winsize *p_winsize;
  1441. p_winsize = (struct winsize *)args;
  1442. if (rt_thread_self() != rt_thread_find(FINSH_THREAD_NAME))
  1443. {
  1444. /* only can be used in tshell thread; otherwise, return default size */
  1445. p_winsize->ws_col = 80;
  1446. p_winsize->ws_row = 24;
  1447. }
  1448. else
  1449. {
  1450. #include <shell.h>
  1451. #define _TIO_BUFLEN 20
  1452. char _tio_buf[_TIO_BUFLEN];
  1453. unsigned char cnt1, cnt2, cnt3, i;
  1454. char row_s[4], col_s[4];
  1455. char *p;
  1456. rt_memset(_tio_buf, 0, _TIO_BUFLEN);
  1457. /* send the command to terminal for getting the window size of the terminal */
  1458. rt_kprintf("\033[18t");
  1459. /* waiting for the response from the terminal */
  1460. i = 0;
  1461. while (i < _TIO_BUFLEN)
  1462. {
  1463. _tio_buf[i] = finsh_getchar();
  1464. if (_tio_buf[i] != 't')
  1465. {
  1466. i++;
  1467. }
  1468. else
  1469. {
  1470. break;
  1471. }
  1472. }
  1473. if (i == _TIO_BUFLEN)
  1474. {
  1475. /* buffer overloaded, and return default size */
  1476. p_winsize->ws_col = 80;
  1477. p_winsize->ws_row = 24;
  1478. break;
  1479. }
  1480. /* interpreting data eg: "\033[8;1;15t" which means row is 1 and col is 15 (unit: size of ONE character) */
  1481. rt_memset(row_s, 0, 4);
  1482. rt_memset(col_s, 0, 4);
  1483. cnt1 = 0;
  1484. while (cnt1 < _TIO_BUFLEN && _tio_buf[cnt1] != ';')
  1485. {
  1486. cnt1++;
  1487. }
  1488. cnt2 = ++cnt1;
  1489. while (cnt2 < _TIO_BUFLEN && _tio_buf[cnt2] != ';')
  1490. {
  1491. cnt2++;
  1492. }
  1493. p = row_s;
  1494. while (cnt1 < cnt2)
  1495. {
  1496. *p++ = _tio_buf[cnt1++];
  1497. }
  1498. p = col_s;
  1499. cnt2++;
  1500. cnt3 = rt_strlen(_tio_buf) - 1;
  1501. while (cnt2 < cnt3)
  1502. {
  1503. *p++ = _tio_buf[cnt2++];
  1504. }
  1505. /* load the window size date */
  1506. p_winsize->ws_col = atoi(col_s);
  1507. p_winsize->ws_row = atoi(row_s);
  1508. #undef _TIO_BUFLEN
  1509. }
  1510. p_winsize->ws_xpixel = 0; /* unused */
  1511. p_winsize->ws_ypixel = 0; /* unused */
  1512. }
  1513. break;
  1514. case FIONREAD:
  1515. if (args == RT_NULL)
  1516. {
  1517. ret = -RT_EINVAL;
  1518. }
  1519. else
  1520. {
  1521. rt_ssize_t unread_bytes = 0;
  1522. ret = _serial_get_unread_bytes_count(serial, &unread_bytes);
  1523. if (ret == RT_EOK)
  1524. *(rt_size_t *)args = (rt_size_t)unread_bytes;
  1525. else
  1526. *(rt_size_t *)args = 0;
  1527. }
  1528. break;
  1529. #endif /* RT_USING_POSIX_STDIO */
  1530. default:
  1531. /* control device */
  1532. ret = serial->ops->control(serial, cmd, args);
  1533. break;
  1534. }
  1535. return ret;
  1536. }
  1537. #ifdef RT_USING_DEVICE_OPS
  1538. static rt_ssize_t rt_serial_read(struct rt_device *dev,
  1539. rt_off_t pos,
  1540. void *buffer,
  1541. rt_size_t size)
  1542. {
  1543. struct rt_serial_device *serial;
  1544. RT_ASSERT(dev != RT_NULL);
  1545. if (size == 0)
  1546. return 0;
  1547. serial = (struct rt_serial_device *)dev;
  1548. if (serial->config.rx_bufsz)
  1549. {
  1550. return _serial_fifo_rx(dev, pos, buffer, size);
  1551. }
  1552. return _serial_poll_rx(dev, pos, buffer, size);
  1553. }
  1554. static rt_ssize_t rt_serial_write(struct rt_device *dev,
  1555. rt_off_t pos,
  1556. const void *buffer,
  1557. rt_size_t size)
  1558. {
  1559. struct rt_serial_device *serial;
  1560. struct rt_serial_tx_fifo *tx_fifo;
  1561. RT_ASSERT(dev != RT_NULL);
  1562. if (size == 0)
  1563. return 0;
  1564. serial = (struct rt_serial_device *)dev;
  1565. RT_ASSERT((serial != RT_NULL) && (buffer != RT_NULL));
  1566. tx_fifo = (struct rt_serial_tx_fifo *)serial->serial_tx;
  1567. if (serial->config.tx_bufsz == 0)
  1568. {
  1569. return _serial_poll_tx(dev, pos, buffer, size);
  1570. }
  1571. if (dev->open_flag & RT_SERIAL_TX_BLOCKING)
  1572. {
  1573. RT_ASSERT(tx_fifo != RT_NULL);
  1574. if ((tx_fifo->rb.buffer_ptr) == RT_NULL)
  1575. {
  1576. return _serial_fifo_tx_blocking_nbuf(dev, pos, buffer, size);
  1577. }
  1578. return _serial_fifo_tx_blocking_buf(dev, pos, buffer, size);
  1579. }
  1580. return _serial_fifo_tx_nonblocking(dev, pos, buffer, size);
  1581. }
  1582. const static struct rt_device_ops serial_ops = {
  1583. rt_serial_init,
  1584. rt_serial_open,
  1585. rt_serial_close,
  1586. rt_serial_read,
  1587. rt_serial_write,
  1588. rt_serial_control
  1589. };
  1590. #endif
  1591. /**
  1592. * @brief Register the serial device.
  1593. * @param serial RT-thread serial device.
  1594. * @param name The device driver's name
  1595. * @param flag The capabilities flag of device.
  1596. * @param data The device driver's data.
  1597. * @return Return the status of the operation.
  1598. */
  1599. rt_err_t rt_hw_serial_register(struct rt_serial_device *serial,
  1600. const char *name,
  1601. rt_uint32_t flag,
  1602. void *data)
  1603. {
  1604. rt_err_t ret;
  1605. struct rt_device *device;
  1606. RT_ASSERT(serial != RT_NULL);
  1607. rt_spin_lock_init(&serial->spinlock);
  1608. device = &serial->parent;
  1609. device->type = RT_Device_Class_Char;
  1610. device->rx_indicate = RT_NULL;
  1611. device->tx_complete = RT_NULL;
  1612. #ifdef RT_USING_DEVICE_OPS
  1613. device->ops = &serial_ops;
  1614. #else
  1615. device->init = rt_serial_init;
  1616. device->open = rt_serial_open;
  1617. device->close = rt_serial_close;
  1618. device->read = RT_NULL;
  1619. device->write = RT_NULL;
  1620. device->control = rt_serial_control;
  1621. #endif
  1622. device->user_data = data;
  1623. /* register a character device */
  1624. ret = rt_device_register(device, name, flag);
  1625. #ifdef RT_USING_POSIX_STDIO
  1626. /* set fops */
  1627. device->fops = &_serial_fops;
  1628. #endif
  1629. return ret;
  1630. }
  1631. /**
  1632. * @brief ISR for serial interrupt
  1633. * @param serial RT-thread serial device.
  1634. * @param event ISR event type.
  1635. */
  1636. rt_err_t rt_hw_serial_control_isr(struct rt_serial_device *serial, int cmd, void *args)
  1637. {
  1638. RT_ASSERT(serial != RT_NULL);
  1639. rt_err_t ret = RT_EOK;
  1640. switch (cmd)
  1641. {
  1642. case RT_HW_SERIAL_CTRL_PUTC:
  1643. if (args == RT_NULL)
  1644. {
  1645. ret = -RT_EINVAL;
  1646. }
  1647. else
  1648. {
  1649. struct rt_serial_rx_fifo *rx_fifo = RT_NULL;
  1650. rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
  1651. RT_ASSERT(rx_fifo != RT_NULL);
  1652. #ifdef RT_SERIAL_BUF_STRATEGY_DROP
  1653. rt_ringbuffer_putchar(&rx_fifo->rb, *(rt_uint8_t *)args);
  1654. #else
  1655. rt_ringbuffer_putchar_force(&rx_fifo->rb, *(rt_uint8_t *)args);
  1656. #endif /* RT_SERIAL_BUF_STRATEGY_DROP */
  1657. }
  1658. break;
  1659. case RT_HW_SERIAL_CTRL_GETC:
  1660. if (args == RT_NULL)
  1661. {
  1662. ret = -RT_EINVAL;
  1663. }
  1664. else
  1665. {
  1666. struct rt_serial_tx_fifo *tx_fifo = RT_NULL;
  1667. tx_fifo = (struct rt_serial_tx_fifo *)serial->serial_tx;
  1668. RT_ASSERT(tx_fifo != RT_NULL);
  1669. if (rt_ringbuffer_getchar(&tx_fifo->rb, (rt_uint8_t *)args) == 0)
  1670. {
  1671. ret = -RT_EEMPTY;
  1672. }
  1673. }
  1674. break;
  1675. #ifdef RT_SERIAL_USING_DMA
  1676. case RT_HW_SERIAL_CTRL_GET_DMA_PING_BUF:
  1677. if (args == RT_NULL)
  1678. {
  1679. ret = -RT_EINVAL;
  1680. }
  1681. else
  1682. {
  1683. struct rt_serial_rx_fifo *rx_fifo = RT_NULL;
  1684. rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
  1685. RT_ASSERT(rx_fifo != RT_NULL);
  1686. *(rt_uint8_t **)args = rx_fifo->dma_ping_rb.buffer_ptr;
  1687. }
  1688. break;
  1689. #endif
  1690. default:
  1691. ret = -RT_EINVAL;
  1692. break;
  1693. }
  1694. return ret;
  1695. }
  1696. /**
  1697. * @brief ISR for serial interrupt
  1698. * @param serial RT-thread serial device.
  1699. * @param event ISR event type.
  1700. */
  1701. void rt_hw_serial_isr(struct rt_serial_device *serial, int event)
  1702. {
  1703. RT_ASSERT(serial != RT_NULL);
  1704. switch (event & 0xff)
  1705. {
  1706. /* Interrupt receive event */
  1707. case RT_SERIAL_EVENT_RX_IND:
  1708. case RT_SERIAL_EVENT_RX_DMADONE:
  1709. {
  1710. struct rt_serial_rx_fifo *rx_fifo;
  1711. rt_size_t rx_length;
  1712. rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
  1713. RT_ASSERT(rx_fifo != RT_NULL);
  1714. #ifdef RT_SERIAL_USING_DMA
  1715. rt_base_t level;
  1716. /* If the event is RT_SERIAL_EVENT_RX_IND, rx_length is equal to 0 */
  1717. rx_length = event >> 8;
  1718. /* RT_SERIAL_EVENT_RX_DMADONE MODE */
  1719. if (rx_length != 0)
  1720. {
  1721. #ifdef RT_SERIAL_BUF_STRATEGY_DROP
  1722. rt_uint8_t *ptr;
  1723. rt_size_t size;
  1724. rt_size_t put_len;
  1725. /* UART_IT_IDLE and dma isr */
  1726. level = rt_spin_lock_irqsave(&serial->spinlock);
  1727. do
  1728. {
  1729. rt_serial_update_write_index(&rx_fifo->dma_ping_rb, rx_length);
  1730. size = rt_ringbuffer_get_direct(&rx_fifo->dma_ping_rb, &ptr);
  1731. put_len = rt_ringbuffer_put(&rx_fifo->rb, ptr, size);
  1732. if (put_len != size)
  1733. break;
  1734. size = rt_ringbuffer_get_direct(&rx_fifo->dma_ping_rb, &ptr);
  1735. if (size == 0)
  1736. break;
  1737. rt_ringbuffer_put(&rx_fifo->rb, ptr, size);
  1738. } while (0);
  1739. rt_spin_unlock_irqrestore(&serial->spinlock, level);
  1740. #else
  1741. rt_uint8_t *ptr;
  1742. rt_size_t size;
  1743. /* UART_IT_IDLE and dma isr */
  1744. level = rt_spin_lock_irqsave(&serial->spinlock);
  1745. do
  1746. {
  1747. rt_serial_update_write_index(&rx_fifo->dma_ping_rb, rx_length);
  1748. size = rt_ringbuffer_get_direct(&rx_fifo->dma_ping_rb, &ptr);
  1749. rt_ringbuffer_put_force(&rx_fifo->rb, ptr, size);
  1750. size = rt_ringbuffer_get_direct(&rx_fifo->dma_ping_rb, &ptr);
  1751. if (size == 0)
  1752. break;
  1753. rt_ringbuffer_put_force(&rx_fifo->rb, ptr, size);
  1754. } while (0);
  1755. rt_spin_unlock_irqrestore(&serial->spinlock, level);
  1756. #endif /* RT_SERIAL_BUF_STRATEGY_DROP */
  1757. }
  1758. #endif /* RT_SERIAL_USING_DMA */
  1759. rx_length = rt_ringbuffer_data_len(&rx_fifo->rb);
  1760. if (rx_length == 0)
  1761. {
  1762. break;
  1763. }
  1764. if (serial->parent.open_flag & RT_SERIAL_RX_BLOCKING)
  1765. {
  1766. if (rx_fifo->rx_cpt_index && rx_length >= rx_fifo->rx_cpt_index)
  1767. {
  1768. rx_fifo->rx_cpt_index = 0;
  1769. rt_completion_done(&rx_fifo->rx_cpt);
  1770. }
  1771. }
  1772. /* Trigger the receiving completion callback */
  1773. if (serial->parent.rx_indicate != RT_NULL)
  1774. {
  1775. serial->parent.rx_indicate(&serial->parent, rx_length);
  1776. }
  1777. if (serial->rx_notify.notify != RT_NULL)
  1778. {
  1779. serial->rx_notify.notify(serial->rx_notify.dev);
  1780. }
  1781. break;
  1782. }
  1783. /* Interrupt transmit event */
  1784. case RT_SERIAL_EVENT_TX_DONE:
  1785. {
  1786. struct rt_serial_tx_fifo *tx_fifo;
  1787. rt_size_t tx_length;
  1788. rt_ssize_t transmit_size;
  1789. tx_fifo = (struct rt_serial_tx_fifo *)serial->serial_tx;
  1790. RT_ASSERT(tx_fifo != RT_NULL);
  1791. /* Get the length of the data from the ringbuffer */
  1792. tx_length = rt_ringbuffer_data_len(&tx_fifo->rb);
  1793. /* If there is no data in tx_ringbuffer,
  1794. * then the transmit completion callback is triggered*/
  1795. if (tx_length == 0)
  1796. {
  1797. rt_completion_done(&tx_fifo->tx_cpt);
  1798. /* Trigger the transmit completion callback */
  1799. if (serial->parent.tx_complete != RT_NULL)
  1800. {
  1801. serial->parent.tx_complete(&serial->parent, RT_NULL);
  1802. }
  1803. rt_atomic_flag_clear(&tx_fifo->activated);
  1804. break;
  1805. }
  1806. rt_atomic_flag_test_and_set(&tx_fifo->activated);
  1807. /* Call the transmit interface for transmission again */
  1808. /* Note that in interrupt mode, tx_fifo->buffer and tx_length
  1809. * are inactive parameters */
  1810. transmit_size = serial->ops->transmit(serial,
  1811. tx_fifo->rb.buffer_ptr,
  1812. tx_length,
  1813. serial->parent.open_flag & (RT_SERIAL_TX_BLOCKING | RT_SERIAL_TX_NON_BLOCKING));
  1814. if (transmit_size <= 0)
  1815. {
  1816. rt_atomic_flag_clear(&tx_fifo->activated);
  1817. }
  1818. break;
  1819. }
  1820. #ifdef RT_SERIAL_USING_DMA
  1821. case RT_SERIAL_EVENT_TX_DMADONE:
  1822. {
  1823. struct rt_serial_tx_fifo *tx_fifo;
  1824. rt_size_t tx_length;
  1825. rt_ssize_t transmit_size;
  1826. tx_fifo = (struct rt_serial_tx_fifo *)serial->serial_tx;
  1827. RT_ASSERT(tx_fifo != RT_NULL);
  1828. /* nonblock */
  1829. if ((serial->parent.open_flag & RT_SERIAL_TX_BLOCKING) != RT_SERIAL_TX_BLOCKING)
  1830. {
  1831. /* Each interruption upon entry indicates that the previous `put_size` has already been sent completely */
  1832. rt_serial_update_read_index(&tx_fifo->rb, tx_fifo->put_size);
  1833. /* Get the length of the data from the ringbuffer */
  1834. tx_length = rt_ringbuffer_data_len(&tx_fifo->rb);
  1835. if (tx_length != 0)
  1836. {
  1837. /* If there is some data in tx_ringbuffer,
  1838. * then call the transmit interface for transmission again */
  1839. rt_atomic_flag_test_and_set(&tx_fifo->activated);
  1840. rt_uint8_t *put_ptr;
  1841. /* Get the linear length buffer from ringbuffer */
  1842. tx_fifo->put_size = rt_serial_get_linear_buffer(&tx_fifo->rb, &put_ptr);
  1843. /* Call the transmit interface for transmission again */
  1844. transmit_size = serial->ops->transmit(serial,
  1845. put_ptr,
  1846. tx_fifo->put_size,
  1847. RT_SERIAL_TX_NON_BLOCKING);
  1848. if (transmit_size <= 0)
  1849. {
  1850. rt_atomic_flag_clear(&tx_fifo->activated);
  1851. }
  1852. break;
  1853. }
  1854. }
  1855. rt_completion_done(&tx_fifo->tx_cpt);
  1856. /* Trigger the transmit completion callback */
  1857. if (serial->parent.tx_complete != RT_NULL)
  1858. {
  1859. serial->parent.tx_complete(&serial->parent, RT_NULL);
  1860. }
  1861. rt_atomic_flag_clear(&tx_fifo->activated);
  1862. break;
  1863. }
  1864. #endif /* RT_SERIAL_USING_DMA */
  1865. default:
  1866. break;
  1867. }
  1868. }