void* getNotifier(LPCUSBSIO_I2C_Ctrl_t * dev) { CONTAINER_STATUS lContainerStatus = CONTAINER_SUCCESS; uint32_t size = 0x00; void* Notifier = NULL; if(NULL != dev) { framework_LockMutex(dev->NotifierContainerLock); if(NULL == dev->NotifierContainer) { lContainerStatus = container_create(&dev->NotifierContainer, 2); } if (CONTAINER_SUCCESS == lContainerStatus) { lContainerStatus = container_size(dev->NotifierContainer, &size); if(0x00 == size) { framework_CreateMutex(&Notifier); } else { container_remove(dev->NotifierContainer, 0x00, &Notifier); } } framework_UnlockMutex(dev->NotifierContainerLock); } return Notifier; }
LPCUSBSIO_API LPC_HANDLE I2C_Open(uint32_t index) { hid_device *pHid = NULL; LPCUSBSIO_I2C_Ctrl_t *dev = NULL; struct hid_device_info *cur_dev; cur_dev = GetDevAtIndex(index); if (cur_dev) { pHid = hid_open_path(cur_dev->path); if (pHid) { dev = framework_AllocMem(sizeof(LPCUSBSIO_I2C_Ctrl_t)); memset(dev, 0, sizeof(LPCUSBSIO_I2C_Ctrl_t)); dev->hidDev = pHid; dev->hidInfo = cur_dev; dev->sesionId = rand(); map_create(&dev->request_map); memcpy(&dev->fwVersion[0], g_fwInitVer, strlen(g_fwInitVer)); /* insert at top */ dev->next = g_Ctrl.devList; g_Ctrl.devList = dev; /* Set all calls to this hid device as blocking. */ // hid_set_nonblocking(dev->hidDev, 0); framework_CreateMutex(&dev->SendLock); framework_CreateMutex(&dev->RequestMapLock); framework_CreateMutex(&dev->NotifierContainerLock); dev->thread_exit = 0x00; framework_CreateThread(&dev->ResponsethreadHandle , WaitRequestResponse, dev); } } return (LPC_HANDLE) dev; }
eResult framework_CreateThread(void** threadHandle, void * (* threadedFunc)(void *) , void * ctx) { tLinuxThread_t *linuxThread = (tLinuxThread_t *)framework_AllocMem(sizeof(tLinuxThread_t)); linuxThread->ctx = ctx; linuxThread->threadedFunc = threadedFunc; framework_CreateMutex(&(linuxThread->mutexCanDelete)); if (pthread_create(&(linuxThread->thread), NULL, thread_object_func, linuxThread)) { printf("Cannot create Thread\n"); framework_DeleteMutex(linuxThread->mutexCanDelete); framework_FreeMem(linuxThread); return FRAMEWORK_FAILED; } pthread_detach(linuxThread->thread); *threadHandle = linuxThread; return FRAMEWORK_SUCCESS; }