extern int32_t ciaaMulticore_init_Arch(void) { int32_t rv = -1; /* Init IPC queue, only in master core */ rv = ciaaLibs_circBufInit(ipc_queue, CIAA_MULTICORE_IPC_QUEUE_ADDR + sizeof(ciaaLibs_CircBufType), CIAA_MULTICORE_IPC_QUEUE_LEN); if(rv == 1) { NVIC_EnableIRQ(M0APP_IRQn); /* Start slave core */ cr_start_m0(SLAVE_M0APP, CIAA_MULTICORE_CORE_1_IMAGE); rv = 0; } return rv; }
/*==================[external functions definition]==========================*/ extern ciaaLibs_CircBufType * ciaaLibs_circBufNew(size_t nbytes) { ciaaLibs_CircBufType * ret = NULL; /* check that size is at least 8 and power of 2 */ if ( (nbytes > 7) && (ciaaLibs_isPowerOfTwo(nbytes)) ) { ret = (ciaaLibs_CircBufType *) ciaaPOSIX_malloc(sizeof(ciaaLibs_CircBufType)+nbytes); /* if a valid pointer has been returned */ if (NULL != ret) { /* init the buffer */ ciaaLibs_circBufInit(ret, (void*) ( (intptr_t) ret + sizeof(ciaaLibs_CircBufType) ), nbytes); } } return ret; } /* end ciaaLibs_circBufNew */
extern void ciaaSerialDevices_addDriver(ciaaDevices_deviceType * driver) { ciaaDevices_deviceType * newDevice; char * newDeviceName; uint8_t length; uint8_t position; /* enter critical section */ /* not needed, only 1 task running */ /* check if more drivers can be added */ if (ciaaSerialDevices_MAXDEVICES > ciaaSerialDevices.position) { /* get position for next device */ position = ciaaSerialDevices.position; /* increment position for next device */ ciaaSerialDevices.position++; /* exit critical section */ /* not needed, only 1 task running */ /* add driver */ ciaaSerialDevices.devstr[position].device = driver; /* configure rx and tx buffers */ /* TODO buffer size shall be created depending on the device type (eth != uart) */ ciaaLibs_circBufInit(&ciaaSerialDevices.devstr[position].rxBuf, ciaak_malloc(256), 256); ciaaLibs_circBufInit(&ciaaSerialDevices.devstr[position].txBuf, ciaak_malloc(256), 256); /* initial flags */ ciaaSerialDevices.devstr[position].flags = 0; /* allocate memory for new device */ newDevice = (ciaaDevices_deviceType*) ciaak_malloc(sizeof(ciaaDevices_deviceType)); /* set functions for this device */ newDevice->open = ciaaSerialDevices_open; newDevice->close = ciaaSerialDevices_close; newDevice->ioctl = ciaaSerialDevices_ioctl; newDevice->read = ciaaSerialDevices_read; newDevice->write = ciaaSerialDevices_write; /* store layers information information */ newDevice->layer = (void *) &ciaaSerialDevices.devstr[position]; newDevice->loLayer = (void *) driver; /* store newDevice layer information in the lower layer */ driver->upLayer = newDevice; /* create path string for this device */ length = ciaaPOSIX_strlen(driver->path); length += ciaaPOSIX_strlen(ciaaSerialDevices_prefix); length += 2; /* for the / and the termination null */ /* create path for the new device */ newDeviceName = (char *) ciaak_malloc(length); /* start a new string */ *newDeviceName = 0; /* add prefix, / and the device name */ ciaaPOSIX_strcat(newDeviceName, ciaaSerialDevices_prefix); ciaaPOSIX_strcat(newDeviceName, "/"); ciaaPOSIX_strcat(newDeviceName, driver->path); /* add path to device structure */ newDevice->path = newDeviceName; /* add device */ ciaaDevices_addDevice(newDevice); } else { /* exit critical section */ /* not needed, only 1 task running */ } }