summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 2935946)
raw | patch | inline | side by side (parent: 2935946)
author | Sam Sortais <sam.sortais@xilinx.com> | |
Fri, 12 Aug 2016 01:33:52 +0000 (18:33 -0700) | ||
committer | Wendy Liang <jliang@xilinx.com> | |
Sat, 13 Aug 2016 06:36:45 +0000 (23:36 -0700) |
Signed-off-by: Sam Sortais <sam.sortais@xilinx.com>
lib/system/freertos/init.c | patch | blob | history | |
lib/system/freertos/irq.c | patch | blob | history |
index c82cf118d254efba26ea8977367c2a9c8e6215ef..e667b0fe95c2601f2442ffb70d31742bd4265993 100644 (file)
* @brief FreeRTOS libmetal initialization.
*/
-#include <metal/sys.h>
-#include <metal/utilities.h>
+#include "metal/sys.h"
+#include "metal/utilities.h"
+
+extern int metal_irq_init(void);
+extern void metal_irq_deinit(void);
struct metal_state _metal;
int metal_sys_init(const struct metal_init_params *params)
{
metal_unused(params);
- return 0;
+ return metal_irq_init();
}
void metal_sys_finish(void)
{
+ metal_irq_deinit();
}
index dcfc6b6c08f0c63300729dfc79ac8603cd78b2ff..8af814188f8093de81f1ec483434225f999cff65 100644 (file)
#include "metal/irq.h"
#include "metal/sys.h"
#include "metal/log.h"
+#include "metal/mutex.h"
handlers
descriptors */
unsigned int intr_enable;
+ metal_mutex_t irq_lock;
};
static struct metal_irqs_state _irqs;
struct metal_device *dev,
void *drv_id)
{
- unsigned int irq_flags_save;
+ unsigned int irq_flags_save;
struct metal_irq_hddesc *hd_desc;
int j,i = 0;
return -EINVAL;
}
+ metal_mutex_acquire(&_irqs.irq_lock);
while (i < MAX_HDS) {
hd_desc = &_irqs.hds[irq][i];
if ((hd_desc->drv_id == drv_id) || (!drv_id && !hd)) {
if (hd) {
metal_log(LOG_ERROR, "%s: irq %d has already registered."
"Will not register again.\n", __func__, irq);
+ metal_mutex_release(&_irqs.irq_lock);
return -EINVAL;
} else {
/* we are at end of registered hds */
break;
} else if (!hd_desc->drv_id) {
metal_log(LOG_ERROR, "%s: irq %d drv id not found.\n", __func__, irq);
+ metal_mutex_release(&_irqs.irq_lock);
return -EINVAL;
}
i++;
}
+ metal_mutex_release(&_irqs.irq_lock);
+
if (i >= MAX_HDS) {
metal_log(LOG_ERROR, "%s: exceed maximum handlers per IRQ.\n",
__func__);
if (!hd) break;
hd(vector, _irqs.hds[vector][j].drv_id);
}
+}
+
+int metal_irq_init(void)
+{
+ /* memset(&_irqs, 0, sizeof(_irqs)); */
+ metal_mutex_init(&_irqs.irq_lock);
+ return 0;
}
+void metal_irq_deinit(void)
+{
+ metal_mutex_deinit(&_irqs.irq_lock);
+}