diff --git a/adapter/khdf/linux/platform/uart/uart_adapter.c b/adapter/khdf/linux/platform/uart/uart_adapter.c index e8bac7820b35197d2d6ac5e951adebd3ad9bb754..60ef6253b5954abf5aceec69b1e8d8628ffe43b3 100644 --- a/adapter/khdf/linux/platform/uart/uart_adapter.c +++ b/adapter/khdf/linux/platform/uart/uart_adapter.c @@ -29,24 +29,21 @@ #include "securec.h" #include "uart_if.h" #include "uart_core.h" - -#define HDF_LOG_TAG hdf_uart_adapter -#define UART_NAME_LEN 20 -#define UART_PATHNAME_LEN (UART_NAME_LEN + 20) - -static char g_driverName[UART_NAME_LEN]; +#include "uart_adapter.h" static int32_t UartAdapterInit(struct UartHost *host) { char name[UART_PATHNAME_LEN] = {0}; struct file *fp = NULL; + struct UartPriv *uartpriv = NULL; mm_segment_t oldfs; if (host == NULL) { HDF_LOGE("UartAdapterInit: host is null!"); return HDF_ERR_INVALID_OBJECT; } - if (sprintf_s(name, UART_PATHNAME_LEN - 1, "/dev/%s%d", g_driverName, host->num) < 0) { + uartpriv = (struct UartPriv *)host->priv; + if (sprintf_s(name, UART_PATHNAME_LEN - 1, "/dev/%s%d", uartpriv->driverName, host->num) < 0) { return HDF_FAILURE; } oldfs = get_fs(); @@ -58,27 +55,29 @@ static int32_t UartAdapterInit(struct UartHost *host) return HDF_FAILURE; } set_fs(oldfs); - host->priv = fp; + uartpriv->fiLp = fp; return HDF_SUCCESS; } static int32_t UartAdapterDeInit(struct UartHost *host) { struct file *fp = NULL; + struct UartPriv *uartpriv = NULL; mm_segment_t oldfs; if (host == NULL) { HDF_LOGE("UartAdapterDeInit: host is null!"); return HDF_ERR_INVALID_OBJECT; } - fp = (struct file *)host->priv; + uartpriv = (struct UartPriv *)host->priv; + fp = uartpriv->fiLp; oldfs = get_fs(); set_fs(KERNEL_DS); if (!IS_ERR(fp) && fp) { filp_close(fp, NULL); } set_fs(oldfs); - host->priv = NULL; + uartpriv->fiLp = NULL; return HDF_SUCCESS; } @@ -87,6 +86,7 @@ static int32_t UartAdapterRead(struct UartHost *host, uint8_t *data, uint32_t si loff_t pos = 0; int ret; struct file *fp = NULL; + struct UartPriv *uartpriv; char *p = (char *)data; mm_segment_t oldfs; uint32_t tmp = 0; @@ -96,7 +96,8 @@ static int32_t UartAdapterRead(struct UartHost *host, uint8_t *data, uint32_t si return HDF_ERR_INVALID_OBJECT; } - fp = (struct file *)host->priv; + uartpriv = (struct UartPriv *)host->priv; + fp = uartpriv->fiLp; oldfs = get_fs(); set_fs(KERNEL_DS); while (size >= tmp) { @@ -116,6 +117,7 @@ static int32_t UartAdapterWrite(struct UartHost *host, uint8_t *data, uint32_t s loff_t pos = 0; int ret; struct file *fp = NULL; + struct UartPriv *uartpriv; char *p = (char *)data; mm_segment_t oldfs; @@ -124,7 +126,8 @@ static int32_t UartAdapterWrite(struct UartHost *host, uint8_t *data, uint32_t s return HDF_ERR_INVALID_OBJECT; } - fp = (struct file *)host->priv; + uartpriv = (struct UartPriv *)host->priv; + fp = uartpriv->fiLp; oldfs = get_fs(); set_fs(KERNEL_DS); ret = vfs_write(fp, p, size, &pos); @@ -210,12 +213,14 @@ static int32_t UartAdapterGetBaud(struct UartHost *host, uint32_t *baudRate) { struct termios termios; struct file *fp = NULL; + struct UartPriv *uartpriv; if (host == NULL) { HDF_LOGE("UartAdapterGetBaud: host is null!"); return HDF_ERR_INVALID_OBJECT; } - fp = (struct file *)host->priv; + uartpriv = (struct UartPriv *)host->priv; + fp = uartpriv->fiLp; if (baudRate == NULL) { HDF_LOGE("UartAdapterGetBaud: baudRate is null!"); return HDF_ERR_INVALID_PARAM; @@ -283,13 +288,15 @@ static int32_t UartAdapterSetBaud(struct UartHost *host, uint32_t baudRate) struct termios termios; struct serial_struct serial; struct file *fp = NULL; + struct UartPriv *uartpriv; int ret; if (host == NULL) { HDF_LOGE("UartAdapterSetBaud: host is null!"); return HDF_ERR_INVALID_OBJECT; } - fp = (struct file *)host->priv; + uartpriv = (struct UartPriv *)host->priv; + fp = uartpriv->fiLp; if (UartAdapterIoctlInner(fp, TCGETS, (unsigned long)&termios) < 0) { HDF_LOGE("UartAdapterSetBaud: tcgets fail!"); @@ -381,13 +388,15 @@ static int32_t UartAdapterGetAttribute(struct UartHost *host, struct UartAttribu { struct termios termios; struct file *fp = NULL; + struct UartPriv *uartpriv; int ret; if (host == NULL) { HDF_LOGE("UartAdapterGetAttribute: host is null!"); return HDF_ERR_INVALID_OBJECT; } - fp = (struct file *)host->priv; + uartpriv = (struct UartPriv *)host->priv; + fp = uartpriv->fiLp; if (attribute == NULL) { HDF_LOGE("UartAdapterGetAttribute: attribute is null!"); return HDF_ERR_INVALID_PARAM; @@ -409,13 +418,15 @@ static int32_t UartAdapterSetAttribute(struct UartHost *host, struct UartAttribu { struct termios termios; struct file *fp = NULL; + struct UartPriv *uartpriv; int ret; if (host == NULL) { HDF_LOGE("UartAdapterSetAttribute: host is null!"); return HDF_ERR_INVALID_OBJECT; } - fp = (struct file *)host->priv; + uartpriv = (struct UartPriv *)host->priv; + fp = uartpriv->fiLp; if (attribute == NULL) { HDF_LOGE("UartAdapterSetAttribute: attribute is null!"); return HDF_ERR_INVALID_PARAM; @@ -485,6 +496,7 @@ static int32_t HdfUartInit(struct HdfDeviceObject *obj) struct DeviceResourceIface *iface = NULL; struct UartHost *host = NULL; const char *drName = NULL; + struct UartPriv *uartpriv; HDF_LOGI("HdfUartInit: entry!"); if (obj == NULL) { @@ -510,17 +522,21 @@ static int32_t HdfUartInit(struct HdfDeviceObject *obj) HDF_LOGE("HdfUartInit: read driver_name fail!"); return HDF_FAILURE; } - g_driverName[UART_NAME_LEN - 1] = 0; if (strlen(drName) > (UART_NAME_LEN - 1)) { HDF_LOGE("HdfUartInit: illegal length of drName!"); return HDF_FAILURE; } - ret = memcpy_s(g_driverName, UART_NAME_LEN, drName, strlen(drName)); - if (ret != EOK) { - HDF_LOGE("HdfUartInit: memcpy_s fail!"); + uartpriv = OsalMemCalloc(sizeof(struct UartPriv)); + if (uartpriv == NULL) { + HDF_LOGE("HdfUartInit: malloc UartPriv fail!"); + return HDF_FAILURE; + } + if (memcpy_s(uartpriv->driverName, UART_NAME_LEN, drName, strlen(drName)) < 0) { + HDF_LOGE("HdfUartInit: memcpy_s drName fail!"); return HDF_FAILURE; } host->method = &g_uartHostMethod; + host->priv = uartpriv; return HDF_SUCCESS; } @@ -534,6 +550,7 @@ static void HdfUartRelease(struct HdfDeviceObject *obj) return; } host = UartHostFromDevice(obj); + OsalMemFree(host->priv); UartHostDestroy(host); } diff --git a/framework/support/platform/include/uart/uart_core.h b/framework/support/platform/include/uart/uart_core.h index 6ff2d9e112f6b1b24bc1e6a6db644bffe7beb6f6..a6d44afd0f7ecff0ab784cf7f1c5ab02fe8b5444 100644 --- a/framework/support/platform/include/uart/uart_core.h +++ b/framework/support/platform/include/uart/uart_core.h @@ -19,6 +19,17 @@ extern "C" { #endif /* __cplusplus */ + +#define HDF_LOG_TAG hdf_uart_adapter +#define UART_NAME_LEN 20 +#define UART_PATHNAME_LEN (UART_NAME_LEN + 20) +/** + * @brief UartPriv. + */ +typedef struct { + struct file *fiLp; + char driverName[UART_NAME_LEN]; +} UartPriv; /** * @brief uart device operations. */