Advertisement
Donny3000

dummy_arm.h

Jan 26th, 2015
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.33 KB | None | 0 0
  1. /*
  2.  * Copyright (C) 2010-2011 University of Texas at Austin
  3.  *
  4.  * Author: Dan Zhang <dan.zhang@mail.utexas.edu>
  5.  *
  6.  * This library is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU Lesser General Public
  8.  * License as published by the Free Software Foundation
  9.  * version 2.1 of the License.
  10.  *
  11.  * Copyright (C) 2009-2010 Felipe Contreras
  12.  * Copyright (C) 2009-2010 Nokia Corporation
  13.  * Copyright (C) 2009 Igalia S.L
  14.  *
  15.  * Author: Felipe Contreras <felipe.contreras@nokia.com>
  16.  *
  17.  * This file may be used under the terms of the GNU Lesser General Public
  18.  * License version 2.1, a copy of which is found in LICENSE included in the
  19.  * packaging of this file.
  20.  */
  21.  
  22. static dmm_buffer_t *input_buffer;
  23. static dmm_buffer_t *output_buffer;
  24.  
  25. static int dsp_handle;
  26. static void *proc;
  27.  
  28. /*static void
  29. signal_handler(int signal)
  30. {
  31.   exit(-1);
  32. }*/
  33.  
  34. static inline struct dsp_node *
  35. create_node(void)
  36. {
  37.   struct dsp_node *node;
  38.   const struct dsp_uuid dummy_uuid = { 0x3dac26d0, 0x6d4b, 0x11dd, 0xad, 0x8b,
  39.                        { 0x08, 0x00, 0x20, 0x0c, 0x9a, 0x66 } };
  40.  
  41.   if (!dsp_register(dsp_handle, &dummy_uuid, DSP_DCD_LIBRARYTYPE, "/lib/dsp/dummy.dll64P"))
  42.     return false;
  43.  
  44.   if (!dsp_register(dsp_handle, &dummy_uuid, DSP_DCD_NODETYPE, "/lib/dsp/dummy.dll64P"))
  45.     return false;
  46.  
  47.   if (!dsp_node_allocate(dsp_handle, proc, &dummy_uuid, NULL, NULL, &node)) {
  48.     pr_err("dsp node allocate failed");
  49.     return NULL;
  50.   }
  51.  
  52.   if (!dsp_node_create(dsp_handle, node)) {
  53.     pr_err("dsp node create failed");
  54.     return NULL;
  55.   }
  56.  
  57.   pr_info("dsp node created");
  58.  
  59.   return node;
  60. }
  61.  
  62. static inline bool
  63. destroy_node(struct dsp_node *node)
  64. {
  65.   struct dsp_msg msg;
  66.  
  67.   if (node) {
  68.     // Send a DONE message to the DSP
  69.     msg.cmd = 0x80000000;
  70.     msg.arg_1 = (uint32_t) input_buffer->map;
  71.     msg.arg_2 = (uint32_t) output_buffer->map;
  72.     dsp_node_put_message(dsp_handle, node, &msg, -1);
  73.  
  74.     if (!dsp_node_free(dsp_handle, node)) {
  75.       pr_err("dsp node free failed");
  76.       return false;
  77.     }
  78.  
  79.     pr_info("dsp node deleted");
  80.   }
  81.  
  82.   return true;
  83. }
  84.  
  85. static inline void
  86. configure_dsp_node(void *node,
  87.            dmm_buffer_t *input_buffer,
  88.            dmm_buffer_t *output_buffer)
  89. {
  90.   struct dsp_msg msg;
  91.  
  92.   msg.cmd = 0;
  93.   msg.arg_1 = (uint32_t) input_buffer->map;
  94.   msg.arg_2 = (uint32_t) output_buffer->map;
  95.   dsp_node_put_message(dsp_handle, node, &msg, -1);
  96. }
  97.  
  98.  
  99. static inline void
  100. setup_dmm_buffers(struct dsp_node *node, int input_size, int output_size) {
  101.   printf("Calling dsp_node_run\n");
  102.   if (!dsp_node_run(dsp_handle, node)) {
  103.     pr_err("dsp node run failed");
  104.     exit(-1);
  105.   }
  106.   printf("Calling dmm_buffer_new\n");
  107.   pr_info("dsp node running");
  108.  
  109.   input_buffer = dmm_buffer_new(dsp_handle, proc, DMA_TO_DEVICE);
  110.   output_buffer = dmm_buffer_new(dsp_handle, proc, DMA_FROM_DEVICE);
  111.   printf("Calling dmm_buffer_allocate\n");
  112.   dmm_buffer_allocate(input_buffer, input_size);
  113.   dmm_buffer_allocate(output_buffer, output_size);
  114.  
  115.   dmm_buffer_map(output_buffer);
  116.   dmm_buffer_map(input_buffer);
  117.  
  118.   configure_dsp_node(node, input_buffer, output_buffer);
  119. }
  120.  
  121. static inline void
  122. dsp_send(struct dsp_node *node, struct dsp_msg msg) {
  123.   dmm_buffer_begin(input_buffer, input_buffer->size);
  124.   dmm_buffer_begin(output_buffer, output_buffer->size);
  125.   dsp_node_put_message(dsp_handle, node, &msg, -1);
  126. }
  127.  
  128. // blocking DSP receive
  129. static inline struct dsp_msg
  130. dsp_recv(struct dsp_node *node) {
  131.   struct dsp_msg msg;
  132.   dsp_node_get_message(dsp_handle, node, &msg, -1);
  133.   dmm_buffer_end(input_buffer, input_buffer->size);
  134.   dmm_buffer_end(output_buffer, output_buffer->size);
  135.   return msg;
  136. }
  137.  
  138. // non-blocking DSP receive
  139. static inline bool
  140. dsp_irecv(struct dsp_node *node, struct dsp_msg* msg) {
  141.   bool complete;
  142.   complete = dsp_node_get_message(dsp_handle, node, msg, 0);
  143.   if(complete) {
  144.     dmm_buffer_end(input_buffer, input_buffer->size);
  145.     dmm_buffer_end(output_buffer, output_buffer->size);
  146.     return true;
  147.   }
  148.   else {
  149.     return false;
  150.   }
  151. }
  152.  
  153.  
  154. static inline bool
  155. dsp_finish(struct dsp_node *node) {
  156.   unsigned long exit_status;
  157.  
  158.   dmm_buffer_unmap(output_buffer);
  159.   dmm_buffer_unmap(input_buffer);
  160.  
  161.   dmm_buffer_free(output_buffer);
  162.   dmm_buffer_free(input_buffer);
  163.  
  164.   if (!dsp_node_terminate(dsp_handle, node, &exit_status)) {
  165.     pr_err("dsp node terminate failed: %lx", exit_status);
  166.     return false;
  167.   }
  168.  
  169.   destroy_node(node);
  170.   pr_info("dsp node terminated");
  171.   return true;
  172. }
  173.  
  174.  
  175. static struct dsp_node* setup_dsp() {
  176.   struct dsp_node *node;
  177.   int ret = 0;
  178.  
  179. //  signal(SIGINT, signal_handler);
  180.  
  181. #ifdef DEBUG
  182.   debug_level = 3;
  183. #endif
  184.   dsp_handle = dsp_open();
  185.  
  186.   if (dsp_handle < 0) {
  187.     pr_err("dsp open failed");
  188.     ret = -1;
  189.     exit(ret);
  190.   }
  191.  
  192.   if (!dsp_attach(dsp_handle, 0, NULL, &proc)) {
  193.     pr_err("dsp attach failed");
  194.     ret = -1;
  195.     goto leave;
  196.   }
  197.  
  198.   node = create_node();
  199.   if (!node) {
  200.     pr_err("dsp node creation failed");
  201.     ret = -1;
  202.     goto leave;
  203.   }
  204.  
  205.   return node;
  206.  
  207.  leave:
  208.   if (proc) {
  209.     if (!dsp_detach(dsp_handle, proc)) {
  210.       pr_err("dsp detach failed");
  211.       ret = -1;
  212.     }
  213.     proc = NULL;
  214.   }
  215.  
  216.   if (dsp_handle > 0) {
  217.     if (dsp_close(dsp_handle) < 0) {
  218.       pr_err("dsp close failed");
  219.       exit(-1);
  220.       //return -1;
  221.     }
  222.   }
  223.  
  224.   exit(-1);
  225.   return node;
  226. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement