| /* |
| * Support for Intel Camera Imaging ISP subsystem. |
| * Copyright (c) 2015, Intel Corporation. |
| * |
| * This program is free software; you can redistribute it and/or modify it |
| * under the terms and conditions of the GNU General Public License, |
| * version 2, as published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
| * more details. |
| */ |
| |
| #include "ia_css_types.h" |
| #include "assert_support.h" |
| #include "ia_css_queue.h" /* sp2host_dequeue_irq_event() */ |
| #include "ia_css_eventq.h" |
| #include "ia_css_event.h" /* ia_css_event_encode() |
| ia_css_event_decode() |
| */ |
| #include "platform_support.h" /* hrt_sleep() */ |
| |
| int ia_css_eventq_recv( |
| ia_css_queue_t *eventq_handle, |
| uint8_t *payload) |
| { |
| uint32_t sp_event; |
| int error; |
| |
| /* dequeue the IRQ event */ |
| error = ia_css_queue_dequeue(eventq_handle, &sp_event); |
| |
| /* check whether the IRQ event is available or not */ |
| if (!error) |
| ia_css_event_decode(sp_event, payload); |
| return error; |
| } |
| |
| /** |
| * @brief The Host sends the event to the SP. |
| * Refer to "sh_css_sp.h" for details. |
| */ |
| int ia_css_eventq_send( |
| ia_css_queue_t *eventq_handle, |
| uint8_t evt_id, |
| uint8_t evt_payload_0, |
| uint8_t evt_payload_1, |
| uint8_t evt_payload_2) |
| { |
| uint8_t tmp[4]; |
| uint32_t sw_event; |
| int error = ENOSYS; |
| |
| /* |
| * Encode the queue type, the thread ID and |
| * the queue ID into the event. |
| */ |
| tmp[0] = evt_id; |
| tmp[1] = evt_payload_0; |
| tmp[2] = evt_payload_1; |
| tmp[3] = evt_payload_2; |
| ia_css_event_encode(tmp, 4, &sw_event); |
| |
| /* queue the software event (busy-waiting) */ |
| for ( ; ; ) { |
| error = ia_css_queue_enqueue(eventq_handle, sw_event); |
| if (ENOBUFS != error) { |
| /* We were able to successfully send the event |
| or had a real failure. return the status*/ |
| break; |
| } |
| /* Wait for the queue to be not full and try again*/ |
| hrt_sleep(); |
| } |
| return error; |
| } |