1 /*
2 * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "hdf_device_desc.h"
17
18 #ifdef LOSCFG_DRIVERS_HDF_CONFIG_MACRO
19 #include "hcs_macro.h"
20 #include "hdf_config_macro.h"
21 #else
22 #include "device_resource_if.h"
23 #endif
24 #include "hdf_log.h"
25 #include "osal.h"
26 #include "los_mux.h"
27 #include "los_queue.h"
28
29 #include "uart_if.h"
30 #include "uart_core.h"
31 #include "gd32f4xx_usart.h"
32
33 #define HDF_LOG_TAG uart_gd32f4xx
34 #define UART_HWI_PRIO (0U)
35 #define UART_HWI_MODE (1U)
36 #define CLOCK_APB (2)
37 #define UART_BUS_NUMS (8)
38 #define GPIO_REG_BASE 0x40020000
39 #define GPIO_REG_STEP 0x00000400
40 #define GPIO_BIT_PER_GROUP 16
41
42 struct UartCtrl {
43 uint32_t num;
44 uint32_t regBase;
45 uint32_t irqNum;
46 OSAL_DECLARE_SPINLOCK(lock);
47 uint32_t baudRate;
48 enum UartTransMode mode;
49 uint32_t openCount;
50 uint32_t af;
51 uint32_t txPin;
52 uint32_t rxPin;
53 uint32_t fifoSize;
54 void *priv;
55 };
56
57 static int32_t g_regBase;
58 static UINT32 g_queue;
59
ToGpioPin(uint16_t local)60 static inline uint32_t ToGpioPin(uint16_t local)
61 {
62 uint32_t pinNum = 0;
63
64 pinNum = local % GPIO_BIT_PER_GROUP;
65
66 return (BIT(pinNum));
67 }
68
ToGpioPeriph(uint16_t local)69 static inline uint32_t ToGpioPeriph(uint16_t local)
70 {
71 uint32_t gpioPeriph = 0;
72
73 gpioPeriph = GPIO_REG_BASE + (local / GPIO_BIT_PER_GROUP) * GPIO_REG_STEP;
74
75 return gpioPeriph;
76 }
77
GpioRcuEnumFind(uint32_t gpioGroup)78 static rcu_periph_enum GpioRcuEnumFind(uint32_t gpioGroup)
79 {
80 uint32_t gpioClockOffset;
81 gpioClockOffset = gpioGroup / GPIO_BIT_PER_GROUP;
82 return RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, gpioClockOffset);
83 }
84
UartRcuEnumFind(struct UartCtrl * uart)85 static rcu_periph_enum UartRcuEnumFind(struct UartCtrl *uart)
86 {
87 rcu_periph_enum usartRcus[UART_BUS_NUMS] = {
88 RCU_USART0, RCU_USART1, RCU_USART2, RCU_UART3, RCU_UART4, RCU_USART5, RCU_UART6, RCU_UART7,
89 };
90 return usartRcus[uart->num];
91 }
92
UartRegBaseFind(struct UartCtrl * uart)93 static uint32_t UartRegBaseFind(struct UartCtrl *uart)
94 {
95 uint32_t usarts[UART_BUS_NUMS] = {
96 USART0, USART1, USART2, UART3, UART4, USART5, UART6, UART7,
97 };
98 return usarts[uart->num];
99 }
100
101 // enable uart, and enable tx/rx mode
UartEnable(struct UartCtrl * uart,int enable)102 static int32_t UartEnable(struct UartCtrl *uart, int enable)
103 {
104 if (enable) {
105 int32_t gpioGroup;
106 int32_t gpioTxPin;
107 int32_t gpioRxPin;
108 gpioGroup = ToGpioPeriph(uart->txPin);
109 gpioTxPin = ToGpioPin(uart->txPin);
110 gpioRxPin = ToGpioPin(uart->rxPin);
111 rcu_periph_clock_enable(GpioRcuEnumFind(uart->txPin));
112 rcu_periph_clock_enable(UartRcuEnumFind(uart));
113
114 gpio_af_set(gpioGroup, AF(uart->af), gpioTxPin);
115 gpio_af_set(gpioGroup, AF(uart->af), gpioRxPin);
116
117 gpio_mode_set(gpioGroup, GPIO_MODE_AF, GPIO_PUPD_PULLUP, gpioTxPin);
118 gpio_output_options_set(gpioGroup, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, gpioTxPin);
119
120 gpio_mode_set(gpioGroup, GPIO_MODE_AF, GPIO_PUPD_PULLUP, gpioRxPin);
121 gpio_output_options_set(gpioGroup, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, gpioRxPin);
122
123 usart_deinit(uart->regBase);
124
125 usart_baudrate_set(uart->regBase, uart->baudRate);
126 usart_word_length_set(uart->regBase, USART_WL_8BIT);
127 usart_stop_bit_set(uart->regBase, USART_STB_1BIT);
128 usart_parity_config(uart->regBase, USART_PM_NONE);
129
130 usart_hardware_flow_rts_config(uart->regBase, USART_RTS_DISABLE);
131 usart_hardware_flow_cts_config(uart->regBase, USART_CTS_DISABLE);
132
133 usart_receive_config(uart->regBase, USART_RECEIVE_ENABLE);
134 usart_transmit_config(uart->regBase, USART_TRANSMIT_ENABLE);
135
136 usart_flag_clear(uart->regBase, USART_FLAG_TC | USART_FLAG_TBE);
137
138 usart_enable(uart->regBase);
139
140 nvic_irq_enable(uart->irqNum, 2U, 0U);
141
142 usart_interrupt_enable(uart->regBase, USART_INT_RBNE);
143 } else {
144 usart_deinit(uart->regBase);
145
146 usart_receive_config(uart->regBase, USART_RECEIVE_DISABLE);
147 usart_transmit_config(uart->regBase, USART_TRANSMIT_DISABLE);
148
149 usart_flag_clear(uart->regBase, USART_FLAG_TC | USART_FLAG_TBE);
150
151 usart_interrupt_disable(uart->regBase, USART_INT_RBNE);
152
153 nvic_irq_disable(uart->irqNum);
154
155 usart_disable(uart->regBase);
156 }
157 return 0;
158 }
159
UartDataBits(struct UartCtrl * uart,uint32_t bits)160 static int32_t UartDataBits(struct UartCtrl *uart, uint32_t bits)
161 {
162 switch (bits) {
163 case UART_ATTR_DATABIT_8:
164 usart_word_length_set(uart->regBase, USART_WL_8BIT);
165 break;
166 default:
167 HDF_LOGE("%s: not support parameter.\r\n", __func__);
168 return HDF_ERR_INVALID_PARAM;
169 }
170
171 return 0;
172 }
173
UartStopBits(struct UartCtrl * uart,uint32_t bits)174 static int32_t UartStopBits(struct UartCtrl *uart, uint32_t bits)
175 {
176 switch (bits) {
177 case UART_ATTR_STOPBIT_1:
178 usart_stop_bit_set(uart->regBase, USART_STB_1BIT);
179 break;
180 case UART_ATTR_STOPBIT_1P5:
181 usart_stop_bit_set(uart->regBase, USART_STB_1_5BIT);
182 break;
183 case UART_ATTR_STOPBIT_2:
184 usart_stop_bit_set(uart->regBase, USART_STB_2BIT);
185 break;
186 default:
187 HDF_LOGE("%s: not support parameter.\r\n", __func__);
188 return HDF_ERR_INVALID_PARAM;
189 }
190
191 return 0;
192 }
193
UartParity(struct UartCtrl * uart,uint32_t parity)194 static int32_t UartParity(struct UartCtrl *uart, uint32_t parity)
195 {
196 switch (parity) {
197 case UART_ATTR_PARITY_NONE:
198 usart_parity_config(uart->regBase, USART_PM_NONE);
199 break;
200 case UART_ATTR_PARITY_ODD:
201 usart_parity_config(uart->regBase, USART_PM_ODD);
202 break;
203 case UART_ATTR_PARITY_EVEN:
204 usart_parity_config(uart->regBase, USART_PM_EVEN);
205 break;
206 default:
207 HDF_LOGE("%s: not support parameter.\r\n", __func__);
208 return HDF_ERR_INVALID_PARAM;
209 }
210
211 return 0;
212 }
213
UartRts(struct UartCtrl * uart,uint32_t rts)214 static int32_t UartRts(struct UartCtrl *uart, uint32_t rts)
215 {
216 switch (rts) {
217 case UART_ATTR_RTS_DIS:
218 usart_hardware_flow_rts_config(uart->regBase, USART_RTS_DISABLE);
219 break;
220 case UART_ATTR_RTS_EN:
221 usart_hardware_flow_rts_config(uart->regBase, USART_RTS_ENABLE);
222 break;
223 default:
224 HDF_LOGE("%s: not support parameter.\r\n", __func__);
225 return HDF_ERR_INVALID_PARAM;
226 }
227
228 return 0;
229 }
230
UartCts(struct UartCtrl * uart,uint32_t cts)231 static int32_t UartCts(struct UartCtrl *uart, uint32_t cts)
232 {
233 switch (cts) {
234 case UART_ATTR_CTS_DIS:
235 usart_hardware_flow_cts_config(uart->regBase, USART_CTS_DISABLE);
236 break;
237 case UART_ATTR_CTS_EN:
238 usart_hardware_flow_cts_config(uart->regBase, USART_CTS_ENABLE);
239 break;
240 default:
241 HDF_LOGE("%s: not support parameter.\r\n", __func__);
242 return HDF_ERR_INVALID_PARAM;
243 }
244
245 return 0;
246 }
247
UartBaudrate(struct UartCtrl * uart,uint32_t baudRate)248 static int32_t UartBaudrate(struct UartCtrl *uart, uint32_t baudRate)
249 {
250 usart_baudrate_set(uart->regBase, baudRate);
251 return 0;
252 }
253
UartConfig(struct UartCtrl * uart)254 static int32_t UartConfig(struct UartCtrl *uart)
255 {
256 int32_t ret;
257 struct UartAttribute *attr = (struct UartAttribute *)uart->priv;
258
259 ret = UartDataBits(uart, attr->dataBits);
260 ret |= UartStopBits(uart, attr->stopBits);
261 ret |= UartParity(uart, attr->parity);
262 ret |= UartRts(uart, attr->rts);
263 ret |= UartCts(uart, attr->cts);
264
265 return ret;
266 }
267
UartDevOpen(struct UartHost * host)268 static int32_t UartDevOpen(struct UartHost *host)
269 {
270 int32_t ret = HDF_SUCCESS;
271
272 struct UartCtrl *uart = (struct UartCtrl *)host->priv;
273
274 OsalSpinLock(&(uart->lock));
275
276 struct UartAttribute *attr = (struct UartAttribute *)uart->priv;
277
278 attr->dataBits = UART_ATTR_DATABIT_8;
279 attr->parity = UART_ATTR_PARITY_NONE;
280 attr->stopBits = UART_ATTR_STOPBIT_1;
281 attr->rts = UART_ATTR_RTS_DIS;
282 attr->cts = UART_ATTR_CTS_DIS;
283
284 UartConfig(uart);
285 UartEnable(uart, true);
286 ret = LOS_QueueCreate("queue", uart->fifoSize, &g_queue, 0, 1);
287 if (ret != LOS_OK) {
288 HDF_LOGE("create queue failure, error: %x\n", ret);
289 }
290 uart->openCount++;
291
292 OsalSpinUnlock(&(uart->lock));
293 return ret;
294 }
295
UartDevClose(struct UartHost * host)296 static int32_t UartDevClose(struct UartHost *host)
297 {
298 struct UartCtrl *uart = (struct UartCtrl *)host->priv;
299
300 if (--uart->openCount > 0) {
301 return HDF_FAILURE;
302 }
303
304 OsalSpinLock(&(uart->lock));
305
306 UartEnable(uart, false);
307
308 OsalSpinUnlock(&(uart->lock));
309
310 return HDF_SUCCESS;
311 }
312
UartDevRead(struct UartHost * host,uint8_t * data,uint32_t size)313 static int32_t UartDevRead(struct UartHost *host, uint8_t *data, uint32_t size)
314 {
315 if (host == NULL || host->priv == NULL) {
316 HDF_LOGE("%s: invalid parameter.\r\n", __func__);
317 return HDF_ERR_INVALID_PARAM;
318 }
319
320 int32_t ret = 0;
321 int32_t recvSize = 0;
322 int32_t readLen = 1;
323 int32_t timeOut = 0;
324
325 struct UartCtrl *uart = (struct UartCtrl *)host->priv;
326
327 OsalSpinLock(&(uart->lock));
328
329 if (uart->mode == UART_MODE_RD_BLOCK) {
330 timeOut = LOS_WAIT_FOREVER;
331 } else if (uart->mode == UART_MODE_RD_NONBLOCK) {
332 timeOut = 0;
333 } else {
334 HDF_LOGE("mode not support");
335 }
336 while (recvSize < size) {
337 ret = LOS_QueueReadCopy(g_queue, data + recvSize, &readLen, timeOut);
338 if (ret == LOS_ERRNO_QUEUE_ISEMPTY) {
339 break;
340 }
341 recvSize++;
342 }
343
344 OsalSpinUnlock(&(uart->lock));
345 return recvSize;
346 }
347
UartDevWrite(struct UartHost * host,uint8_t * data,uint32_t size)348 static int32_t UartDevWrite(struct UartHost *host, uint8_t *data, uint32_t size)
349 {
350 int32_t ret = HDF_SUCCESS;
351 if (host == NULL || host->priv == NULL || data == NULL) {
352 HDF_LOGE("%s: invalid parameter.\r\n", __func__);
353 return HDF_ERR_INVALID_PARAM;
354 }
355 struct UartCtrl *uart = (struct UartCtrl *)host->priv;
356
357 OsalSpinLock(&(uart->lock));
358
359 for (int i = 0; i < size; i++) {
360 if (data[i] == '\n') {
361 usart_data_transmit(uart->regBase, '\r');
362 while (RESET == usart_flag_get(uart->regBase, USART_FLAG_TBE)) { };
363 usart_data_transmit(uart->regBase, '\n');
364 } else {
365 usart_data_transmit(uart->regBase, data[i]);
366 }
367 while (RESET == usart_flag_get(uart->regBase, USART_FLAG_TBE)) { };
368 }
369
370 OsalSpinUnlock(&(uart->lock));
371
372 return ret;
373 }
374
UartDevGetBaud(struct UartHost * host,uint32_t * baudRate)375 static int32_t UartDevGetBaud(struct UartHost *host, uint32_t *baudRate)
376 {
377 int32_t ret = HDF_SUCCESS;
378 if (host == NULL || host->priv == NULL || baudRate == NULL) {
379 HDF_LOGE("%s: invalid parameter", __func__);
380 return HDF_ERR_INVALID_PARAM;
381 }
382 struct UartCtrl *uart = (struct UartCtrl *)host->priv;
383
384 OsalSpinLock(&(uart->lock));
385
386 *baudRate = uart->baudRate;
387
388 OsalSpinUnlock(&(uart->lock));
389 return ret;
390 }
391
UartDevSetBaud(struct UartHost * host,uint32_t baudRate)392 static int32_t UartDevSetBaud(struct UartHost *host, uint32_t baudRate)
393 {
394 int32_t ret = HDF_SUCCESS;
395 if (host == NULL || host->priv == NULL || baudRate == 0) {
396 HDF_LOGE("%s: invalid parameter", __func__);
397 return HDF_ERR_INVALID_PARAM;
398 }
399 struct UartCtrl *uart = (struct UartCtrl *)host->priv;
400
401 OsalSpinLock(&(uart->lock));
402
403 if (uart->baudRate != baudRate) {
404 UartBaudrate(uart, baudRate);
405 uart->baudRate = baudRate;
406 }
407
408 OsalSpinUnlock(&(uart->lock));
409 return ret;
410 }
411
UartDevGetAttribute(struct UartHost * host,struct UartAttribute * attribute)412 static int32_t UartDevGetAttribute(struct UartHost *host, struct UartAttribute *attribute)
413 {
414 int32_t ret = HDF_SUCCESS;
415 struct UartCtrl *uart = NULL;
416 struct UartAttribute *attr = NULL;
417 if (host == NULL || host->priv == NULL || attribute == NULL) {
418 HDF_LOGE("%s: invalid parameter", __func__);
419 return HDF_ERR_INVALID_PARAM;
420 }
421 uart = (struct UartCtrl *)host->priv;
422 attr = (struct UartAttribute *)uart->priv;
423
424 OsalSpinLock(&(uart->lock));
425
426 memcpy_s(attribute, sizeof(struct UartAttribute), attr, sizeof(struct UartAttribute));
427
428 OsalSpinUnlock(&(uart->lock));
429
430 return ret;
431 }
432
UartDevSetAttribute(struct UartHost * host,struct UartAttribute * attribute)433 static int32_t UartDevSetAttribute(struct UartHost *host, struct UartAttribute *attribute)
434 {
435 HDF_LOGE("func: %s, UartSetAttribute ok\r\n", __func__);
436 int32_t ret = HDF_SUCCESS;
437 struct UartCtrl *uart = NULL;
438 struct UartAttribute *attr = NULL;
439 if (host == NULL || host->priv == NULL || attribute == NULL) {
440 HDF_LOGE("%s: invalid parameter", __func__);
441 return HDF_ERR_INVALID_PARAM;
442 }
443 uart = (struct UartCtrl *)host->priv;
444 attr = (struct UartAttribute *)uart->priv;
445
446 OsalSpinLock(&(uart->lock));
447
448 // 保存新配置
449 memcpy_s(attr, sizeof(struct UartAttribute), attribute, sizeof(struct UartAttribute));
450
451 // 根据新配置,更新寄存器
452 ret = UartConfig(uart);
453
454 OsalSpinUnlock(&(uart->lock));
455 return ret;
456 }
457
UartDevSetTransMode(struct UartHost * host,enum UartTransMode mode)458 static int32_t UartDevSetTransMode(struct UartHost *host, enum UartTransMode mode)
459 {
460 int32_t ret = HDF_SUCCESS;
461 struct UartCtrl *uart = (struct UartCtrl *)host->priv;
462
463 OsalSpinLock(&(uart->lock));
464
465 switch (mode) {
466 case UART_MODE_RD_BLOCK:
467 uart->mode = UART_MODE_RD_BLOCK;
468 break;
469 case UART_MODE_RD_NONBLOCK:
470 uart->mode = UART_MODE_RD_NONBLOCK;
471 break;
472 default:
473 HDF_LOGE("%s: unsupport mode %#x.\r\n", __func__, mode);
474 break;
475 }
476
477 OsalSpinUnlock(&(uart->lock));
478
479 return ret;
480 }
481
482 struct UartHostMethod g_uartOps = {.Init = UartDevOpen,
483 .Deinit = UartDevClose,
484 .Read = UartDevRead,
485 .Write = UartDevWrite,
486 .GetBaud = UartDevGetBaud,
487 .SetBaud = UartDevSetBaud,
488 .GetAttribute = UartDevGetAttribute,
489 .SetAttribute = UartDevSetAttribute,
490 .SetTransMode = UartDevSetTransMode,
491 .pollEvent = NULL};
492
493 #ifdef LOSCFG_DRIVERS_HDF_CONFIG_MACRO
494 #define UART_FIND_CONFIG(node, name, uart) \
495 do { \
496 if (strcmp(HCS_PROP(node, match_attr), name) == 0) { \
497 uint32_t devNum = HCS_PROP(node, num); \
498 uint16_t baudRate = HCS_PROP(node, baudrate); \
499 uint16_t mode = HCS_PROP(node, mode); \
500 uint32_t interrupt = HCS_PROP(node, interrupt); \
501 uint32_t fifoSize = HCS_PROP(node, fifo_size); \
502 uint32_t af = HCS_PROP(node, af); \
503 uint32_t txPin = HCS_PROP(node, tx_pin); \
504 uint32_t rxPin = HCS_PROP(node, rx_pin); \
505 uart->num = devNum; \
506 uart->baudRate = baudRate; \
507 uart->mode = mode; \
508 uart->irqNum = interrupt; \
509 uart->fifoSize = fifoSize; \
510 uart->af = af; \
511 uart->txPin = txPin; \
512 uart->rxPin = rxPin; \
513 result = HDF_SUCCESS; \
514 } \
515 } while (0)
516 #define PLATFORM_CONFIG HCS_NODE(HCS_ROOT, platform)
517 #define PLATFORM_UART_CONFIG HCS_NODE(HCS_NODE(HCS_ROOT, platform), controller_0x40011000)
ReadUartHcsSource(struct UartCtrl * uart,const char * deviceMatchAttr)518 static int32_t ReadUartHcsSource(struct UartCtrl *uart, const char *deviceMatchAttr)
519 {
520 int32_t result = HDF_FAILURE;
521 if (uart == NULL || deviceMatchAttr == NULL) {
522 HDF_LOGE("%s: uart resource or deviceMatchAttr is NULL", __func__);
523 return HDF_ERR_INVALID_PARAM;
524 }
525
526 #if HCS_NODE_HAS_PROP(PLATFORM_CONFIG, controller_0x40011000)
527 HCS_FOREACH_CHILD_VARGS(PLATFORM_UART_CONFIG, UART_FIND_CONFIG, deviceMatchAttr, uart);
528 #endif
529 if (result != HDF_SUCCESS) {
530 HDF_LOGE("resourceNode %s is NULL\r\n", deviceMatchAttr);
531 }
532
533 return result;
534 }
535 #else
ReadUartHcsSource(struct UartCtrl * uart,const struct DeviceResourceNode * node)536 static int32_t ReadUartHcsSource(struct UartCtrl *uart, const struct DeviceResourceNode *node)
537 {
538 int32_t ret;
539 struct DeviceResourceIface *drsOps = NULL;
540
541 drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);
542 if (drsOps == NULL || drsOps->GetUint32 == NULL) {
543 HDF_LOGE("%s: invalid drs ops!\r\n", __func__);
544 return HDF_FAILURE;
545 }
546
547 ret = drsOps->GetUint32(node, "num", &uart->num, 0);
548 if (ret != HDF_SUCCESS) {
549 HDF_LOGE("%s: read num fail!\r\n", __func__);
550 return ret;
551 }
552
553 ret = drsOps->GetUint32(node, "mode", &uart->mode, 0);
554 if (ret != HDF_SUCCESS) {
555 HDF_LOGE("%s: read mode fail!\r\n", __func__);
556 return ret;
557 }
558
559 ret = drsOps->GetUint32(node, "baudrate", &uart->baudRate, 0);
560 if (ret != HDF_SUCCESS) {
561 HDF_LOGE("%s: read baud_rate fail!\r\n", __func__);
562 return ret;
563 }
564
565 ret = drsOps->GetUint32(node, "interrupt", &uart->irqNum, 0);
566 if (ret != HDF_SUCCESS) {
567 HDF_LOGE("%s: read interrupt fail!\r\n", __func__);
568 return ret;
569 }
570
571 ret = drsOps->GetUint32(node, "fifo_size", &uart->fifoSize, 0);
572 if (ret != HDF_SUCCESS) {
573 HDF_LOGE("%s: read fifoSize fail!\r\n", __func__);
574 return ret;
575 }
576
577 ret = drsOps->GetUint32(node, "af", &uart->af, 0);
578 if (ret != HDF_SUCCESS) {
579 HDF_LOGE("%s: read af fail!\r\n", __func__);
580 return ret;
581 }
582
583 ret = drsOps->GetUint32(node, "tx_pin", &uart->txPin, 0);
584 if (ret != HDF_SUCCESS) {
585 HDF_LOGE("%s: read tx_pin fail!\r\n", __func__);
586 return ret;
587 }
588
589 ret = drsOps->GetUint32(node, "rx_pin", &uart->rxPin, 0);
590 if (ret != HDF_SUCCESS) {
591 HDF_LOGE("%s: read rx_pin fail!\r\n", __func__);
592 return ret;
593 }
594
595 return HDF_SUCCESS;
596 }
597 #endif
598
UartDevBind(struct HdfDeviceObject * device)599 static int32_t UartDevBind(struct HdfDeviceObject *device)
600 {
601 int32_t ret;
602 struct UartHost *host = NULL;
603 struct UartCtrl *uart = NULL;
604 struct UartAttribute *attr = NULL;
605 HDF_LOGI("%s: Enter", __func__);
606
607 #ifdef LOSCFG_DRIVERS_HDF_CONFIG_MACRO
608 if (device == NULL) {
609 #else
610 if (device == NULL || device->property == NULL) {
611 #endif
612 HDF_LOGE("%s: device or property is null!.\r\n", __func__);
613 return HDF_ERR_INVALID_OBJECT;
614 }
615
616 host = UartHostCreate(device);
617 if (host == NULL) {
618 HDF_LOGE("%s: UartHostCreate fail!.\r\n", __func__);
619 return HDF_ERR_MALLOC_FAIL;
620 }
621
622 // 申请内存空间
623 uart = (struct UartCtrl *)OsalMemCalloc(sizeof(struct UartCtrl));
624 if (uart == NULL) {
625 HDF_LOGE("%s: malloc uart fail!.\r\n", __func__);
626 return HDF_ERR_MALLOC_FAIL;
627 }
628
629 // attr
630 attr = (struct UartAttribute *)OsalMemCalloc(sizeof(struct UartAttribute));
631 if (uart == NULL) {
632 HDF_LOGE("%s: malloc attr fail!.\r\n", __func__);
633 OsalMemFree(uart);
634 return HDF_ERR_MALLOC_FAIL;
635 }
636 uart->priv = (void *)attr;
637 #ifdef LOSCFG_DRIVERS_HDF_CONFIG_MACRO
638 ret = ReadUartHcsSource(uart, device->deviceMatchAttr);
639 #else
640 ret = ReadUartHcsSource(uart, device->property);
641 #endif
642 if (ret != HDF_SUCCESS) {
643 HDF_LOGE("%s: read drs fail:%d.\r\n", __func__, ret);
644 OsalMemFree(attr);
645 OsalMemFree(uart);
646 return ret;
647 }
648
649 uart->regBase = UartRegBaseFind(uart);
650 host->method = &g_uartOps;
651 host->priv = uart;
652 host->num = uart->num;
653 HDF_LOGI("%s: Bind sucess", __func__);
654 return HDF_SUCCESS;
655 }
656
657 static void UsartIrq(void)
658 {
659 char ch;
660 char recvCh = 0;
661 UINT32 recvSize = 1;
662 uint32_t ret;
663
664 while (RESET != usart_interrupt_flag_get(g_regBase, USART_INT_FLAG_RBNE)) {
665 ch = usart_data_receive(g_regBase);
666 ret = LOS_QueueWriteCopy(g_queue, &ch, 1, 0);
667 if (ret == LOS_ERRNO_QUEUE_ISFULL) {
668 LOS_QueueReadCopy(g_queue, &recvCh, &recvSize, 0);
669 LOS_QueueWriteCopy(g_queue, &ch, 1, 0);
670 }
671 }
672 }
673
674 static int32_t UartDevInit(struct HdfDeviceObject *device)
675 {
676 int32_t ret = HDF_SUCCESS;
677 struct UartHost *host = NULL;
678 struct UartCtrl *uart = NULL;
679
680 HDF_LOGI("%s: Enter", __func__);
681
682 if (device == NULL) {
683 HDF_LOGE("%s: device is null.\r\n", __func__);
684 return HDF_FAILURE;
685 }
686
687 host = UartHostFromDevice(device);
688 if (host == NULL) {
689 HDF_LOGE("%s: host is null.\r\n", __func__);
690 return HDF_FAILURE;
691 }
692
693 uart = (struct UartCtrl *)host->priv;
694 if (uart == NULL) {
695 HDF_LOGE("%s: uart is null.\r\n", __func__);
696 return HDF_FAILURE;
697 }
698
699 g_regBase = uart->regBase;
700
701 LOS_HwiCreate(uart->irqNum, UART_HWI_PRIO, UART_HWI_MODE, (HWI_PROC_FUNC)UsartIrq, NULL);
702
703 ret = OsalSpinInit(&(uart->lock));
704 if (ret != HDF_SUCCESS) {
705 HDF_LOGE("%s: OsalSpinInit fail.\r\n", __func__);
706 return HDF_FAILURE;
707 }
708
709 OsalSpinLock(&(uart->lock));
710
711 UartEnable(uart, true);
712
713 OsalSpinUnlock(&(uart->lock));
714 HDF_LOGI("%s: init uart%d sucess", __func__, uart->num);
715 return ret;
716 }
717
718 static void UartDevRelease(struct HdfDeviceObject *device)
719 {
720 struct UartHost *host = NULL;
721 struct UartCtrl *uart = NULL;
722 HDF_LOGD("%s::enter, deviceObject=%p", __func__, device);
723 if (device == NULL) {
724 HDF_LOGE("%s: device is null.\r\n", __func__);
725 return;
726 }
727
728 host = UartHostFromDevice(device);
729 if (host == NULL) {
730 HDF_LOGE("%s: host is null.\r\n", __func__);
731 return;
732 }
733
734 uart = (struct UartCtrl *)host->priv;
735 if (uart == NULL) {
736 HDF_LOGE("%s: uart is null.\r\n", __func__);
737 return;
738 }
739
740 OsalSpinLock(&(uart->lock));
741
742 LOS_HwiDelete(uart->irqNum, NULL);
743
744 UartEnable(uart, false);
745
746 OsalSpinUnlock(&(uart->lock));
747
748 OsalSpinDestroy(&(uart->lock));
749
750 OsalMemFree(uart->priv);
751 OsalMemFree(uart);
752
753 UartHostDestroy(host);
754 }
755
756 struct HdfDriverEntry g_hdf_driver_uart_entry = {
757 .moduleVersion = 1,
758 .Bind = UartDevBind,
759 .Init = UartDevInit,
760 .Release = UartDevRelease,
761 .moduleName = "GD_UART_MODULE_HDF",
762 };
763 HDF_INIT(g_hdf_driver_uart_entry);
764