OpenCores
URL https://opencores.org/ocsvn/funbase_ip_library/funbase_ip_library/trunk

Subversion Repositories funbase_ip_library

[/] [funbase_ip_library/] [trunk/] [TUT/] [ip.hwp.communication/] [hibi_pe_dma/] [1.0/] [drv/] [hpd_functions.c] - Blame information for rev 145

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 145 lanttu
/*
2
 * @file   hpd_functions.c
3
 * @author Lasse Lehtonen
4
 * @date   2012-02-27
5
 *
6
 * @brief Implements platform independent functions for HIBI_PE_DMA.
7
 *
8
 */
9
 
10
#include "hpd_macros.h"
11
#include "hpd_config.h"
12
#include "hpd_functions.h"
13
 
14
#include <string.h>
15
 
16
 
17
void hpd_initialize()
18
{
19
  int i;
20
  int base;
21
  int tx_base;
22
  int tx_size;
23
  int tx_haddr;
24
  int tx_cmd;
25
  int rx_base;
26
  int rx_words;
27
  int rx_haddr;
28
  int n_streams;
29
  int n_packets;
30
  int c;
31
  for(i = 0; i < NUM_OF_HIBI_PE_DMAS; ++i) {
32
    base       = hpd_ifaces[i].base_address;
33
    tx_base    = hpd_ifaces[i].tx_base_address;
34
    tx_size    = hpd_ifaces[i].tx_buffer_bytes;
35
    tx_haddr   = hpd_ifaces[i].tx_hibi_address;
36
    tx_cmd     = hpd_ifaces[i].tx_hibi_command;
37
    n_streams  = hpd_ifaces[i].n_stream_channels;
38
    n_packets  = hpd_ifaces[i].n_packet_channels;
39
 
40
    // Set tx_buffer start address
41
    HPD_TX_MEM_ADDR(tx_base, base);
42
 
43
    // Set amount to send
44
    HPD_TX_WORDS(((tx_size+3) >> 2), base);
45
 
46
    // Set target hibi command
47
    HPD_TX_CMD(tx_cmd, base);
48
 
49
    // Set target hibi address
50
    HPD_TX_HIBI_ADDR(tx_haddr, base);
51
 
52
    for(c = 0; c < n_streams; ++c) {
53
      rx_base  = hpd_ifaces[i].rx_streams[c].rx_base_address;
54
      rx_words = (hpd_ifaces[i].rx_streams[c].rx_buffer_bytes+3) >> 2;
55
      rx_haddr = hpd_ifaces[i].rx_streams[c].rx_hibi_address;
56
      hpd_ifaces[i].rx_streams[c].rx_read_words = 0;
57
      // Set receive mem address for incoming data
58
      HPD_RX_MEM_ADDR(c, rx_base, base);
59
      // Set amount to receive
60
      HPD_RX_WORDS(c, rx_words, base);
61
      // Set hibi address to receive data
62
      HPD_RX_HIBI_ADDR(c, rx_haddr, base);
63
    }
64
 
65
    for(c = 0; c < n_packets; ++c) {
66
      rx_base  = hpd_ifaces[i].rx_packets[c].rx_base_address;
67
      rx_words = (hpd_ifaces[i].rx_packets[c].rx_buffer_bytes+3) >> 2;
68
      rx_haddr = hpd_ifaces[i].rx_packets[c].rx_hibi_address;
69
      // Set receive mem address for incoming data
70
      HPD_RX_MEM_ADDR(c+n_streams, rx_base, base);
71
      // Set amount to receive
72
      HPD_RX_WORDS(c+n_streams, rx_words, base);
73
      // Set hibi address to receive data
74
      HPD_RX_HIBI_ADDR(c+n_streams, rx_haddr, base);
75
    }
76
  }
77
}
78
 
79
 
80
void hpd_tx_base_conf_gen(int base, int words, int iface)
81
{
82
  hpd_ifaces[iface].tx_base_address = base;
83
  hpd_ifaces[iface].tx_buffer_bytes = words << 2;
84
  int hpd_base = hpd_ifaces[iface].base_address;
85
 
86
  // Set tx_buffer start address
87
  HPD_TX_MEM_ADDR(base, hpd_base);
88
 
89
  // Set amount to send
90
  HPD_TX_WORDS(words, hpd_base);
91
}
92
 
