static BSP_S32 udiAdpIccInit(VOID) { UDI_DRV_INTEFACE_TABLE* pDrvInterface = NULL; BSP_U32 u32Cnt; /* 构造回调函数指针列表 */ pDrvInterface = kmalloc(sizeof(UDI_DRV_INTEFACE_TABLE), GFP_KERNEL); if (NULL == pDrvInterface) { printk(KERN_ERR "BSP_MODU_UDI NO Mem, line:%d\n", __LINE__); return ERROR; } memset((VOID*)pDrvInterface, 0, sizeof(UDI_DRV_INTEFACE_TABLE)); /* 只设置需要实现的几个接口 */ pDrvInterface->udi_open_cb = (UDI_OPEN_CB_T)udiIccAdpOpen; pDrvInterface->udi_close_cb = (UDI_CLOSE_CB_T)BSP_ICC_Close; pDrvInterface->udi_write_cb = (UDI_WRITE_CB_T)BSP_ICC_Write; pDrvInterface->udi_read_cb = (UDI_READ_CB_T)BSP_ICC_Read; pDrvInterface->udi_ioctl_cb = (UDI_IOCTL_CB_T)BSP_ICC_Ioctl; /* 几个 ICC 都使用同一套驱动函数指针 */ for (u32Cnt = 0; u32Cnt < ICC_CHAN_NUM_MAX; u32Cnt++) { (BSP_VOID)BSP_UDI_SetCapability((UDI_DEVICE_ID)UDI_BUILD_DEV_ID(UDI_DEV_ICC, u32Cnt), UDI_ICC_CAPA); (BSP_VOID)BSP_UDI_SetInterfaceTable((UDI_DEVICE_ID)UDI_BUILD_DEV_ID(UDI_DEV_ICC, u32Cnt), pDrvInterface); } return OK; }
LOCAL BSP_S32 udiAdpUartInit(VOID) { UDI_DRV_INTEFACE_TABLE* pDrvInterface = NULL; BSP_U32 u32Cnt; /* 构造回调函数指针列表 */ pDrvInterface = malloc(sizeof(UDI_DRV_INTEFACE_TABLE)); /* coverity[dead_error_condition] */ if (NULL == pDrvInterface) { /* coverity[dead_error_condition] */ bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_UDI, "NO Mem, line:%d\n", __LINE__, 0,0,0,0,0);/* [false alarm]:Disable fortify false alarm */ /* coverity[dead_error_condition] */ return ERROR;/* [false alarm]:Disable fortify false alarm */ } memset((VOID*)pDrvInterface, 0, sizeof(UDI_DRV_INTEFACE_TABLE)); /* 只设置需要实现的几个接口 */ pDrvInterface->udi_open_cb = udiUartAdpOpen; pDrvInterface->udi_close_cb = (UDI_CLOSE_CB_T)close; pDrvInterface->udi_write_cb = (UDI_WRITE_CB_T)write; pDrvInterface->udi_read_cb = (UDI_READ_CB_T)read; pDrvInterface->udi_ioctl_cb = (UDI_IOCTL_CB_T)ioctl; /* 3个 ACM 都使用同一套驱动函数指针 */ for (u32Cnt = 0; u32Cnt < UDI_GET_UART_NUM(); u32Cnt++) { (BSP_VOID)BSP_UDI_SetCapability((UDI_DEVICE_ID)UDI_BUILD_DEV_ID(UDI_DEV_UART, u32Cnt), UDI_USB_ACM_CAPA); (BSP_VOID)BSP_UDI_SetInterfaceTable((UDI_DEVICE_ID)UDI_BUILD_DEV_ID(UDI_DEV_UART, u32Cnt), pDrvInterface); } /* pDrvInterface' (line 287) has not been freed or returned */ return OK;/*lint !e429 */ }
LOCAL BSP_S32 udiAdpIccInit(VOID) { UDI_DRV_INTEFACE_TABLE* pDrvInterface = NULL; BSP_U32 u32Cnt; /* 构造回调函数指针列表 */ pDrvInterface = malloc(sizeof(UDI_DRV_INTEFACE_TABLE)); /* coverity[dead_error_condition] */ if (NULL == pDrvInterface) { /* coverity[dead_error_condition] */ bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_UDI, "NO Mem, line:%d\n", __LINE__, 0,0,0,0,0);/* [false alarm]:Disable fortify false alarm */ /* coverity[dead_error_condition] */ return ERROR;/* [false alarm]:Disable fortify false alarm */ } memset((VOID*)pDrvInterface, 0, sizeof(UDI_DRV_INTEFACE_TABLE)); /* 只设置需要实现的几个接口 */ pDrvInterface->udi_open_cb = (UDI_OPEN_CB_T)udiIccAdpOpen; pDrvInterface->udi_close_cb = (UDI_CLOSE_CB_T)BSP_ICC_Close; pDrvInterface->udi_write_cb = (UDI_WRITE_CB_T)BSP_ICC_Write; pDrvInterface->udi_read_cb = (UDI_READ_CB_T)BSP_ICC_Read; pDrvInterface->udi_ioctl_cb = (UDI_IOCTL_CB_T)BSP_ICC_Ioctl; /* 几个 ICC 都使用同一套驱动函数指针 */ for (u32Cnt = 0; u32Cnt < ICC_CHAN_NUM_MAX; u32Cnt++) { (BSP_VOID)BSP_UDI_SetCapability((UDI_DEVICE_ID)UDI_BUILD_DEV_ID(UDI_DEV_ICC, u32Cnt), UDI_ICC_CAPA); (BSP_VOID)BSP_UDI_SetInterfaceTable((UDI_DEVICE_ID)UDI_BUILD_DEV_ID(UDI_DEV_ICC, u32Cnt), pDrvInterface); } /*Custodial pointer 'pDrvInterface' (line 342) has not been freed or returned */ return OK; /*lint !e429 */ }
void cshell_icc_open(void) { ICC_CHAN_ATTR_S attr; UDI_OPEN_PARAM cshell_icc_param; UDI_HANDLE cshell_udi_handle = UDI_INVALID_HANDLE; if (1 == g_usb_cshell_disabled) { printk("%s : usb cshell disabled\n", __FUNCTION__); return ; } attr.enChanMode = ICC_CHAN_MODE_STREAM; attr.u32Priority = 255; attr.u32TimeOut = 1000; attr.event_cb = cshell_event_cb; attr.read_cb = cshell_read_cb; attr.write_cb = cshell_write_cb; attr.u32FIFOInSize = 8192; attr.u32FIFOOutSize = 8192; cshell_icc_param.devid = (UDI_DEVICE_ID)UDI_BUILD_DEV_ID(UDI_DEV_ICC, 31); cshell_icc_param.pPrivate = &attr; cshell_udi_handle = udi_open(&cshell_icc_param); if(cshell_udi_handle <= 0) { printk("cshell_icc_open fail,cshell_udi_handle is %d \n",cshell_udi_handle); g_cshell_udi_handle = -1; } else { printk("cshell_icc_open success,cshell_udi_handle is %d \n",cshell_udi_handle); g_cshell_udi_handle = cshell_udi_handle; } }
/***************************************************************************** 函 数 名 : udi_acm_init 功能描述 : acm端口注册到udi适配层初始化函数,用于将acm设备回调挂接到udi上 输入参数 : void 输出参数 : 无 返 回 值 : int 成功返回ADP_OK 失败返回ADP_ERROR 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2012年9月12日 作 者 : 夏青 00195127 修改内容 : 新生成函数 *****************************************************************************/ int udi_acm_init(void) { int dev_num; int i; UDI_DRV_INTEFACE_TABLE *pDrvInterface = NULL; struct device_node *np = NULL; int phyaddr_from_app = 1;/*默认使用协议栈传下来的物理地址*/ pDrvInterface = (UDI_DRV_INTEFACE_TABLE *)kmalloc(sizeof(UDI_DRV_INTEFACE_TABLE),GFP_KERNEL); if (NULL == pDrvInterface) { ACM_ADP_ERR("kmalloc failed\n"); return ADP_ERROR; } ACM_ADP_DBG("enter\n"); /* 挂接UDI回调函数 */ pDrvInterface->udi_open_cb = (UDI_OPEN_CB_T)udi_acm_open; pDrvInterface->udi_close_cb = (UDI_CLOSE_CB_T)udi_acm_close; pDrvInterface->udi_write_cb = (UDI_WRITE_CB_T)udi_acm_write; pDrvInterface->udi_read_cb = (UDI_READ_CB_T)udi_acm_read; pDrvInterface->udi_ioctl_cb = (UDI_IOCTL_CB_T)udi_acm_ioctl; /* 设置acm设备驱动回调函数,3个acm使用同一套驱动指针 */ for (dev_num = UDI_USB_ACM_CTRL; dev_num < UDI_USB_ACM_MAX; dev_num++){ (void)BSP_UDI_SetCapability((UDI_DEVICE_ID_E)UDI_BUILD_DEV_ID(UDI_DEV_USB_ACM, dev_num), UDI_USB_ACM_CAPA); (void)BSP_UDI_SetInterfaceTable((UDI_DEVICE_ID_E)UDI_BUILD_DEV_ID(UDI_DEV_USB_ACM, dev_num), pDrvInterface); } np = of_find_compatible_node(NULL, NULL, "hisilicon,hi6xxx-usb-otg"); if (np) { if (of_property_read_u32(np, "huawei,phyaddr_from_app",&phyaddr_from_app)){ printk(KERN_ERR "%s:huawei,phyaddr_from_app read error\n",__FUNCTION__); } printk(KERN_INFO "%s:huawei,phyaddr_from_app %d\n",__FUNCTION__,phyaddr_from_app); } for (i = 0; i < USB_ACM_COM_UDI_NUM; i++) { g_acm_priv[i].tty_name = acm_dev_name[i]; g_acm_priv[i].bopen = ACM_DEV_CLOSE; g_acm_priv[i].readDoneCB = NULL; g_acm_priv[i].writeDoneCB = NULL; g_acm_priv[i].eventCB = NULL; g_acm_priv[i].freeSendbuff = NULL; g_acm_priv[i].acm_ncpy = NULL; g_acm_priv[i].tty = NULL; g_acm_priv[i].acm_ldisc_ctx = NULL; g_acm_priv[i].do_copy = 0; g_acm_priv[i].cur_evt = ACM_EVT_DEV_SUSPEND; g_acm_priv[i].ncopy = 0; g_acm_priv[i].phyaddr_from_app = 0; INIT_WORK(&g_acm_priv[i].notify_work, acm_event_notify); if (ACM_NEED_NCOPY(g_acm_priv[i].tty_name)) { g_acm_priv[i].ncopy = 1; g_acm_priv[i].phyaddr_from_app = phyaddr_from_app; } } atomic_notifier_chain_register(&android_usb_suspend_notifier_list, &acm_suspend_notifier); atomic_notifier_chain_register(&android_usb_resume_notifier_list, &acm_resume_notifier); BSP_ACM_RegCmdHandle((ACM_HANDLE_COMMAND_CB_T)acm_handle_command); return ADP_OK; }