New Revision: https://docs.blackfin.uclinux.org/doku.php?id=protocols:icc
Old Revision: https://docs.blackfin.uclinux.org/doku.php?id=protocols:icc&rev=1467344484
Edit Summary: [Dispatch packet]
@@ -1390,8 +1390,9 @@
Bare metal application is loaded by user space loader into core B memory space. The main and disatch entries in application and its dsp_bridge library are figured out by the loader. The loader informs the dsp_driver of these entry address.
==== Dispatch packet ====
+ {{:protocols:icc_layer1.png|}}
**icc session layer manage the user space packet send/recv session**
the sm_session data structure:
@@ -1413,11 +1414,14 @@
wait_queue_head_t rx_wait;
} __attribute__((__aligned__(4)));
</code>
+ if the icc queue is full, packet send will be blocked on icc queue tx_wait wait queue until the tx queue is not full.
- **message_queue_thread**
+ packet receive will blocked on session's rx_wait queue if there's no available message, until the ipi wait up the icc queue thread to hanle incoming message, receive the message to packet and wakeup the packet recv process sleeping on rx_wait queue.
+ **message_queue_thread**
+ kernel thread to handle incoming msg, the remote ipi will wakeup this thread.
**On core running Linux**
* To send a packet in application , the packet buffer should be allocated in user space first. Its pointer then is passed to the kernel system call. Kernel code also allocates a buffer in kernel space and copies the user data in. After that, the dsp bridge driver appends a packet ready message with packet address and length to the shared message queue in L2 memory and link the packet buffer to the sent list.
|