93
 
94
void hpd_tx_base_conf(int base, int words)
95
{
96
  hpd_tx_base_conf_gen(base, words, 0);
97
}
98
 
99
 
100
void hpd_tx_send_gen(int daddr, int words, int haddr, int iface)
101
{
102
  int tx_done = 0;
103
  int base     = hpd_ifaces[iface].base_address;
104
  int tx_base  = hpd_ifaces[iface].tx_base_address;
105
  int tx_haddr = hpd_ifaces[iface].tx_hibi_address;
106
  int tx_cmd   = hpd_ifaces[iface].tx_hibi_command;
107
 
108
  // Poll HPD until it's not sending previous tx anymore
109
  for(; !tx_done;) {
110
    HPD_TX_GET_DONE(tx_done, base);
111
  }
112
 
113
  // Set tx_buffer start address
114
  if(tx_base != daddr) {
115
    HPD_TX_MEM_ADDR(daddr, base);
116
  }
117
 
118
  // Set target hibi command WRITE
119
  if(tx_cmd != 2) {
120
    HPD_TX_CMD(2, base);
121
    hpd_ifaces[iface].tx_hibi_command = 2;
122
  }
123
 
124
  // Set target hibi address
125
  if(tx_haddr != haddr) {
126
    HPD_TX_HIBI_ADDR(haddr, base);
127
    hpd_ifaces[iface].tx_hibi_address = haddr;
128
  }
129
 
130
  // Set amount to send
131
  HPD_TX_WORDS(words, base);
132
 
133
  // Start the transfer
134
  HPD_TX_START(base);
135
}
136
 
137
void hpd_tx_send(int daddr, int words, int haddr)
138
{
139
  hpd_tx_send_gen(daddr, words, haddr, 0);
140
}
141
 
142
void hpd_tx_send_copy_gen(int daddr, int words, int haddr, int iface)
143
{
144
  int tx_done  = 0;
145
  int base     = hpd_ifaces[iface].base_address;
146
  int tx_base  = hpd_ifaces[iface].tx_base_address;
147
  int tx_size  = hpd_ifaces[iface].tx_buffer_bytes;
148
  int tx_haddr = hpd_ifaces[iface].tx_hibi_address;
149
  int tx_cmd   = hpd_ifaces[iface].tx_hibi_command;
150
 
151
  // Set tx_buffer start address
152
  HPD_TX_MEM_ADDR(tx_base, base);
153
 
154
  // Set target hibi command WRITE
155
  if(tx_cmd != 2) {
156
    HPD_TX_CMD(2, base);
157
    hpd_ifaces[iface].tx_hibi_command = 2;
158
  }
159
 
160
  // Set target hibi address
161
  if(tx_haddr != haddr) {
162
    HPD_TX_HIBI_ADDR(haddr, base);
163
    hpd_ifaces[iface].tx_hibi_address = haddr;
164
  }
165
 
166
  while(words > 0)
167
    {
168
      // Poll HPD until it's not sending previous tx anymore
169
      for(; !tx_done;) {
170
        HPD_TX_GET_DONE(tx_done, base);
171
      }
172
      tx_done = 0;
173
 
174
      // Copy data in pieces if there's more than tx_buffer's size
175
      if(words > (tx_size >> 2)) {
176
        memcpy((void*)tx_base, (void*)daddr, tx_size);
177
        daddr += tx_size;
178
        words -= (tx_size >> 2);
179
        // Set how many words to send
180
        HPD_TX_WORDS((tx_size >> 2), base);
181
      } else {
182
        memcpy((void*)tx_base, (void*)daddr, (words << 2));
183
        // Set how many words to send
184
        HPD_TX_WORDS(words, base);
185
        words = 0;
186
      }
187
 
188
      // Start the transfer
189
      HPD_TX_START(base);
190
    }
191
}
192
 
193
void hpd_tx_send_copy(int daddr, int words, int haddr)
194
{
195
  hpd_tx_send_copy_gen(daddr, words, haddr, 0);
196
}
197
 
