/* Application entry point */ int main() { Xil_ExceptionDisable(); #ifdef USE_FREERTOS BaseType_t stat; /* Create the tasks */ stat = xTaskCreate(communication_task, ( const char * ) "HW2", 1024, NULL,2,&comm_task); if(stat != pdPASS) return -1; stat = xTaskCreate(matrix_mul, ( const char * ) "HW2", 1024, NULL, 1, &mat_mul ); if(stat != pdPASS) return -1; /*Create Queues*/ mat_mul_queue = xQueueCreate( 1, sizeof( queue_data ) ); OpenAMPInstPtr.send_queue = xQueueCreate( 1, sizeof( queue_data ) ); env_create_sync_lock(&OpenAMPInstPtr.lock,LOCKED); /* Start the tasks and timer running. */ vTaskStartScheduler(); while(1); #else /*Create Queues*/ mat_mul_queue = pq_create_queue(); OpenAMPInstPtr.send_queue = pq_create_queue(); communication_task(); #endif return 0; }
void communication_task(){ int status; rsc_info.rsc_tab = (struct resource_table *)&resources; rsc_info.size = sizeof(resources); zynqMP_r5_gic_initialize(); /* Initialize RPMSG framework */ status = remoteproc_resource_init(&rsc_info, rpmsg_channel_created, rpmsg_channel_deleted, rpmsg_read_cb ,&proc); if (status < 0) { return; } #ifdef USE_FREERTOS comm_queueset = xQueueCreateSet( 2 ); xQueueAddToSet( OpenAMPInstPtr.send_queue, comm_queueset); xQueueAddToSet( OpenAMPInstPtr.lock, comm_queueset); #else env_create_sync_lock(&OpenAMPInstPtr.lock,LOCKED); #endif env_enable_interrupt(VRING1_IPI_INTR_VECT,0,0); while (1) { #ifdef USE_FREERTOS QueueSetMemberHandle_t xActivatedMember; xActivatedMember = xQueueSelectFromSet( comm_queueset, portMAX_DELAY); if( xActivatedMember == OpenAMPInstPtr.lock ) { env_acquire_sync_lock(OpenAMPInstPtr.lock); process_communication(OpenAMPInstPtr); } if (xActivatedMember == OpenAMPInstPtr.send_queue) { xQueueReceive( OpenAMPInstPtr.send_queue, &send_data, 0 ); rpmsg_send(app_rp_chnl, send_data.data, send_data.length); } #else env_acquire_sync_lock(OpenAMPInstPtr.lock); process_communication(OpenAMPInstPtr); echo_test(); /* Wait for the result data on queue */ if(pq_qlength(OpenAMPInstPtr.send_queue) > 0) { send_data = pq_dequeue(OpenAMPInstPtr.send_queue); /* Send the result of echo_test back to master. */ rpmsg_send(app_rp_chnl, send_data->data, send_data->length); } #endif } }
int rpmsg_retarget_init(struct rpmsg_channel *rp_chnl, rpc_shutdown_cb cb) { int status; /* Allocate memory for rpc control block */ rpc_data = (struct _rpc_data*) env_allocate_memory( sizeof(struct _rpc_data)); /* Create a mutex for synchronization */ status = env_create_mutex(&rpc_data->rpc_lock, 1); /* Create a mutex for synchronization */ status = env_create_sync_lock(&rpc_data->sync_lock, LOCKED); /* Create a endpoint to handle rpc response from master */ rpc_data->rpmsg_chnl = rp_chnl; rpc_data->rp_ept = rpmsg_create_ept(rpc_data->rpmsg_chnl, rpc_cb, RPMSG_NULL, PROXY_ENDPOINT); rpc_data->rpc = env_allocate_memory(RPC_BUFF_SIZE); rpc_data->rpc_response = env_allocate_memory(RPC_BUFF_SIZE); rpc_data->shutdown_cb = cb; return status; }
/* create buffer */ void buffer_create(void) { rb.tail=rb.head=0; env_create_sync_lock(&rb.sync_lock, LOCKED); }
/*-----------------------------------------------------------------------------* * Application specific *-----------------------------------------------------------------------------*/ static void rpc_demo(void) { int fd, bytes_written, bytes_read; char fname[] = "remote.file"; char wbuff[50]; char rbuff[1024]; char ubuff[50]; float fdata; int idata; int ret; int status = 0; /* Initialize HW and SW components/objects */ init_system(); env_create_sync_lock(&chnl_cb_flag, LOCKED); /* Resource table needs to be provided to remoteproc_resource_init() */ rsc_info.rsc_tab = (struct resource_table *)&resources; rsc_info.size = sizeof(resources); /* Initialize OpenAMP framework */ status = remoteproc_resource_init(&rsc_info, rpmsg_channel_created, rpmsg_channel_deleted, rpmsg_read_cb, &proc); if (RPROC_SUCCESS != status) { /* print error directly on serial port */ xil_printf("Error: initializing OpenAMP framework\n"); return; } /* wait for notification that will happen on channel creation (interrupt) */ env_acquire_sync_lock(chnl_cb_flag); /* redirect I/Os */ rpmsg_retarget_init(app_rp_chnl, shutdown_cb); printf("\r\nRemote>Baremetal Remote Procedure Call (RPC) Demonstration\r\n"); printf("\r\nRemote>***************************************************\r\n"); printf("\r\nRemote>Rpmsg based retargetting to proxy initialized..\r\n"); /* Remote performing file IO on Master */ printf("\r\nRemote>FileIO demo ..\r\n"); printf("\r\nRemote>Creating a file on master and writing to it..\r\n"); fd = open(fname, REDEF_O_CREAT | REDEF_O_WRONLY | REDEF_O_APPEND, S_IRUSR | S_IWUSR); printf("\r\nRemote>Opened file '%s' with fd = %d\r\n", fname, fd); sprintf(wbuff, "This is a test string being written to file.."); bytes_written = write(fd, wbuff, strlen(wbuff)); printf("\r\nRemote>Wrote to fd = %d, size = %d, content = %s\r\n", fd, bytes_written, wbuff); close(fd); printf("\r\nRemote>Closed fd = %d\r\n", fd); /* Remote performing file IO on Master */ printf("\r\nRemote>Reading a file on master and displaying its contents..\r\n"); fd = open(fname, REDEF_O_RDONLY, S_IRUSR | S_IWUSR); printf("\r\nRemote>Opened file '%s' with fd = %d\r\n", fname, fd); bytes_read = read(fd, rbuff, 1024); *(char*) (&rbuff[0] + bytes_read + 1) = 0; printf( "\r\nRemote>Read from fd = %d, size = %d, printing contents below .. %s\r\n", fd, bytes_read, rbuff); close(fd); printf("\r\nRemote>Closed fd = %d\r\n", fd); while (1) { /* Remote performing STDIO on Master */ printf("\r\nRemote>Remote firmware using scanf and printf ..\r\n"); printf("\r\nRemote>Scanning user input from master..\r\n"); printf("\r\nRemote>Enter name\r\n"); ret = scanf("%s", ubuff); if (ret) { printf("\r\nRemote>Enter age\r\n"); ret = scanf("%d", &idata); if(ret) { printf("\r\nRemote>Enter value for pi\r\n"); ret = scanf("%f", &fdata); if(ret) { printf("\r\nRemote>User name = '%s'\r\n", ubuff); printf("\r\nRemote>User age = '%d'\r\n", idata); printf("\r\nRemote>User entered value of pi = '%f'\r\n", fdata); } } } if(!ret) { scanf("%s", ubuff); printf("Remote> Invalid value. Starting again...."); } else { printf("\r\nRemote>Repeat demo ? (enter yes or no) \r\n"); scanf("%s", ubuff); if((strcmp(ubuff,"no")) && (strcmp(ubuff,"yes"))) { printf("\r\nRemote>Invalid option. Starting again....\r\n"); } else if((!strcmp(ubuff,"no"))) { printf("\r\nRemote>RPC retargetting quitting ...\r\n"); sprintf(wbuff, RPC_CHANNEL_READY_TO_CLOSE); rpmsg_retarget_send(wbuff, sizeof(RPC_CHANNEL_READY_TO_CLOSE) + 1); break; } } } printf("\r\nRemote> Firmware's rpmsg-openamp-demo-channel going down! \r\n"); }