static _mqx_int _io_serial_mix_open ( /* [IN] the file handle for the device being opened */ FILE_DEVICE_STRUCT_PTR fd_ptr, /* [IN] the remaining portion of the name of the device */ char *open_name_ptr, /* [IN] the flags to be used during operation: ** echo, translation, xon/xoff */ char *flags ) { /* Body */ IO_DEVICE_STRUCT_PTR io_dev_ptr; IO_SERIAL_INT_DEVICE_STRUCT_PTR int_io_dev_ptr; _mqx_uint result = MQX_OK; _mqx_uint ioctl_val; io_dev_ptr = fd_ptr->DEV_PTR; int_io_dev_ptr = (void *)io_dev_ptr->DRIVER_INIT_PTR; if (int_io_dev_ptr->COUNT) { /* Device is already opened */ int_io_dev_ptr->COUNT++; fd_ptr->FLAGS = int_io_dev_ptr->FLAGS; return(result); } /* Endif */ int_io_dev_ptr->IN_WAITING_TASKS = _taskq_create(MQX_TASK_QUEUE_FIFO); int_io_dev_ptr->OUT_WAITING_TASKS = _taskq_create(MQX_TASK_QUEUE_FIFO); int_io_dev_ptr->OUT_QUEUE = (void *)_mem_alloc_system( sizeof(CHARQ_STRUCT) - (4 * sizeof(char)) + int_io_dev_ptr->OQUEUE_SIZE); _mem_set_type(int_io_dev_ptr->OUT_QUEUE,MEM_TYPE_IO_SERIAL_OUT_QUEUE); _CHARQ_INIT(int_io_dev_ptr->OUT_QUEUE, int_io_dev_ptr->OQUEUE_SIZE); int_io_dev_ptr->FLAGS = (_mqx_uint)flags; fd_ptr->FLAGS = (_mqx_uint)flags; result = (*int_io_dev_ptr->DEV_INIT)(int_io_dev_ptr, open_name_ptr); if (result == MQX_OK) { result = (*int_io_dev_ptr->DEV_ENABLE_INTS)(int_io_dev_ptr->DEV_INFO_PTR); } /* Endif */ if (result != MQX_OK) { _mem_free(int_io_dev_ptr->OUT_QUEUE); _taskq_destroy(int_io_dev_ptr->IN_WAITING_TASKS); _taskq_destroy(int_io_dev_ptr->OUT_WAITING_TASKS); } int_io_dev_ptr->COUNT = 1; return(result); } /* Endbody */
uint_32 _core_mutex_create_internal(CORE_MUTEX_PTR mutex_ptr, uint_32 core_num, uint_32 mutex_num, uint_32 policy, boolean allocated ) { CORE_MUTEX_COMPONENT_PTR component_ptr = _core_mutext_get_component_ptr(); #if MQX_CHECK_ERRORS if (component_ptr == NULL) { return MQX_COMPONENT_DOES_NOT_EXIST; } // range check mutex_id if (mutex_num>=SEMA4_NUM_GATES) { return (MQX_INVALID_PARAMETER); } if (core_num>=PSP_NUM_CORES) { return (MQX_INVALID_PARAMETER); } if (mutex_ptr==NULL) { return MQX_INVALID_PARAMETER; } #endif mutex_ptr->VALID = CORE_MUTEX_VALID; mutex_ptr->GATE_NUM = mutex_num; mutex_ptr->GATE_PTR = &(component_ptr->DEVICE[core_num].SEMA4_PTR->GATE[mutex_ptr->GATE_NUM]); mutex_ptr->WAIT_Q = _taskq_create(policy); #if MQX_CHECK_ERRORS if (mutex_ptr->WAIT_Q==NULL) { return MQX_TASKQ_CREATE_FAILED; } #endif _int_disable(); #if MQX_CHECK_ERRORS if (component_ptr->DEVICE[core_num].MUTEX_PTR[mutex_num] !=NULL) { _int_enable(); _taskq_destroy(mutex_ptr->WAIT_Q); return MQX_COMPONENT_EXISTS; } #endif component_ptr->DEVICE[core_num].MUTEX_PTR[mutex_num]=mutex_ptr; // Need to remember if we allocated this mutex, or user did if (allocated) { component_ptr->DEVICE[core_num].ALLOCED |= (1<<mutex_num); } // Enable 'unlocked' interrupt for this core if (_psp_core_num()==0) { component_ptr->DEVICE[core_num].SEMA4_PTR->CP0INE |= 1 << (SEMA4_NUM_GATES - 1 - idx[mutex_num]); //1 << (SEMA4_NUM_GATES-1-mutex_num); } else { component_ptr->DEVICE[core_num].SEMA4_PTR->CP1INE |= 1 << (SEMA4_NUM_GATES - 1 - idx[mutex_num]); //1 << (SEMA4_NUM_GATES-1-mutex_num); } _int_enable(); return COREMUTEX_OK; }
_mqx_int _io_serial_int_open ( /* [IN] the file handle for the device being opened */ FILE_DEVICE_STRUCT_PTR fd_ptr, /* [IN] the remaining portion of the name of the device */ char _PTR_ open_name_ptr, /* [IN] the flags to be used during operation: ** echo, translation, xon/xoff */ char _PTR_ flags ) { /* Body */ IO_DEVICE_STRUCT_PTR io_dev_ptr; IO_SERIAL_INT_DEVICE_STRUCT_PTR int_io_dev_ptr; _mqx_uint result = MQX_OK; _mqx_uint ioctl_val; io_dev_ptr = fd_ptr->DEV_PTR; int_io_dev_ptr = (pointer)io_dev_ptr->DRIVER_INIT_PTR; if (int_io_dev_ptr->COUNT) { /* Device is already opened */ int_io_dev_ptr->COUNT++; fd_ptr->FLAGS = int_io_dev_ptr->FLAGS; return(result); } /* Endif */ int_io_dev_ptr->IN_WAITING_TASKS = _taskq_create(MQX_TASK_QUEUE_FIFO); int_io_dev_ptr->OUT_WAITING_TASKS = _taskq_create(MQX_TASK_QUEUE_FIFO); int_io_dev_ptr->IN_QUEUE = (pointer)_mem_alloc_system( sizeof(CHARQ_STRUCT) - (4 * sizeof(char)) + int_io_dev_ptr->QUEUE_SIZE); int_io_dev_ptr->OUT_QUEUE = (pointer)_mem_alloc_system( sizeof(CHARQ_STRUCT) - (4 * sizeof(char)) + int_io_dev_ptr->QUEUE_SIZE); #if MQX_CHECK_MEMORY_ALLOCATION_ERRORS if ((int_io_dev_ptr->IN_QUEUE == NULL) || (int_io_dev_ptr->OUT_QUEUE == NULL) || (int_io_dev_ptr->IN_WAITING_TASKS == NULL) || (int_io_dev_ptr->OUT_WAITING_TASKS == NULL)) { if (int_io_dev_ptr->IN_QUEUE != NULL){ _mem_free(int_io_dev_ptr->IN_QUEUE); } /* Endif */ if (int_io_dev_ptr->OUT_QUEUE != NULL){ _mem_free(int_io_dev_ptr->OUT_QUEUE); } /* Endif */ if (int_io_dev_ptr->IN_WAITING_TASKS != NULL) { _taskq_destroy(int_io_dev_ptr->IN_WAITING_TASKS); }/* Endif */ if (int_io_dev_ptr->OUT_WAITING_TASKS != NULL) { _taskq_destroy(int_io_dev_ptr->OUT_WAITING_TASKS); }/* Endif */ return(MQX_OUT_OF_MEMORY); }/* Endif */ #endif _mem_set_type(int_io_dev_ptr->IN_QUEUE,MEM_TYPE_IO_SERIAL_IN_QUEUE); _mem_set_type(int_io_dev_ptr->OUT_QUEUE,MEM_TYPE_IO_SERIAL_OUT_QUEUE); _CHARQ_INIT(int_io_dev_ptr->IN_QUEUE, int_io_dev_ptr->QUEUE_SIZE); _CHARQ_INIT(int_io_dev_ptr->OUT_QUEUE, int_io_dev_ptr->QUEUE_SIZE); int_io_dev_ptr->INPUT_HIGH_WATER_MARK = int_io_dev_ptr->QUEUE_SIZE - int_io_dev_ptr->QUEUE_SIZE/8; int_io_dev_ptr->INPUT_LOW_WATER_MARK = int_io_dev_ptr->QUEUE_SIZE/2; int_io_dev_ptr->FLAGS = (_mqx_uint)flags; fd_ptr->FLAGS = (_mqx_uint)flags; #if MQX_ENABLE_LOW_POWER _lwsem_wait (&(int_io_dev_ptr->LPM_INFO.LOCK)); #endif result = (*int_io_dev_ptr->DEV_INIT)(int_io_dev_ptr, open_name_ptr); #if MQX_ENABLE_LOW_POWER _lwsem_post (&(int_io_dev_ptr->LPM_INFO.LOCK)); #endif if (result == MQX_OK) { #if MQX_ENABLE_LOW_POWER _lwsem_wait (&(int_io_dev_ptr->LPM_INFO.LOCK)); #endif result = (*int_io_dev_ptr->DEV_ENABLE_INTS)(int_io_dev_ptr->DEV_INFO_PTR); #if MQX_ENABLE_LOW_POWER _lwsem_post (&(int_io_dev_ptr->LPM_INFO.LOCK)); #endif if (int_io_dev_ptr->DEV_IOCTL != NULL) { if ((_mqx_uint)flags & IO_SERIAL_HW_FLOW_CONTROL) { ioctl_val = IO_SERIAL_RTS; (*int_io_dev_ptr->DEV_IOCTL)(int_io_dev_ptr->DEV_INFO_PTR, IO_IOCTL_SERIAL_SET_HW_SIGNAL, &ioctl_val); } /* Endif */ ioctl_val = (_mqx_uint)flags; (*int_io_dev_ptr->DEV_IOCTL)(int_io_dev_ptr->DEV_INFO_PTR, IO_IOCTL_SERIAL_SET_FLAGS, &ioctl_val); } if (result == MQX_OK && ((_mqx_uint)flags & IO_SERIAL_NON_BLOCKING) && (_mqx_uint)flags & (IO_SERIAL_TRANSLATION | IO_SERIAL_ECHO | IO_SERIAL_XON_XOFF)) { result = MQX_INVALID_PARAMETER; } /* Endif */ } /* Endif */ if (result != MQX_OK) { _mem_free(int_io_dev_ptr->IN_QUEUE); _mem_free(int_io_dev_ptr->OUT_QUEUE); _taskq_destroy(int_io_dev_ptr->IN_WAITING_TASKS); _taskq_destroy(int_io_dev_ptr->OUT_WAITING_TASKS); } int_io_dev_ptr->COUNT = 1; return(result); } /* Endbody */