198
 
199
void hpd_rx_packet_init_gen(int chan, int daddr,
200
                            int words, int haddr, int iface)
201
{
202
  int base      = hpd_ifaces[iface].base_address;
203
  int rx_base   = hpd_ifaces[iface].rx_packets[chan].rx_base_address;
204
  int rx_size   = hpd_ifaces[iface].rx_packets[chan].rx_buffer_bytes;
205
  int rx_haddr  = hpd_ifaces[iface].rx_packets[chan].rx_hibi_address;
206
  int n_streams = hpd_ifaces[iface].n_stream_channels;
207
 
208
  // Set receive mem address for incoming data
209
  if(rx_base != daddr) {
210
    HPD_RX_MEM_ADDR(chan+n_streams, daddr, base);
211
    hpd_ifaces[iface].rx_packets[chan].rx_base_address = daddr;
212
  }
213
 
214
  // Set amount to receive
215
  if((rx_size >> 2) != words) {
216
    HPD_RX_WORDS(chan+n_streams, words, base);
217
    hpd_ifaces[iface].rx_packets[chan].rx_buffer_bytes = (words << 2);
218
  }
219
 
220
  // Set hibi address to receive data
221
  if(rx_haddr != haddr) {
222
    HPD_RX_HIBI_ADDR(chan+n_streams, haddr, base);
223
    hpd_ifaces[iface].rx_packets[chan].rx_hibi_address = haddr;
224
  }
225
 
226
  // Initialize receiving
227
  HPD_RX_INIT(chan+n_streams, base);
228
}
229
 
230
void hpd_rx_packet_init(int chan, int daddr, int words, int haddr)
231
{
232
  hpd_rx_packet_init_gen(chan, daddr, words, haddr, 0);
233
}
234
 
235
 
236
void hpd_rx_stream_init_gen(int chan, int daddr,
237
                            int words, int haddr, int iface)
238
{
239
  int base      = hpd_ifaces[iface].base_address;
240
  int rx_base   = hpd_ifaces[iface].rx_streams[chan].rx_base_address;
241
  int rx_size   = hpd_ifaces[iface].rx_streams[chan].rx_buffer_bytes;
242
  int rx_haddr  = hpd_ifaces[iface].rx_streams[chan].rx_hibi_address;
243
  hpd_ifaces[iface].rx_streams[chan].rx_read_words = 0;
244
 
245
  // Set receive mem address for incoming data
246
  if(rx_base != daddr) {
247
    HPD_RX_MEM_ADDR(chan, daddr, base);
248
    hpd_ifaces[iface].rx_streams[chan].rx_base_address = daddr;
249
  }
250
 
251
  // Set the length of the rx buffer in words
252
  if((rx_size >> 2) != words) {
253
    HPD_RX_WORDS(chan, words, base);
254
    hpd_ifaces[iface].rx_streams[chan].rx_buffer_bytes = (words << 2);
255
  }
256
 
257
  // Set hibi address to receive data
258
  if(rx_haddr != haddr) {
259
    HPD_RX_HIBI_ADDR(chan, haddr, base);
260
    hpd_ifaces[iface].rx_streams[chan].rx_hibi_address = haddr;
261
  }
262
 
263
  // Initialize receiving
264
  HPD_RX_INIT(chan, base);
265
}
266
 
267
 
268
void hpd_rx_stream_init(int chan, int daddr, int words, int haddr)
269
{
270
  hpd_rx_stream_init_gen(chan, daddr, words, haddr, 0);
271
}
272
 
273
 
274
void hpd_rx_packet_reinit_gen(int chan, int iface)
275
{
276
  int base      = hpd_ifaces[iface].base_address;
277
  int n_streams = hpd_ifaces[iface].n_stream_channels;
278
  // Initialize receiving
279
  HPD_RX_INIT(chan+n_streams, base);
280
}
281
 
282
 
283
void hpd_rx_packet_reinit(int chan)
284
{
285
  hpd_rx_packet_reinit_gen(chan, 0);
286
}
287
 
288
 
