dev_serial_v2.c 63 KB

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