You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by "CV-Bowen (via GitHub)" <gi...@apache.org> on 2024/09/14 12:25:53 UTC

[PR] New Rpmsg Transports: Rpmsg Port SPI, Rpmsg Port Uart and Rpmsg Router Transport Support [nuttx]

CV-Bowen opened a new pull request, #13460:
URL: https://github.com/apache/nuttx/pull/13460

   ## Summary
   Three new rpsmg transport layers support:
   - Rpmsg Port SPI
   - Rpmsg Port UART
   - Rpmsg Router
   
   1.    rpmsg_port_spi: set mreq to high to trigger next transmission
       
       rpmsg_port_spi_connect can not be used here because peer may have not finished
       the last transmission which will keep the sreq gpio in high level, and it will
       read an error data frame.
       
   2.    rpmsg_port_spi/slave: reorder rpmsg_port_initialize and rpmsg_port_spi_init hardware
       
       Because the data transmision may has been started before
       rpmsg_port_initialize(), this should be not allowed.
   
   3.    rpmsg_port_spi: add pending logic for rpmsg port spi
       
       To handle the situation that there is a req from peer side when
       current transfer is not finished.
   
   4.    rpmsg_port_spi: add nbits to spicfg
       
       Support more spi config paramters for Rpmsg Port SPI/SPI Slave
   
   5.    rpmsg_port_spi: discard messages when disconnected
       
       Disconnected logic optimization
   
   6.    drivers/rpmsg: Add edge_create and edge_destroy for router
       
       use cmd to notify the other cpu to destroy router edge device,
       and dont destroy the other cpu's "router:ept"
   
   7.    rpmsg/rpmsg_port_uart: add rpmsg uart port driver
       
       Rpmsg Port Uart is a new rpmsg transport layer.
       Just like the rpmsg port spi, the difference is that the physical
       communication method changed from SPI to UART.
   
   8.    rpmsg_port_spi: add spi slave support
       
       The rpmsg port spi slave version support
   
   9.    rpmsg_port_spi: add get_local_cpuname api
       
       add get_local_cpuname ops for rpmsg_port_spi
   
   10.    rpmsg_port_spi:init cs gpio to be low
       
       Transfer will be failure when the cs gpio status is low before
       the first transfer.
   
   11.    drivers/rpmsg: Add get_local_cpuname in router
       
       get_local_cpuname ops support for rpmsg router
   
   12.    rpmsg_port_spi: do not decrease when rx avail is already 0
       
       Bug fix about the rpmsg port spi
   
   13.    drivers/rpmsg: Use optimal rx size and tx size
       
       Use the minimal tx and rx size form two edge cpu to maintain
       the transmit buffer size not exceed the edge cpus' buffer size.
       
       [edg0] tx <---> rx0 [hub] rx1 <---> tx [edge1]
              rx <---> tx0       tx1 <---> rx
       
       edge0_tx = min(rx0, tx1);
       edge0_rx = min(tx0, rx1);
       
       edge1_tx = min(rx1, tx0);
       edge1_rx = min(tx1, rx0);
   
   14.    drivers/rpmsg: add get_local_cpuname to rpmsg ops
       
       Add get_local_cpuname to the rpmsg framework ops to support communicate
       with the same remote core with multi rpmsg transport.
       
       Some rpmsg services will send local cpu name to remote core and then let
       remote core to connect local core by using this cpu name, when there are
       multi rpmsg channels with same remote core, the remote core may connect
       to incorrect core, so use the error rpmsg channel.
       
       For example, there are two rpmsg channels between ap and audio:
       
       ap core                     audio core
        [ap1] <-- rpmsg virtio1 --> [audio1]
        [ap2] <-- rpmsg virtio2 --> [audio2]
       
       When we want to use the rpmsg virtio1 to communicate, ap core may send
       local cpuname "ap2" to audio, so the audio core use remote cpu "ap2" to
       connect with ap, and resulting in the use of incorrect rpmsg channel.
   
   15.    drivers/rpmsg: Use tx buffer size as payload length
       
       Directly use tx length received from hub as the tx payload length.
   
   16.    drivers/rpmsg: add rpmsg router support
       
       Rpmsg Router is new rpmsg transport layer, it can router the rpmsg
       messages to a cpu that not directly connected with local cpu by Rpmsg,
       For the rpmsg services, it is as if there is a real Rpmsg Channel between
       the local cpu and the remote cpu.
       
       For examples, there are three cpus: ap, cp and audio.
       ap and cp, ap and audio has share memory and be connected by Rpmsg VirtIO,
       so ap and cp, ap and audio can communicate with each other by Rpmsg, but
       cp can not communicate with audio direclty.
       
       [cp] <-- rpmsg virtio --> [ap] <-- rpmsg virtio --> [audio]
       
       With rpmsg router, the cp can communicate with audip by Rpmsg dereclty because
       the router in ap will forward the rpmsg message from cp/audio to audio/cp, like
       this:
       
        +<----- rpmsg router --> hub  <-- rpmsg router ------>+
        |                         |                           |
       [cp] <-- rpmsg virtio --> [ap] <-- rpmsg virtio --> [audio]
       
   17.    rpmsg/rpmsg_port: judge notify_rx_free and notify_tx_ready before calling
       
       Some lower layers do not need implement these two operations, so judge
       them before calling.
   
   18.    rpmsg/Kconfig: move RPMSG_PORT outside RPMSG and select RPMSG direclty
       
       All the RPMSG transport should direcly select the RPMSG like RPMSG_VIRTIO
       does.
   
   19.    rpmsg_port_spi: add spi transport layer
       
       Add Rpmsg-Port-SPI transport layer.
       Rpmsg Port SPI is a new rpmsg transport layer based on the Rpmsg Port,
       it provides the capability for two SPI-connected (and two extra GPIO)
       chips to communicate with each other using Rpmsg.
       
       All already implemented Rpmsg Services can be used with this new transport
       layer without any modifications.
   
   20.    rpmsg_port:reduce len and avail of rpmsg_port_header_s to uint16_t
       
       uint16_t is enough and more suitable
   
   21.    rpmsg_port:add rpmsg_port_queue_nused api
       
       Add nused api for lower layer to get the used buffer number
   
   22.    rpmsg: add physical transport layer support
       
       Rpmsg Physical Transport Layer is a new rpmsg transport, it's a
       common part for the physical communication based rpmsg transport
       layers such as Rpmsg-SPI and Rpmsg-Uart.
       
       It implements three common parts:
       1. Implement the NuttX and OpenAMP rpmsg frameworks' ops and the
       rpmsg name service;
       2. The buffer management and provide some APIs to lower layer to use;
   
   ## Impact
   New features
   
   ## Testing
   Testing in Vela Project.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] New Rpmsg Transports: Rpmsg Port SPI, Rpmsg Port Uart and Rpmsg Router Transport Support [nuttx]

Posted by "xiaoxiang781216 (via GitHub)" <gi...@apache.org>.
xiaoxiang781216 merged PR #13460:
URL: https://github.com/apache/nuttx/pull/13460


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org