289
void hpd_rx_stream_reinit_gen(int chan, int iface)
290
{
291
  int base      = hpd_ifaces[iface].base_address;
292
  // Initialize receiving
293
  HPD_RX_INIT(chan, base);
294
}
295
 
296
 
297
void hpd_rx_stream_reinit(int chan)
298
{
299
  hpd_rx_stream_reinit_gen(chan, 0);
300
}
301
 
302
 
303
void hpd_rx_packet_read_gen(int chan, void* buffer, int iface)
304
{
305
  int rx_base = hpd_ifaces[iface].rx_packets[chan].rx_base_address;
306
  int rx_size = hpd_ifaces[iface].rx_packets[chan].rx_buffer_bytes;
307
  memcpy(buffer, (void*)rx_base, rx_size);
308
}
309
 
310
 
311
void hpd_rx_packet_read(int chan, void* buffer)
312
{
313
  hpd_rx_packet_read_gen(chan, buffer, 0);
314
}
315
 
316
 
317
void hpd_rx_packet_get_conf_gen(int chan, int* rx_base, int* rx_bytes,
318
                                int* rx_haddr, int iface)
319
{
320
  if(rx_base) {
321
    *rx_base = hpd_ifaces[iface].rx_packets[chan].rx_base_address;
322
  }
323
 
324
  if(rx_bytes) {
325
    *rx_bytes = hpd_ifaces[iface].rx_packets[chan].rx_buffer_bytes;
326
  }
327
 
328
  if(rx_haddr) {
329
    *rx_haddr = hpd_ifaces[iface].rx_packets[chan].rx_hibi_address;
330
  }
331
}
332
 
333
 
334
void hpd_rx_packet_get_conf(int chan, int* rx_base, int* rx_bytes,
335
                            int* rx_haddr)
336
{
337
  hpd_rx_packet_get_conf_gen(chan, rx_base, rx_bytes, rx_haddr, 0);
338
}
339
 
340
 
341
void hpd_rx_stream_get_conf_gen(int chan, int* rx_base, int* rx_bytes,
342
                                int* rx_haddr, int iface)
343
{
344
  if(rx_base) {
345
    *rx_base = hpd_ifaces[iface].rx_streams[chan].rx_base_address;
346
  }
347
 
348
  if(rx_bytes) {
349
    *rx_bytes = hpd_ifaces[iface].rx_streams[chan].rx_buffer_bytes;
350
  }
351
 
352
  if(rx_haddr) {
353
    *rx_haddr = hpd_ifaces[iface].rx_streams[chan].rx_hibi_address;
354
  }
355
}
356
 
357
 
358
void hpd_rx_stream_get_conf(int chan, int* rx_base, int* rx_bytes,
359
                            int* rx_haddr)
360
{
361
  hpd_rx_stream_get_conf_gen(chan, rx_base, rx_bytes, rx_haddr, 0);
362
}
363
 
364
 
365
int hpd_rx_packet_poll_gen(int chan, int iface)
366
{
367
  int rx_words  = hpd_ifaces[iface].rx_packets[chan].rx_buffer_bytes >> 2;
368
  int base      = hpd_ifaces[iface].base_address;
369
  int n_streams = hpd_ifaces[iface].n_stream_channels;
370
  int received;
371
  HPD_RX_GET_WORDS(received, chan+n_streams, base);
372
  if(rx_words == received)
373
    return 1;
374
  return 0;
375
}
376
 
377
 
378
int hpd_rx_packet_poll(int chan)
379
{
380
  return hpd_rx_packet_poll_gen(chan, 0);
381
}
382
 
383
 
384
int hpd_rx_stream_poll_gen(int chan, int iface)
385
{
386
  int base     = hpd_ifaces[iface].base_address;
387
  int received;
388
  HPD_RX_GET_WORDS(received, chan, base);
389
  return received;
390
}
391
 
392
 
393
int hpd_rx_stream_poll(int chan)
394
{
395
  return hpd_rx_stream_poll_gen(chan, 0);
396
}
397
 
398
 
399
void hpd_rx_stream_read_gen(int chan, int words, int* buffer, int iface)
400
{
401
  int base          = hpd_ifaces[iface].base_address;
402
  int rx_base       = hpd_ifaces[iface].rx_streams[chan].rx_base_address;
403
  int rx_size       = hpd_ifaces[iface].rx_streams[chan].rx_buffer_bytes;
404
  int rx_read_words = hpd_ifaces[iface].rx_streams[chan].rx_read_words;
405
 
406
  if(words > (rx_size >> 2) - rx_read_words) {
407
    memcpy((void*)buffer, (void*)rx_base + (rx_read_words << 2),
408
           rx_size - (rx_read_words << 2));
409
    memcpy((void*)buffer + (rx_size - (rx_read_words << 2)),
410
           (void*)rx_base, (words << 2) - (rx_size - (rx_read_words << 2)));
411
    hpd_ifaces[iface].rx_streams[chan].rx_read_words =
412
      words - (rx_size << 2) + rx_read_words;
413
  }
414
  else {
415
    memcpy((void*)buffer, (void*)rx_base + (rx_read_words << 2), (words << 2));
416
    hpd_ifaces[iface].rx_streams[chan].rx_read_words =
417
      (rx_read_words + words) %  (rx_size >> 2);
418
  }
419
  HPD_RX_WORDS(chan, words, base);
420
}
421
 
422
 
423
void hpd_rx_stream_read(int chan, int words, int* buffer)
424
{
425
  hpd_rx_stream_read_gen(chan, words, buffer, 0);
426
}
427
 
428
 
429
void hpd_rx_stream_ack_gen(int chan, int words, int iface)
430
{
431
  int base = hpd_ifaces[iface].base_address;
432
  HPD_RX_WORDS(chan, words, base);
433
}
434
 
435
 
436
void hpd_rx_stream_ack(int chan, int words)
437
{
438
  hpd_rx_stream_ack_gen(chan, words, 0);
439
}
440
 
441
 
442
void hpd_irq_enable_gen(int iface)
443
{
444
  int base = hpd_ifaces[iface].base_address;
445
  HPD_IRQ_ENA(base);
446
}
447
 
448
 
449
void hpd_irq_enable()
450
{
451
  hpd_irq_enable_gen(0);
452
}
453
 
454
 
455
void hpd_irq_disable_gen(int iface)
456
{
457
  int base = hpd_ifaces[iface].base_address;
458
  HPD_IRQ_DIS(base);
459
}
460
 
461
 
462
void hpd_irq_disable()
463
{
464
  hpd_irq_disable_gen(0);
465
}
466
 
467
 
468
void hpd_irq_packet_ack_gen(int chan, int iface)
469
{
470
  int base      = hpd_ifaces[iface].base_address;
471
  int n_streams = hpd_ifaces[iface].n_stream_channels;
472
  HPD_CLEAR_IRQ_REG(chan+n_streams, base);
473
}
474
 
475
 
476
void hpd_irq_packet_ack(int chan)
477
{
478
  hpd_irq_packet_ack_gen(chan, 0);
479
}
480
 
481
 
482
void hpd_irq_stream_ack_gen(int chan, int iface)
483
{
484
  int base = hpd_ifaces[iface].base_address;
485
  HPD_CLEAR_IRQ_CHAN(chan, base);
486
}
487
 
488
 
489
void hpd_irq_stream_ack(int chan)
490
{
491
  hpd_irq_stream_ack_gen(chan, 0);
492
}
493
 
494
 
495
int hpd_irq_get_vector_gen(int iface)
496
{
497
  int base = hpd_ifaces[iface].base_address;
498
  int vector;
499
  HPD_GET_IRQ_REG(vector, base);
500
  return vector;
501
}
502
 
503
 
504
int hpd_irq_get_vector()
505
{
506
  return hpd_irq_get_vector_gen(0);
507
}
508
 
509
 
510
void hpd_irq_clear_vector_gen(int mask, int iface)
511
{
512
  int base = hpd_ifaces[iface].base_address;
513
  HPD_CLEAR_IRQ_REG(mask, base);
514
}
515
 
516
 
517
void hpd_irq_clear_vector(int mask)
518
{
519
  hpd_irq_clear_vector_gen(mask, 0);
520
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.